最近,準(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功能的:
# ll rwrwrrwrrw#客戶(hù)端連接服務(wù)器端需要提供的私鑰文件 -rw #私鑰/公鑰對(duì)的私有成員 rwr #私鑰/公鑰對(duì)的共有成員 rwr #服務(wù)器端證書(shū)文件 rw
這時(shí)從數(shù)據(jù)庫(kù)服務(wù)器本地進(jìn)入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用戶(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
【注意】:如果用戶(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
同時(shí)在MySQL服務(wù)器端(10.126.126.160)上用tshark進(jì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
同時(shí)在MySQL服務(wù)器端(10.126.126.160)上再次用tshark進(jì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線程;
具體數(shù)據(jù)如下:
從測(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