CentOS7 RHEL7 的設定
此示例假設有兩個伺服器:
- dbserver(我們的資料庫所在的位置)
- appclient(我們的應用程式所在的位置)
FWIW,兩臺伺服器都是 SELinux 強制執行的。
首先,登入到 dbserver
建立用於建立證書的臨時目錄。
mkdir /root/certs/mysql/ && cd /root/certs/mysql/
建立伺服器證書
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
openssl rsa -in server-key.pem -out server-key.pem
openssl x509 -sha1 -req -in server-req.pem -days 730 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem
將伺服器證書移動到/ etc / pki / tls / certs / mysql /
目錄路徑採用 CentOS 或 RHEL(根據其他發行版的需要進行調整):
mkdir /etc/pki/tls/certs/mysql/
務必設定資料夾和檔案的許可權。mysql 需要完全所有權和訪問許可權。
chown -R mysql:mysql /etc/pki/tls/certs/mysql
現在配置 MySQL / MariaDB
# vi /etc/my.cnf
# i
[mysqld]
bind-address=*
ssl-ca=/etc/pki/tls/certs/ca-cert.pem
ssl-cert=/etc/pki/tls/certs/server-cert.pem
ssl-key=/etc/pki/tls/certs/server-key.pem
# :wq
然後
systemctl restart mariadb
不要忘記開啟防火牆以允許來自 appclient 的連線(使用 IP 1.2.3.4)
firewall-cmd --zone=drop --permanent --add-rich-rule 'rule family="ipv4" source address="1.2.3.4" service name="mysql" accept'
# I force everything to the drop zone. Season the above command to taste.
現在重啟 firewalld
service firewalld restart
接下來,登入到 dbserver 的 mysql 伺服器:
mysql -uroot -p
發出以下命令為客戶端建立使用者。請注意 GRANT 語句中的 REQUIRE SSL。
GRANT ALL PRIVILEGES ON *.* TO ‘iamsecure’@’appclient’ IDENTIFIED BY ‘dingdingding’ REQUIRE SSL;
FLUSH PRIVILEGES;
# quit mysql
從第一步開始,你仍然應該在/ root / certs / mysql 中。如果沒有,請回到它以獲取以下命令之一。
建立客戶端證書
openssl req -sha1 -newkey rsa:2048 -days 730 -nodes -keyout client-key.pem > client-req.pem
openssl rsa -in client-key.pem -out client-key.pem
openssl x509 -sha1 -req -in client-req.pem -days 730 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem
注意 :我對伺服器和客戶端證書使用了相同的通用名稱。因人而異。
確保你仍然是/ root / certs / mysql /用於下一個命令
將伺服器和客戶端 CA 證書合併到一個檔案中:
cat server-cert.pem client-cert.pem > ca.pem
確保你看到兩個證書:
cat ca.pem
現在結束伺服器端工作
開啟另一個終端和
ssh appclient
和以前一樣,為客戶端證書建立一個永久的主頁
mkdir /etc/pki/tls/certs/mysql/
現在,將客戶端證書(在 dbserver 上建立)放在 appclient 上。你可以將它們 scp,或者只是逐個複製和貼上檔案。
scp dbserver
# copy files from dbserver to appclient
# exit scp
同樣,請務必設定資料夾和檔案的許可權。mysql 需要完全所有權和訪問許可權。
chown -R mysql:mysql /etc/pki/tls/certs/mysql
你應該有三個檔案,每個檔案都由使用者 mysql 擁有:
/etc/pki/tls/certs/mysql/ca.pem
/etc/pki/tls/certs/mysql/client-cert.pem
/etc/pki/tls/certs/mysql/client-key.pem
現在在 [client]
部分編輯 appclient 的 MariaDB / MySQL 配置。
vi /etc/my.cnf
# i
[client]
ssl-ca=/etc/pki/tls/certs/mysql/ca.pem
ssl-cert=/etc/pki/tls/certs/mysql/client-cert.pem
ssl-key=/etc/pki/tls/certs/mysql/client-key.pem
# :wq
重啟 appclient 的 mariadb 服務:
systemctl restart mariadb
仍在客戶端
這應該返回:ssl TRUE
mysql --ssl --help
現在,登入 appclient 的 mysql 例項
mysql -uroot -p
應該在下面的兩個變數中都看到 YES
show variables LIKE '%ssl';
have_openssl YES
have_ssl YES
最初我看到了
have_openssl NO
快速瀏覽 mariadb.log 後發現:
SSL 錯誤:無法從’/etc/pki/tls/certs/mysql/client-cert.pem’獲取證書
問題是 root 擁有的 client-cert.pem 和包含資料夾。解決方案是將/ etc / pki / tls / certs / mysql /的所有權設定為 mysql。
chown -R mysql:mysql /etc/pki/tls/certs/mysql
如果需要,從上面的步驟重新啟動 mariadb
現在我們準備測試安全連線
我們仍然在這裡 appclient
嘗試使用上面建立的帳戶連線到 dbserver 的 mysql 例項。
mysql -h dbserver -u iamsecure -p
# enter password dingdingding (hopefully you changed that to something else)
運氣不錯,你應該沒有錯誤地登入。
要確認你已啟用 SSL,請從 MariaDB / MySQL 提示符處發出以下命令:
\s
這是一個反斜槓,又名狀態
這將顯示你的連線狀態,它應如下所示:
Connection id: 4
Current database:
Current user: iamsecure@appclient
SSL: Cipher in use is DHE-RSA-AES256-GCM-SHA384
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server: MariaDB
Server version: 5.X.X-MariaDB MariaDB Server
Protocol version: 10
Connection: dbserver via TCP/IP
Server characterset: latin1
Db characterset: latin1
Client characterset: utf8
Conn. characterset: utf8
TCP port: 3306
Uptime: 42 min 13 sec
如果你在連線嘗試中獲得許可權被拒絕錯誤,請檢查上面的 GRANT 語句,以確保沒有任何流浪字元或’標記。
如果你有 SSL 錯誤,請返回本指南以確保步驟有序。
這適用於 RHEL7,也可能適用於 CentOS7。無法確認這些確切步驟是否適用於其他地方。
希望這可以節省其他人一點時間和惡化。