MySQL开启SSL的利与弊
最近,準備升級一組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.pemdba:(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文件的所屬權限用戶為mysqlchown?-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方式;
總結
以上是生活随笔為你收集整理的MySQL开启SSL的利与弊的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle:容器数据库简介
- 下一篇: Sqlserver系统数据库和用户数据库