MySQL數據庫SSL安全連接方式
1. 背景
使用數據庫過程中,數據的安全成為必不可少的一道考量要求,尤其是敏感數據的傳輸和存儲,對數據的傳輸機密性、完整性和身份驗證機制提出了新的要求。
SSL/TLS加密可防止數據在傳輸過程中被竊 聽或篡改,適用于敏感數據(如用戶密碼、支付信息)的傳輸。
主流數據庫(MySQL、PostgreSQL、MongoDB等)均支持SSL連接。
2. SSL
SSL(Secure Socket Layer: 安全套接字) 利用數據加密,身份驗證和消息完整性驗證機制,為基于TCP等可靠連接的應用層協議。
SSL協議提供的功能主要有:
- 數據傳輸的機密性;利用對稱密鑰算法對傳輸的數據進行加密
- 身份驗證機制:基于證書利用數字簽名方法對服務器和客戶端進行身份驗證,其中客戶端的身份驗證是可選的
- 數據傳輸的完整性驗證:數據傳輸過程中使用MAC算法來校驗數據的完整性。
如果用戶的傳輸不是通過SSL的方式,那么其在網絡中數據都是以明文進行傳輸的。
在數據庫方面,客戶端連接服務器使用SSL連接,能加密通信數據。
- 啟用 SSL:可以在 MySQL 配置文件中啟用 SSL,需要指定 SSL 證書、私鑰和 CA 證書的路徑。
- SSL 握手驗證:MySQL 8 支持 SSL 握手驗證,可以確??蛻舳诉B接到正確的服務器。
- SSL 客戶端認證:MySQL 8 支持客戶端證書認證,可以進一步增強安全性。
- SSL 連接限制:可以通過修改 MySQL 配置文件中的參數來限制 SSL 連接的最大數量和連接的最大并發(fā)數。
總的來說,MySQL 8 的 SSL 功能可以幫助用戶更安全地管理數據庫,提高數據安全性。本文以MySQL8.0.43為例進行演示。MYSQL版本8.0.43,默認是開啟ssl的,同時也是自帶證書的在/var/lib/mysql/下
2.1. MYSQL實現SSL的流程
- 先為MYSQL服務器創(chuàng)建SSL證書和私鑰
- 在MYQL里面配置SSL,并啟動服務
- 創(chuàng)建用戶的時候帶上SSL標簽(require ssl)
- 連接數據庫的時候帶上SSL
2.2. MYSQL配置SSl
- 手工配置:mysql5.7.6以下版本只能手工配置
- 自動配置:mysql5.7.6以上版本支持自動配置
2.2.1. SSL策略
--ssl-mode 是 MySQL 命令行客戶端的一個選項,用于指定 SSL/TLS 連接的模式。
它有四種值:
DISABLED:禁用 SSLREQUIRED:必須使用 SSLVERIFY_CA:驗證CAVERIFY_IDENTITY:驗證身份
在連接到遠程 MySQL 服務器時,需要保護敏感信息和數據的安全性,因此應使用 SSL 來加密通信。
而為了提供最高級別的信任和安全性,應將–ssl-mode 設置為REQUIRED(必須使用 SSL)。
–ssl-mode REQUIRED(必須使用 SSL) 是MySQL8中最高安全級別,它要求客戶端必須使用加密 SSL/TLS 連接到服務器,并驗證服務器的身份。
而 --ssl-mode VERIFY_IDENTITY(驗證身份) 不強制要求加密 SSL/TLS 連接,它僅檢查并驗證服務器證書,因此不如 --ssl-mode REQUIRED 安全。
這意味著 MySQL 客戶端將試圖建立 SSL 連接,并且如果無法建立 SSL 連接,則不會連接到 MySQL 服務器,從而確保只有通過 SSL 連接才能訪問數據庫。
詳細解釋如下:
- REQUIRED 要求所有 MySQL 客戶端必須通過 TLS 密碼套件建立與數據庫服務器之間的連接,以提供最高級別的信任和安全性。。
- VERIFY_IDENTITY 選項要求 MySQL 客戶端驗證數據庫服務器的身份,并持有與其授予一致的主機名或 IP 地址。但如果數據庫服務器使用自簽名證書,則可能會由于無法在公鑰基礎架構中下載到 CRL 和 OCSP 響應而交予妥協項,從而使校驗變得不安全。
- PREFERRED 標志允許客戶端建議并嘗試進行 SSL 連接,但不需要建立 SSL 連接。如果 MySQL 客戶端請求未加密連接時,服務器會回答該請求。
- VERIFY_CA 在服務器端上對客戶端啟用 SSL 協議,并確保 SSL 連接是在根證書頒發(fā)機構的頒發(fā)證書上建立的,而且客戶端提供了匹配考驗的專業(yè)證書,非常適合客戶端軟件的驗信標準很高或者要求傳輸數據增強保護的情況。
MySQL 8自帶證書的在/var/lib/mysql/下,證書說明如下:
| 證書名稱 | 證書說明 |
|---|---|
| ca-key.pem | CA證書私鑰文件,用于生成SSL連接所需的服務器和客戶端證書。 |
| ca.pem | CA證書公鑰文件,用于驗證SSL連接中服務器和客戶端證書的合法性。 |
| client-cert.pem | 客戶端證書,在SSL連接中用于驗證客戶端的身份 |
| client-key.pem | 客戶端證書的私鑰,用于加密和解密SSL連接中客戶端發(fā)送的數據。 |
| private_key.pem | 私鑰文件,用于加密和解密SSL連接中的數據。 |
| public_key.pem | 公鑰文件,用于驗證SSL連接中的數據。 |
| server_cert.pem | 服務器證書,用于驗證MySQL數據庫服務器的身份。 |
| server_key.pem | 服務器證書的私鑰,用于加密和解密SSL連接中服務器發(fā)送的數據。 |
2.2.2. 配置SSL用戶
創(chuàng)建用戶
-- 創(chuàng)建用戶 CREATE USER username@'%' IDENTIFIED BY 'password'; -- 給用戶授權 GRANT ALL ON *.* TO username@'%'; -- 應用權限配置 FLUSH PRIVILEGES; -- 查看用戶權限 SELECT user,host,ssl_type,ssl_cipher FROM mysql.user;
創(chuàng)建用戶強制證書認證
REQUIRE SSL 強制要求客戶端使用 SSL/TLS加密協議與服務器進行通信
REQUIRE X509強制要求客戶端不僅要使用 SSL/TLS連接,而且還需要提供一個有效的 x509證書。在使用 REQUIRE X509 時,MySQL 服務器會驗證客戶端提供的證書是否是受信任的,并且該證書是否匹配已經注冊的用戶帳戶中的證書。
-- require ssl 強制用戶使用證書認證 CREATE USER username@'%' IDENTIFIED BY 'password' require ssl; -- require x509 強制用戶使用證書認證 CREATE USER username@'%' IDENTIFIED BY 'password' require x509;
2.2.3. SSL 登錄
SSL加密登錄方法1:
關閉ssl模式
# --ssl-mode=disable: 表示關閉SSL加密模式 mysql -uroot -p --ssl-mode=disable # 登錄mysql后查看加密模式 mysql> status;
開啟ssl模式
# --ssl-mode=required: 表示強制開啟SSL加密模式 mysql -uroot -p --ssl-mode=required # 登錄mysql后查看加密模式 mysql> status;
SSL加密登錄方法2:
使用證書文件登錄
# 指定CA證書及客戶端證書及私鑰 mysql -u root -p --ssl-ca=/var/lib/mysql/ca.pem --ssl-cert=/var/lib/mysql/client-cert.pem --ssl-key=/var/lib/mysql/client-key.pem

2.2.4. 相關操作
配置強制安全
編輯mysql配置文件(my.cnf)
[mysqld] require_secure_transport=ON
檢查是否強制使用了 SSL/TLS:
SHOW VARIABLES LIKE 'require_secure_transport';

驗證 SSL 配置
SHOW VARIABLES LIKE '%ssl%';

可以通過以下 SQL 查詢確認 MySQL 是否支持 TLS:
SELECT * FROM performance_schema.tls_channel_status WHERE PROPERTY='Enabled';

查詢MySQL支持的 TLS 版本:
SHOW GLOBAL VARIABLES LIKE 'tls_version';

總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
- MySQL全面安全加固實戰(zhàn)的全流程
- MySQL性能監(jiān)控與安全管理的完整指南
- MySQL 用戶權限與安全管理最佳實踐
- 如何正確、安全地關閉MySQL
- MySQL用戶權限設置保護數據庫安全
- MySQL數據庫安全秘籍之守護數據金庫防火防盜防攻擊
- 如何優(yōu)雅安全的備份MySQL數據
- mysql 安全管理詳情
- 如何優(yōu)雅、安全的關閉MySQL進程
- 保障MySQL數據安全的一些建議
- MySQL 5.7 學習心得之安全相關特性
- MySQL安全策略(MySQL安全注意事項)
- 關于加強MYSQL安全的幾點建議
- 詳細講解安全升級MySQL的方法
- 淺析MySQL的注入安全問題
- MySQL數據庫安全設置與注意事項小結
- MySQL的安全問題從安裝開始說起
- MySQL安全設置圖文教程
- 10個提高MySQL安全性的重要措施:從賬號管理到網絡防護,再到數據備份和版本更新
相關文章
MySql?InnoDB存儲引擎之Buffer?Pool運行原理講解
緩沖池是用于存儲InnoDB表,索引和其他輔助緩沖區(qū)的緩存數據的內存區(qū)域。緩沖池的大小對于系統(tǒng)性能很重要。更大的緩沖池可以減少磁盤I/O來多次訪問同一表數據。在專用數據庫服務器上,可以將緩沖池大小設置為計算機物理內存大小的百分之802023-01-01
使用MySQL Slow Log來解決MySQL CPU占用高的問題
在Linux VPS系統(tǒng)上有時候會發(fā)現MySQL占用CPU高,導致系統(tǒng)的負載比較高。這種情況很可能是某個SQL語句執(zhí)行的時間太長導致的。優(yōu)化一下這個SQL語句或者優(yōu)化一下這個SQL引用的某個表的索引一般能解決問題2013-03-03

