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

驗(yàn)證 SSL 配置
SHOW VARIABLES LIKE '%ssl%';

可以通過(guò)以下 SQL 查詢(xún)確認(rèn) MySQL 是否支持 TLS:
SELECT * FROM performance_schema.tls_channel_status WHERE PROPERTY='Enabled';

查詢(xún)MySQL支持的 TLS 版本:
SHOW GLOBAL VARIABLES LIKE 'tls_version';

總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- MySQL使用show processlist命令的實(shí)現(xiàn)
- Mysql8配置SSL安全連接的詳細(xì)指南
- MySQL使用SHOW PROCESSLIST的實(shí)現(xiàn)
- JDBC如何通過(guò)SSL方式連接MySQL
- 登錄MySQL時(shí)出現(xiàn)SSL connection error: unknown error number錯(cuò)誤的解決方法
- mysql_ssl_rsa_setup的具體使用
- Mysql數(shù)據(jù)庫(kù)連接失敗SSLException: Unsupported record version Unknown-0.0問(wèn)題
相關(guān)文章
Mysql查詢(xún)很慢卡在sending data的原因及解決思路講解
今天小編就為大家分享一篇關(guān)于Mysql查詢(xún)很慢卡在sending data的原因及解決思路講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-04-04
mysql從一張表查詢(xún)批量數(shù)據(jù)并插入到另一表中的完整實(shí)例
這篇文章主要給大家介紹了關(guān)于mysql從一張表查詢(xún)批量數(shù)據(jù)并插入到另一表中的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
MySQL定時(shí)任務(wù)不能正常執(zhí)行的原因分析及解決方法
MySQL select count(*)計(jì)數(shù)很慢優(yōu)化方案
MySQL存儲(chǔ)過(guò)程未執(zhí)行的問(wèn)題排查過(guò)程
MySQL 8.0.18給數(shù)據(jù)庫(kù)添加用戶(hù)和賦權(quán)問(wèn)題

