如何為MySQL伺服器和客戶機啟用SSL?

發表於2015-07-28

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';

該查詢的結果會如同下圖。

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

相關文章