程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL的SSL加密連接與性能開銷,mysqlssl加密開銷

MySQL的SSL加密連接與性能開銷,mysqlssl加密開銷

編輯:MySQL綜合教程

MySQL的SSL加密連接與性能開銷,mysqlssl加密開銷


前言 在生產環境下,安全總是無法忽視的問題,數據庫安全則是重中之重,因為所有的數據都存放在數據庫中。MySQL在5.7版本之前對於安全問題的確考慮並不充分,導致存在比較大的隱患,比如下面的這些問題,可能有些小伙伴知道,有些卻還不知道:

  • MySQL數據庫默認安裝的用戶密碼為空
  • 所有用戶擁有對於MySQL默認安裝test數據庫的訪問權限(即使沒有授予權限)

好在Oracle官方也已經意識到安全的重要性,MySQL 5.7開始安裝完成後的root用戶的密碼不再是空,而是在安裝時隨機產生一個密碼,這也導致了用戶安裝5.7時發現的與5.6版本比較大的一個不同點。其次,官方已經刪除了test數據庫,默認安裝完後是沒有test數據庫的。更為重要的是,MySQL 5.7版本提供了更為簡單SSL安全訪問配置,並且默認連接就采用SSL的加密方式。
何為SSL 下載地址首先看下維基百科是如何定義SSL的:

引用 Transport Layer Security (TLS) and its predecessor, Secure Sockets Layer (SSL), both of which are frequently referred to as 'SSL', are cryptographic protocols designed to provide communications security over a computer network.

從上面的定義來看,SSL指的是SSL/TLS,其是一種為了在計算機網絡進行安全通信的加密協議。假設用戶的傳輸不是通過SSL的方式,那麼其在網絡中以明文的方式進行傳輸,而這給別有用心的人帶來了可乘之機。所以,現在很多網站其實默認已經開啟了SSL功能,比如Facebook、Twtter、YouTube、淘寶等。

在數據庫領域,之前Inside君去某公司做技術交流時,該公司介紹其運維平台能夠對一些敏感字段做處理,比如取出的密碼或資金數據用***來表示,那麼DBA就無法看到這部分的私人數據內容。這本身是一個很不錯的安全處理方式,但若DBA在本地裝一個類似tcpdump的工具,則依然能夠通過獲取得到的包得到想要的數據。因此,除了在程序端進行展示的安全處理,還需在MySQL服務器端開啟安全的加密通信功能,這時就是SSL發揮功能的時候了。
3.MySQL 5.7的SSL配置與使用 如果仔細閱讀MySQL 5.7的安裝文檔INSTALL-BINARY,會發現5.7的安裝文檔在初始化數據目錄之後還額外多做了一個操作,這是之前版本所沒有的操作,而該步驟即是對於SSL的安裝與配置:

Java代碼 復制代碼
  1. ......  
  2. shell> bin/mysqld --initialize --user=mysql  
  3. shell> bin/mysql_ssl_rsa_setup    
  4. ......            
......
shell> bin/mysqld --initialize --user=mysql
shell> bin/mysql_ssl_rsa_setup  
......          

運行完命令mysql_ssl_rsa_setup後會發現數據目錄下多出了一些以pem結尾的文件,而這些文件就是開啟SSL連接所需要的文件:

Java代碼 復制代碼
  1. root@test-1:/usr/local/mysql/data# ls -lh *.pem  
  2. -rw------- 1 mysql mysql 1.7K Nov 25 14:12 ca-key.pem  
  3. -rw-r--r-- 1 mysql mysql 1.1K Nov 25 14:12 ca.pem  
  4. -rw-r--r-- 1 mysql mysql 1.1K Nov 25 14:12 client-cert.pem  
  5. -rw------- 1 mysql mysql 1.7K Nov 25 14:12 client-key.pem  
  6. -rw------- 1 mysql mysql 1.7K Nov 25 14:12 private_key.pem  
  7. -rw-r--r-- 1 mysql mysql  451 Nov 25 14:12 public_key.pem  
  8. -rw-r--r-- 1 mysql mysql 1.1K Nov 25 14:12 server-cert.pem  
  9. -rw------- 1 mysql mysql 1.7K Nov 25 14:12 server-key.pem  
root@test-1:/usr/local/mysql/data# ls -lh *.pem
-rw------- 1 mysql mysql 1.7K Nov 25 14:12 ca-key.pem
-rw-r--r-- 1 mysql mysql 1.1K Nov 25 14:12 ca.pem
-rw-r--r-- 1 mysql mysql 1.1K Nov 25 14:12 client-cert.pem
-rw------- 1 mysql mysql 1.7K Nov 25 14:12 client-key.pem
-rw------- 1 mysql mysql 1.7K Nov 25 14:12 private_key.pem
-rw-r--r-- 1 mysql mysql  451 Nov 25 14:12 public_key.pem
-rw-r--r-- 1 mysql mysql 1.1K Nov 25 14:12 server-cert.pem
-rw------- 1 mysql mysql 1.7K Nov 25 14:12 server-key.pem

若這時啟動MySQL數據庫並啟動應該可以發現如下狀態:

Java代碼 復制代碼
  1. mysql>SHOW VARIABLES LIKE 'have_ssl';  
  2. +---------------+-------+  
  3. | Variable_name | Value |  
  4. +---------------+-------+  
  5. | have_ssl          | YES     |  
  6. +---------------+-------+  
  7. 1 row in set (0.00 sec)  
mysql>SHOW VARIABLES LIKE 'have_ssl';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| have_ssl          | YES     |
+---------------+-------+
1 row in set (0.00 sec)

該參數表示MySQL服務器開啟了SSL功能,而在MySQL 5.7版本下默認就會使用SSL的方式來進行連接,比如:

Java代碼 復制代碼
  1. root@test-1:~# mysql -h10.166.224.32 -udavid  
  2. mysql> \s  
  3. --------------  
  4. mysql  Ver 14.14 Distrib 5.7.9, for linux-glibc2.5 (x86_64) using  EditLine wrapper  
  5.   
  6. Connection id:      6119  
  7. Current database:     
  8. Current user:       [email protected]  
  9. SSL:            Cipher in use is DHE-RSA-AES256-SHA  
  10. ......  
root@test-1:~# mysql -h10.166.224.32 -udavid
mysql> \s
--------------
mysql  Ver 14.14 Distrib 5.7.9, for linux-glibc2.5 (x86_64) using  EditLine wrapper

Connection id:		6119
Current database:	
Current user:		[email protected]
SSL:			Cipher in use is DHE-RSA-AES256-SHA
......

通過STATUS的SSL列就能判斷連接的用戶是否使用了SSL,比如上述例子中的Cipher in use is DHE-RSA-AES256-SHA就表示當前david用戶是通過SSL的方式進行連接。若在創建用戶時,希望該用戶每次必須通過SSL方式,則需在創建用戶通過REQUIRE SSL來進行設置,對於上述的david用戶,可以通過如下方式來進行修改以確保每次通過SSL進行連接,強制不使用SSL進行連接則報錯:

Java代碼 復制代碼
  1. mysql> ALTER USER david@'%' REQUIRE SSL;  
  2. ......  
  3. root@test-1:~# mysql -h10.166.224.32 -udavid --ssl=0  
  4. ERROR 1045 (28000): Access denied for user 'david'@'10.166.224.32' (using password: YES)  
mysql> ALTER USER david@'%' REQUIRE SSL;
......
root@test-1:~# mysql -h10.166.224.32 -udavid --ssl=0
ERROR 1045 (28000): Access denied for user 'david'@'10.166.224.32' (using password: YES)

MySQL 5.6同樣支持以SSL的方式進行連接,但是操作相對5.7較為復雜,用戶需要自己通過openssl命令來創建各類公密鑰,具體可以查看相關官方文檔。
SSL性能測試 相信很多小伙伴關心開啟SSL加密連接後的性能表現,不可否認的是啟用SSL加密連接後,性能必然會有下降。這裡的測試采用全內存SELECT主鍵的方式,因此可以認為是最壞情況的SSL性能開銷:

上述的測試是在Inside君的雲主機環境下,雲主機配置只有4核CPU,故QPS值整體不高,但是應該能夠發現開啟SSL後的性能開銷在25%左右。
另外,由於SSL開銷較大的環節在建立連接,所以短鏈接的開銷可能會更大,因此推薦使用長連接或者連接池的方式來減小SSL所帶來的額外開銷,不過好在MySQL的應用習慣大部分也是長連接的方式。
總結 1.MySQL 5.7配置SSL要比5.6來的簡單的多 2.MySQL 5.7客戶端默認開啟SSL加密連接 3.通常來說,開啟SSL加密連接後,性能最大的開銷在25%左右

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved