天天看點

mysql加密連接配接一、加密概述

一、加密連接配接 TLS 協定

MySQL 支援多種 TLS 協定和密碼,并允許配置允許加密連接配接的協定和密碼。還可以确定目前會話使用的協定和密碼

1、mysql支援的tls協定

MySQL 伺服器版本                           支援的 TLS 協定
MySQL 8.0.15 及以下                        TLSv1、TLSv1.1、TLSv1.2
MySQL 8.0.16 和 MySQL 8.0.17               TLSv1、TLSv1.1、TLSv1.2、TLSv1.3(組複制除外)
MySQL 8.0.18 到 MySQL 8.0.25               TLSv1、TLSv1.1、TLSv1.2、TLSv1.3(包括組複制)
MySQL 8.0.26 和 MySQL 8.0.27               TLSv1(不推薦)、TLSv1.1(不推薦)、TLSv1.2、TLSv1.3
MySQL 8.0.28 及以上                        TLSv1.2、TLSv1.3(已經不再支援TLSv1、TLSv1.1)      

從 MySQL 8.0.28 開始,MySQL 不再支援 TLSv1 和 TLSv1.1 協定。從此版本開始,用戶端無法使用設定為 TLSv1 或 TLSv1.1 的協定建立 TLS/SSL 連接配接。

2、ssl庫

如果 SSL 庫不支援特定協定,MySQL 也不支援,以下讨論中指定該協定的任何部分都不适用。特别要注意,要使用 TLSv1.3,MySQL伺服器
和用戶端應用程式都必須使用 OpenSSL 1.1.1 或更高版本進行編譯。MySQL 伺服器在啟動時檢查 OpenSSL的版本,如果低于1.1.1,則
TLSv1.3将移除與TLS版本相關的伺服器系統變量的預設值(tls_version,admin_tls_version, group_replication_recovery_tls_version)。      

3、主機配置

主機系統可能隻允許某些 TLS 協定,這意味着 MySQL 連接配接不能使用未經允許的協定,即使 MySQL 本身允許它們:
假設 MySQL 配置允許 TLSv1、TLSv1.1 和 TLSv1.2,但您的主機系統配置隻允許使用 TLSv1.2 或更高版本的連接配接。在這種情況下,您無
法建立使用 TLSv1 或 TLSv1.1 的 MySQL 連接配接,即使 MySQL 配置為允許它們,因為主機系統不允許它們。
如果 MySQL 配置允許 TLSv1、TLSv1.1 和 TLSv1.2,但您的主機系統配置隻允許使用 TLSv1.3 或更高版本的連接配接,則根本無法建立MySQL
連接配接,因為主機不允許 MySQL 允許的協定系統。

可以在系統主機配置允許的最低版本
/etc/ssl/openssl.cnf
ssl_conf = ssl_sect
[ssl_sect]
system_default = system_default_sect
[system_default_sect]
MinProtocol = TLSv1.2
MinProtocol = DTLSv1.2      

二、mysql配置

1、檢視mysql預設協定

mysql> SHOW GLOBAL VARIABLES LIKE 'tls_version';
+---------------+-----------------------+
| Variable_name | Value                 |
+---------------+-----------------------+
| tls_version   | TLSv1.2,TLSv1.3       |
+---------------+-----------------------+      

2、手動設定

[mysqld]
tls_version=TLSv1.2,TLSv1.3

從 MySQL 8.0.16 開始,tls_version可以在運作時更改
在用戶端,該 --tls-version選項指定用戶端程式允許哪些 TLS 協定連接配接到伺服器。選項值的格式與tls_version前面描述的系統變量的
格式相同(一個或多個逗号分隔的協定版本的清單)。      

3、查詢目前會話使用的協定

要确定目前用戶端會話使用哪種加密 TLS 協定和密碼,請檢查 Ssl_version和 Ssl_cipherstatus 變量的會話值:

mysql> SELECT * FROM performance_schema.session_status
       WHERE VARIABLE_NAME IN ('Ssl_version','Ssl_cipher');
+---------------+---------------------------+
| VARIABLE_NAME | VARIABLE_VALUE            |
+---------------+---------------------------+
| Ssl_cipher    | DHE-RSA-AES128-GCM-SHA256 |
| Ssl_version   | TLSv1.2                   |
+---------------+---------------------------+
如果連接配接未加密,則兩個變量都為空值。      

4、加密設定

要要求用戶端使用加密連接配接進行連接配接,請啟用 require_secure_transport系統變量
[mysqld]
ssl_ca=ca.pem
ssl_cert=server-cert.pem
ssl_key=server-key.pem
require_secure_transport=ON

ssl_ca:證書頒發機構 (CA) 證書檔案的路徑名。(ssl_capath類似,但指定 CA 證書檔案目錄的路徑名。)
ssl_cert:伺服器公鑰證書檔案的路徑名。該證書可以發送到用戶端并根據其擁有的 CA 證書進行身份驗證。
ssl_key: 伺服器私鑰檔案的路徑名。

在 MySQL 8.0.16之前,配置加密連接配接支援的 tls _ xxx 和 ssl _ xxx 系統變量隻能在伺服器啟動時設定。是以,這些系統變量确定伺服器用于
所有新連接配接的 TLS 上下文。
從 MySQL 8.0.16開始,tls _ xxx 和 ssl _ xxx 系統變量是動态的,可以在運作時設定,而不僅僅是在啟動時設定。如果使用SET GLOBAL更改
,則新值僅應用于伺服器重新啟動之前。如果使用SET PERSIST更改,新值也會傳遞到随後的伺服器重新啟動。但是,對這些變量的運作時更改不會立
即影響新連接配接的 TLS 上下文
除了 MySQL 8.0.16中允許運作時更改與 TLS 上下文相關的系統變量之外,伺服器還允許運作時更新用于新連接配接的實際 TLS 上下文。這個功能可能
很有用,例如,可以避免重新啟動運作時間過長以至于其 SSL 證書已經過期的 MySQL 伺服器。

要在運作時重新配置 TLS 上下文,請使用以下過程:
設定應更改為其新值的每個與 TLS 上下文相關的系統變量。
執行ALTER INSTANCE RELOAD TLS。此語句根據 TLS 上下文相關系統變量的目前值重新配置活動 TLS 上下文。它還設定上下文相關的狀态變量以
反映新的活動上下文值。該語句需要 CONNECTION_ADMIN特權。
執行後建立的新連接配接 ALTER INSTANCE RELOAD TLS使用新的 TLS 上下文。現有連接配接不受影響。如果應該終止現有連接配接,請使用該 KILL語句。      

5、密鑰檔案

對于 MySQL 發行版,伺服器可以在啟動時自動生成這些檔案
1、啟動時會檢查資料目錄是否有以下檔案
ca.pem
server-cert.pem
server-key.pem
2、如果存在任何這些檔案,則伺服器不會建立SSL檔案。否則,它會建立它們,以及一些額外的檔案:
ca.pem               Self-signed CA certificate
ca-key.pem           CA private key
server-cert.pem      Server certificate
server-key.pem       Server private key
client-cert.pem      Client certificate
client-key.pem       Client private key
3、如果伺服器自動生成 SSL檔案,它會使用ca.pem、server-cert.pem、server-key.pem設定相應的系統變量(ssl_ca、 ssl_cert、 
ssl_key)。
啟動時,如果所有這些條件都滿足,伺服器會在資料目錄中自動生成 RSA 私鑰/公鑰對檔案:
sha256_password_auto_generate_rsa_keys or caching_sha2_password_auto_generate_rsa_keys 系統變量被啟用;
沒有指定 RSA 選項;資料目錄中缺少 RSA 檔案。這些密鑰對檔案支援使用 RSA 在未加密連接配接上為由 sha256_passwordor 
caching_sha2_password插件驗證的帳戶進行安全密碼交換

1、伺服器檢查具有以下名稱的 RSA 檔案的資料目錄:
private_key.pem      Private member of private/public key pair
public_key.pem       Public member of private/public key pair
2、如果存在這些檔案中的任何一個,則伺服器不會建立 RSA 檔案。否則,它會建立它們。
3、如果伺服器自動生成 RSA 檔案,它會使用它們的名稱來設定相應的系統變量(sha256_password_private_key_path 和 
sha256_password_public_key_path; caching_sha2_password_private_key_path 和 caching_sha2_password_public_key_path)