MySQL開啟SSL的利與弊

zhcunique發表於2021-07-06

最近,準備升級一組MySQL到5.7版本,在安裝完MySQL5.7後,在其data目錄下發現多了很多.pem型別的檔案,然後通過查閱相關資料,才知這些檔案是MySQL5.7使用SSL加密連線的。本篇主要介紹MySQL5.7 SSL連線加密功能、如何使用?以及使用SSL的一些注意點。

我們知道,MySQL5.7之前版本,安全性做的並不夠好,比如安裝時生成的root空密碼賬號、存在任何使用者都能連線上的test庫等,導致資料庫存在較大的安全隱患。好在5.7版本對以上問題進行了一一修復。與此同時,MySQL 5.7版本還提供了更為簡單SSL安全訪問配置,且預設連線就採用SSL的加密方式,這讓資料庫的安全性提高一個層次。

一、SSL介紹

SSL(Secure Socket Layer:安全套接字層)利用資料加密、身份驗證和訊息完整性驗證機制,為基於TCP等可靠連線的應用層協議提供安全性保證。

SSL協議提供的功能主要有:

           1、 資料傳輸的機密性:利用對稱金鑰演算法對傳輸的資料進行加密。
           2.、身份驗證機制:基於證照利用數字簽名方法對伺服器和客戶端進行身份驗證,其中客戶端的身份驗證是可選的。
           3、 訊息完整性驗證:訊息傳輸過程中使用MAC演算法來檢驗訊息的完整性。

如果使用者的傳輸不是通過SSL的方式,那麼其在網路中資料都是以明文進行傳輸的,而這給別有用心的人帶來了可乘之機。所以,現在很多大型網站都開啟了SSL功能。同樣地,在我們資料庫方面,如果客戶端連線伺服器獲取資料不是使用SSL連線,那麼在傳輸過程中,資料就有可能被竊取。

二、MySQL5.7 SSL配置和啟用

1、安裝時啟動SSL 

在MySQL5.7安裝初始化階段,我們發現比之前版本多了一步操作,而這個操作就是安裝SSL的。

shell> bin/mysqld --initialize --user=mysql    # MySQL 5.7.6 and upshell> bin/mysql_ssl_rsa_setup                 # MySQL 5.7.6 and up

當執行完這個命令後,預設會在data_dir目錄下生成以下pem檔案,這些檔案就是用於啟用SSL功能的:

# ll rwrwrrwrrw#客戶端連線伺服器端需要提供的私鑰檔案
-rw    #私鑰/公鑰對的私有成員
rwr     #私鑰/公鑰對的共有成員
rwr    #伺服器端證照檔案
rw

 這時從資料庫伺服器本地進入MySQL命令列,你可以看到如下變數值:

root> mysql -h 10.126.xxx.xxx -udba -p
dba:(none) show global variables   Variable_name  Value            have_openssl   YES                         ssl_ca         ca.pem           ssl_capath                      ssl_cert       servercert.pem  ssl_cipher                      ssl_crl                         ssl_crlpath                     ssl_key        server.pem

dba:(none)> \s
--------------
/usr/local/mysql/bin/mysql  Ver 14.14 Distrib 5.7.18, for linux-glibc2.5 (x86_64) using  EditLine wrapper

Connection id:          2973
Current database:
Current user:           dba@10.126.xxx.xxx
SSL:                    Cipher in use is DHE-RSA-AES256-SHA #表示該dba使用者是採用SSL連線到mysql伺服器上的,如果不是ssl,那麼會顯示“Not in use“
Current pager:          more
Using outfile:          ''
Using delimiter:        ;
Server version:         5.7.18-log MySQL Community Server (GPL)
Protocol version:       10
Connection:             10.126.126.160 via TCP/IP
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
TCP port:               3306
Uptime:                 2 hours 35 min 48 sec

【注意】:如果使用者是採用本地localhost或者sock連線資料庫,那麼不會使用SSL方式了。

2、如果安裝MySQL57時沒有執行過mysql_ssl_rsa_setup,那麼如何開啟SSL呢?

1)、關閉MySQL服務2)、執行mysql_ssl_rsa_setup 命令3)、到data_dir目錄下修改.pem檔案的所屬許可權使用者為mysql
    chown -R mysql.mysql *.pem4)、啟動MySQL服務

3、強制某使用者必須使用SSL連線資料庫

#修改已存在使用者 
ALTER USER 'dba'@'%' REQUIRE SSL;
#新建必須使用SSL使用者grant select on *.* to 'dba'@'%' identified by 'xxx' REQUIRE SSL;

對於上面強制使用ssl連線的使用者,如果不是使用ssl連線的就會報錯,像下面這樣:

[root]# /usr/local/mysql/bin/mysql -udba -p -h10.126.xxx.xxx --ssl=0Enter password: 
ERROR 1045 (28000): Access denied for user 'dba'@'10.126.xxx.xxx' (using password: YES)

三、未使用SSL和使用SSL安全性對比

【測試方式】在MySQL伺服器端通過tshark抓包的方式來模擬竊取資料。驗證、對比 未使用SSL和使用SSL兩者在安全性上有什麼不同?

    1 未使用SSL情況:

          在客戶端機器(10.126.126.161)上連線資料庫並進行insert操作,使用--ssl-mode=DISABLED關閉SSL

          同時在MySQL伺服器端(10.126.126.160)上用tshark進行抓包:

【結論】未使用SSL情況下,在資料庫伺服器端可以通過抓包的方式獲取資料,安全性不高。

    2 採用SSL情況:    

       在客戶端機器(10.126.126.161)上連線資料庫並進行insert操作, 使用--ssl-mode=REQUIRED指定SSL

       同時在MySQL伺服器端(10.126.126.160)上再次用tshark進行抓包:

【結論】沒有抓到該語句,採用SSL加密後,tshark抓不到資料,安全性高。

 

四、 使用SSL前後效能對比(QPS)

伺服器配置:CPU:32核心       記憶體:128G      磁碟:SSD

為了儘量準確測試QPS,採用全記憶體查詢,因為我們線上熱點資料基本都在記憶體中;按照併發執行緒數分類:1執行緒、4執行緒、8執行緒、16執行緒、24執行緒、32執行緒、64執行緒;

具體資料如下:

從測試資料可以發現,開啟SSL後,資料庫QPS平均降低了23%左右,相對還是比較影響效能的。從SSL實現方式來看,建立連線時需要進行握手、加密、解密等操作。所以耗時基本都在建立連線階段,這對於使用短連結的應用程式可能產生更大的效能損耗,比如採用PHP開發。不過如果使用連線池或者長連線可能會好許多。

五、總結

1、MySQL5.7預設是開啟SSL連線,如果強制使用者使用SSL連線,那麼應用程式的配置也需要明確指定SSL相關引數,否則程式會報錯。

2、雖然SSL方式使得安全性提高了,但是相對地使得QPS也降低23%左右。所以要謹慎選擇:

      2.1、對於非常敏感核心的資料,或者QPS本來就不高的核心資料,可以採用SSL方式保障資料安全性;

      2.2、對於採用短連結、要求高效能的應用,或者不產生核心敏感資料的應用,效能和可用性才是首要,建議不要採用SSL方式;

整理自: 部落格園使用者茁壯的小草

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69994536/viewspace-2779926/,如需轉載,請註明出處,否則將追究法律責任。

相關文章