如何為MySQL服務器和客戶機啟用SSL?
在MySQL服務器中實施SSL可以加密在服務器與客戶機之間來回傳輸的所有數據,因而防止廣域網或數據中心里面可能出現的竊聽或數據嗅探行為。此外,SSL還通過SSL證書提供了身份...
用戶想要與MySQL服務器建立一條安全連接時,常常依賴VPN隧道或SSH隧道。不過,獲得MySQL連接的另一個辦法是,啟用MySQL服務器上的SSL封裝器(SSL wrapper)。這每一種方法各有其優缺點。比如說,在出現多條短時間MySQL連接的高度動態環境下,VPN或SSH隧道也許是比SSL更好的選擇,因為后者建立每條連接時需要成本高昂的SSL握手計算。另一方面,如果是長時間運行的MySQL連接比較少的那些應用,基于SSL的加密可能很合理。由于MySQL服務器已經內置了SSL支持功能,你不需要實施VPN或SSH隧道之類單獨的安全層,這種隧道有其自己的維護開銷。
在MySQL服務器中實施SSL可以加密在服務器與客戶機之間來回傳輸的所有數據,因而防止廣域網或數據中心里面可能出現的竊聽或數據嗅探行為。此外,SSL還通過SSL證書提供了身份驗證機制,因而可以保護用戶,遠離可能出現的網絡釣魚攻擊。
我們在本文中將介紹如何啟用MySQL服務器上的SSL。請注意:同樣過程適用于MariaDB服務器。
創建Server SSL證書和私鑰
我們必須為MySQL服務器創建SSL證書和私鑰,通過SSL連接到服務器時要用到它們。
首先,創建一個臨時的工作目錄,我們將把私鑰和證書文件放在該目錄下。
$ sudo mkdir ~/cert $ cd ~/cert
確保OpenSSL已安裝在運行MySQL服務器的系統上。通常,所有Linux發行版在默認情況下都安裝了OpenSSL。想檢查一下OpenSSL有沒有安裝,不妨使用下面這個命令。
$ openssl version OpenSSL 1.0.1f 6 Jan 2014
現在,繼續創建CA私鑰和證書。下面這些命令將創建ca-key.pem和ca-cert.pem。
$ openssl genrsa 2048 > ca-key.pem $ openssl req -sha1 -new -x509 -nodes -days 3650 -key ca-key.pem > ca-cert.pem
第二個命令會詢問你幾個問題。你在這些字段里填入什么并不重要。只管填好那些字段。
下一步是為服務器創建私鑰。
$ openssl req -sha1 -newkey rsa:2048 -days 730 -nodes -keyout server-key.pem > server-req.pem
這個命令會再次詢問幾個問題,你可以填寫上一步中提供的相同答案。
下一步,使用下面這個命令,將服務器的私鑰導出成RSA類型的密鑰。
$ openssl rsa -in server-key.pem -out server-key.pem
最后,使用CA證書,創建服務器證書。
$ openssl x509 -sha1 -req -in server-req.pem -days 730 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem
配置MySQL服務器上的SSL
完成上述過程后,我們應該有了CA證書、服務器的私鑰及其證書。下一步就是配置MySQL服務器,以便使用私鑰和證書。
在配置MySQL服務器之前,檢查一下SSL選項已被啟用還是被禁用。為此,登錄進入到MySQL服務器,輸入下面這個查詢。
mysql> SHOW GLOBAL VARIABLES LIKE 'have_%ssl';
該查詢的結果會如同下圖。
請注意:“have_openssl”和“have_ssl”變量的默認值是“被禁用”,如下所示。想啟用MySQL服務器中的SSL,繼續執行下列步驟。
1. 將ca-cert.pem、server-cert.pem和server-key.pem拷貝或移動到/etc目錄下。
$ sudo mkdir /etc/mysql-ssl $ sudo cp ca-cert.pem server-cert.pem server-key.pem /etc/mysql-ssl
2. 使用文本編輯工具,打開服務器的my.cnf配置文件。添加或去掉注釋[mysqld]部分中類似下面內容的幾行。這些應該指向你放在/etc/mysql-ssl中的私鑰和證書。
[mysqld]
ssl-ca=/etc/mysql-ssl/ca-cert.pem
ssl-cert=/etc/mysql-ssl/server-cert.pem
ssl-key=/etc/mysql-ssl/server-key.pem
3. 在my.cnf中,還要找到“bind-address = 127.0.0.1”,并將它改成:
bind-address = *
那樣一來,你就可以從另一個主機連接到MySQL服務器了。
4. 重啟MySQL服務。
$ sudo service mysql restart
或
$ sudo systemctl restart mysql
或
$ sudo /etc/init.d/mysql restart