CentOS7 RHEL7 的設定

此示例假設有兩個伺服器:

  1. dbserver(我們的資料庫所在的位置)
  2. 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。無法確認這些確切步驟是否適用於其他地方。

希望這可以節省其他人一點時間和惡化。