最近,準(zhǔn)備升級(jí)一組MySQL到5.7版本,在安裝完MySQL5.7后,在其data目錄下發(fā)現(xiàn)多了很多.pem類(lèi)型的文件,然后通過(guò)查閱相關(guān)資料,才知這些文件是MySQL5.7使用SSL加密連接的。本篇主要介紹MySQL5.7 SSL連接加密功能、如何使用?以及使用SSL的一些注意點(diǎn)。

我們知道,MySQL5.7之前版本,安全性做的并不夠好,比如安裝時(shí)生成的root空密碼賬號(hào)、存在任何用戶(hù)都能連接上的test庫(kù)等,導(dǎo)致數(shù)據(jù)庫(kù)存在較大的安全隱患。好在5.7版本對(duì)以上問(wèn)題進(jìn)行了一一修復(fù)。與此同時(shí),MySQL 5.7版本還提供了更為簡(jiǎn)單SSL安全訪問(wèn)配置,且默認(rèn)連接就采用SSL的加密方式,這讓數(shù)據(jù)庫(kù)的安全性提高一個(gè)層次。

一、SSL介紹

SSL(Secure Socket Layer:安全套接字層)利用數(shù)據(jù)加密、身份驗(yàn)證和消息完整性驗(yàn)證機(jī)制,為基于TCP等可靠連接的應(yīng)用層協(xié)議提供安全性保證。

SSL協(xié)議提供的功能主要有:

           1、 數(shù)據(jù)傳輸?shù)臋C(jī)密性:利用對(duì)稱(chēng)密鑰算法對(duì)傳輸?shù)臄?shù)據(jù)進(jìn)行加密。
           2.、身份驗(yàn)證機(jī)制:基于證書(shū)利用數(shù)字簽名方法對(duì)服務(wù)器和客戶(hù)端進(jìn)行身份驗(yàn)證,其中客戶(hù)端的身份驗(yàn)證是可選的。
           3、 消息完整性驗(yàn)證:消息傳輸過(guò)程中使用MAC算法來(lái)檢驗(yàn)消息的完整性。

如果用戶(hù)的傳輸不是通過(guò)SSL的方式,那么其在網(wǎng)絡(luò)中數(shù)據(jù)都是以明文進(jìn)行傳輸?shù)?,而這給別有用心的人帶來(lái)了可乘之機(jī)。所以,現(xiàn)在很多大型網(wǎng)站都開(kāi)啟了SSL功能。同樣地,在我們數(shù)據(jù)庫(kù)方面,如果客戶(hù)端連接服務(wù)器獲取數(shù)據(jù)不是使用SSL連接,那么在傳輸過(guò)程中,數(shù)據(jù)就有可能被竊取。

二、MySQL5.7 SSL配置和啟用

1、安裝時(shí)啟動(dòng)SSL 

在MySQL5.7安裝初始化階段,我們發(fā)現(xiàn)比之前版本多了一步操作,而這個(gè)操作就是安裝SSL的。

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

當(dāng)運(yùn)行完這個(gè)命令后,默認(rèn)會(huì)在data_dir目錄下生成以下pem文件,這些文件就是用于啟用SSL功能的:

Android培訓(xùn),安卓培訓(xùn),手機(jī)開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

# ll rwrwrrwrrw#客戶(hù)端連接服務(wù)器端需要提供的私鑰文件
-rw    #私鑰/公鑰對(duì)的私有成員
rwr     #私鑰/公鑰對(duì)的共有成員
rwr    #服務(wù)器端證書(shū)文件
rw

Android培訓(xùn),安卓培訓(xùn),手機(jī)開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

 這時(shí)從數(shù)據(jù)庫(kù)服務(wù)器本地進(jìn)入MySQL命令行,你可以看到如下變量值:

Android培訓(xùn),安卓培訓(xùn),手機(jī)開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

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用戶(hù)是采用SSL連接到mysql服務(wù)器上的,如果不是ssl,那么會(huì)顯示“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

Android培訓(xùn),安卓培訓(xùn),手機(jī)開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

【注意】:如果用戶(hù)是采用本地localhost或者sock連接數(shù)據(jù)庫(kù),那么不會(huì)使用SSL方式了。

2、如果安裝MySQL57時(shí)沒(méi)有運(yùn)行過(guò)mysql_ssl_rsa_setup,那么如何開(kāi)啟SSL呢?

1)、關(guān)閉MySQL服務(wù)2)、運(yùn)行mysql_ssl_rsa_setup 命令3)、到data_dir目錄下修改.pem文件的所屬權(quán)限用戶(hù)為mysql
    chown -R mysql.mysql *.pem4)、啟動(dòng)MySQL服務(wù)

3、強(qiáng)制某用戶(hù)必須使用SSL連接數(shù)據(jù)庫(kù)

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

對(duì)于上面強(qiáng)制使用ssl連接的用戶(hù),如果不是使用ssl連接的就會(huì)報(bào)錯(cuò),像下面這樣:

[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安全性對(duì)比

【測(cè)試方式】在MySQL服務(wù)器端通過(guò)tshark抓包的方式來(lái)模擬竊取數(shù)據(jù)。驗(yàn)證、對(duì)比未使用SSL和使用SSL兩者在安全性上有什么不同?

    1 未使用SSL情況:

         在客戶(hù)端機(jī)器(10.126.126.161)上連接數(shù)據(jù)庫(kù)并進(jìn)行insert操作,使用--ssl-mode=DISABLED關(guān)閉SSL

Android培訓(xùn),安卓培訓(xùn),手機(jī)開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

          同時(shí)在MySQL服務(wù)器端(10.126.126.160)上用tshark進(jìn)行抓包:

Android培訓(xùn),安卓培訓(xùn),手機(jī)開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

【結(jié)論】未使用SSL情況下,在數(shù)據(jù)庫(kù)服務(wù)器端可以通過(guò)抓包的方式獲取數(shù)據(jù),安全性不高。

    2 采用SSL情況:   

      在客戶(hù)端機(jī)器(10.126.126.161)上連接數(shù)據(jù)庫(kù)并進(jìn)行insert操作,使用--ssl-mode=REQUIRED指定SSL

Android培訓(xùn),安卓培訓(xùn),手機(jī)開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

      同時(shí)在MySQL服務(wù)器端(10.126.126.160)上再次用tshark進(jìn)行抓包:

Android培訓(xùn),安卓培訓(xùn),手機(jī)開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

【結(jié)論】沒(méi)有抓到該語(yǔ)句,采用SSL加密后,tshark抓不到數(shù)據(jù),安全性高。

 

四、使用SSL前后性能對(duì)比(QPS)

服務(wù)器配置:CPU:32核心       內(nèi)存:128G      磁盤(pán):SSD

為了盡量準(zhǔn)確測(cè)試QPS,采用全內(nèi)存查詢(xún),因?yàn)槲覀兙€上熱點(diǎn)數(shù)據(jù)基本都在內(nèi)存中;按照并發(fā)線程數(shù)分類(lèi):1線程、4線程、8線程、16線程、24線程、32線程、64線程;

Android培訓(xùn),安卓培訓(xùn),手機(jī)開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

具體數(shù)據(jù)如下:

Android培訓(xùn),安卓培訓(xùn),手機(jī)開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

從測(cè)試數(shù)據(jù)可以發(fā)現(xiàn),開(kāi)啟SSL后,數(shù)據(jù)庫(kù)QPS平均降低了23%左右,相對(duì)還是比較影響性能的。從SSL實(shí)現(xiàn)方式來(lái)看,建立連接時(shí)需要進(jìn)行握手、加密、解密等操作。所以耗時(shí)基本都在建立連接階段,這對(duì)于使用短鏈接的應(yīng)用程序可能產(chǎn)生更大的性能損耗,比如采用PHP開(kāi)發(fā)。不過(guò)如果使用連接池或者長(zhǎng)連接可能會(huì)好許多。

五、總結(jié)

1、MySQL5.7默認(rèn)是開(kāi)啟SSL連接,如果強(qiáng)制用戶(hù)使用SSL連接,那么應(yīng)用程序的配置也需要明確指定SSL相關(guān)參數(shù),否則程序會(huì)報(bào)錯(cuò)。

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

      2.1、對(duì)于非常敏感核心的數(shù)據(jù),或者QPS本來(lái)就不高的核心數(shù)據(jù),可以采用SSL方式保障數(shù)據(jù)安全性;

      2.2、對(duì)于采用短鏈接、要求高性能的應(yīng)用,或者不產(chǎn)生核心敏感數(shù)據(jù)的應(yīng)用,性能和可用性才是首要,建議不要采用SSL方式;

http://www.cnblogs.com/mysql-dba/p/7061300.html