從 wireshark 看 MySQL 8.0 加密連接

愛可生 DBA 團隊成員,負責項目日常問題處理及公司平臺問題排查。熱愛 IT,喜歡在互聯網裡暢遊,擅長攝影、廚藝,不會廚藝的 DBA 不是好司機,didi~



本文目錄:

引言

一、MySQL 5.7 未加密連接的情況

1.1 抓包

1.2 MySQL 通過 tcp 進行連接,並執行測試 SQL

1.3 通過 wireshark 解析抓包

二、MySQL 8.0 加密連接

2.1 抓包

2.2 MySQL 通過 tcp 進行連接,並執行測試 SQL

2.3 通過 wireshark 解析抓包

2.4 分析使用 TLS 加密連接握手過程

寫在最後


引言

社區之前的文章 中說道,MySQL 8.0 使用 caching_sha2_password 認證插件進行加密連接,初步介紹了加密連接,本文從網絡抓包層面看一下在使用 caching_sha2_password 插件的 MySQL 8.0 是如何進行加密連接的。


一、MySQL 5.7 未加密連接的情況

環境:

MySQL 5.7.25

tcpdump 4.9.2

wireshark 3.2.2

1.1 抓包

<code>tcpdump  -i eth0  -s 0   host 10.186.65.69 and port 3306  -w ./5.7.cap/<code>

1.2 MySQL 通過 tcp 進行連接,並執行測試 SQL

<code>shell> mysql -uroot -pxxxx -h10.186.60.73 -P3306mysql> show databases;mysql> select * from qinfulang.sbtest1 limit 1;mysql> exit/<code>

1.3 通過 wireshark 解析抓包

新特性解讀 | 從 wireshark 看 MySQL 8.0 加密連接

從上圖可以分析以下信息:

新特性解讀 | 從 wireshark 看 MySQL 8.0 加密連接

從包 9-20 可以看出,沒有使用加密連接插件的情況下,在經過抓包工具抓包後,經過 wireshark 就可以直接解析到查詢語句,非常不安全。

Tips:

此處提供一個小技巧:

在 wireshark 裡,編輯-首選項-Protocols-MySQL 裡可以設置是否在解析窗口的 info 列裡面顯示 SQL query 語句以及可以設置 MySQL TCP 默認端口。


新特性解讀 | 從 wireshark 看 MySQL 8.0 加密連接


二、MySQL 8.0 加密連接

環境:

MySQL 8.0.15

tcpdump 4.9.2

wireshark 3.2.2

2.1 抓包

<code>tcpdump  -i eth0  -s 0   host 10.186.65.69 and port 3306  -w ./8.0.cap/<code>

2.2 MySQL 通過 tcp 進行連接,並執行測試 SQL

<code>shell> mysql_8.0 -uroot -pxxxx -h10.186.60.73 -P3306mysql> show databases;mysql> select * from qinfulang.sbtest1 limit 1;mysql> exit/<code>

這裡在測試 SQL 之外查看一下 status

<code> mysql> status--------------./mysql  Ver 8.0.15 for linux-glibc2.12 on x86_64 (MySQL Community Server - GPL)Current user:       [email protected]:            Cipher in use is DHE-RSA-AES128-GCM-SHA256Server version:     8.0.15 MySQL Community Server - GPLProtocol version:   10Connection:     10.186.60.73 via TCP/IPTCP port:       3306/<code>

可以這裡使用的算法為 DHE-RSA-AES128-GCM-SHA256

2.3 通過 wireshark 解析抓包

新特性解讀 | 從 wireshark 看 MySQL 8.0 加密連接

從上圖可以分析以下信息:

新特性解讀 | 從 wireshark 看 MySQL 8.0 加密連接

2.4 分析使用 TLS 加密連接握手過程

首先,這裡為什麼是 TLS 而不是 SSL?

TLS 為傳輸層安全性協議,是 MySQL 在客戶端與服務器之間進行加密連接的協議。TLS 有時被稱為 SSL(安全套接層),但是 MySQL 實際上並不使用 SSL 協議進行加密連接,因為它的加密很弱。TLS 協議通過加密數據來確保在兩個通信應用程序之間提供隱私和數據完整性,以便任何第三方都無法攔截通信。它還會驗證對等方以驗證其身份。通過在兩個對等點之間提供安全的通信通道,TLS 協議可以保護消息的完整性並確保其不會被篡改。

MySQL 支持多種 TLS 版本協議,此次測試使用 8.0 的 client 為 TLSv1.2。

從 wireshark 中看一下 TLS 握手的步驟:

新特性解讀 | 從 wireshark 看 MySQL 8.0 加密連接

分步解析:

包 8:從客戶端到服務端進行 ClientHello,進行問候通信,來啟動整個握手環節。

新特性解讀 | 從 wireshark 看 MySQL 8.0 加密連接

此處包含:TLS 協議版本號,32 字節的隨機數,用於計算 Master secret 及創建加密密鑰,客戶端用於標識會話的唯一編號 Session ID 以及客戶端支持的密碼套件列表,打開密碼套件列表 Cipher Suites 就能看到 MySQL 8.0 使用的 DHE-RSA-AES128-GCM-SHA256 算法。

包 10:服務器返回的 ServerHello。進行問候返回,

新特性解讀 | 從 wireshark 看 MySQL 8.0 加密連接

此處包含:服務器版本號,服務器的 32 字節隨機數,用於生成 Master secret,用來標識與客戶端的 Session ID,服務器和客戶端都支持的密碼套件,此處為 MySQL 8.0 使用的 DHE-RSA-AES128-GCM-SHA256 算法,還有壓縮方式,可選,此處為 null。

包 11:

Certificate:服務器向客戶端發送 x.509 證書列表對客戶端身份進行驗證,證書內包含公鑰。

新特性解讀 | 從 wireshark 看 MySQL 8.0 加密連接

Server Key Exchange:服務器密鑰交換,這裡發送服務器使用的 DH 參數。

新特性解讀 | 從 wireshark 看 MySQL 8.0 加密連接

Certificate Request:客戶證書申請,此處是服務器希望對客戶端進行身份驗證發送的信息,包含了所需要的證書類型。

新特性解讀 | 從 wireshark 看 MySQL 8.0 加密連接

Server Hello Done:服務器打招呼結束,等待客戶端返回信息。

新特性解讀 | 從 wireshark 看 MySQL 8.0 加密連接

包 13:

Certificate:客戶端證書。

新特性解讀 | 從 wireshark 看 MySQL 8.0 加密連接

Client Key Exchange:客戶端密鑰交換。

新特性解讀 | 從 wireshark 看 MySQL 8.0 加密連接

此處包含:服務器驗證客戶端協議版本與原始的 client hello 的消息是否匹配,由客戶端生成使用服務端公鑰加密的隨機數 Pre-master secret 以進行服務器對客戶端的身份驗證。

Change Cipher Spec:客戶端通知服務器,所有未來的消息都使用剛剛協商的算法與密鑰進行加密傳輸。

新特性解讀 | 從 wireshark 看 MySQL 8.0 加密連接

Encrypted Handshake Message:完成 TLS 消息加密,此處數據已使用剛剛協商的密鑰與算法進行了加密。

新特性解讀 | 從 wireshark 看 MySQL 8.0 加密連接

包 14:

New Session Ticket:新的會話標籤,記錄了加密參數。

新特性解讀 | 從 wireshark 看 MySQL 8.0 加密連接

Change Cipher Spec:服務器通知客戶機,將使用現有的算法和密鑰對信息進行加密。

新特性解讀 | 從 wireshark 看 MySQL 8.0 加密連接

Encrypted Handshake Message:完成 TLS 消息加密,客戶端成功解密並驗證了信息,服務器就成功通過了身份驗證。

新特性解讀 | 從 wireshark 看 MySQL 8.0 加密連接

到此 TLS 消息加密握手過程結束,後面 Application Date 即為加密後的數據流。


寫在最後

MySQL 8.0 的加密插件在使用中兼顧了安全與性能,建議使用默認開啟,在 MySQL 8.0.16 後支持 TLSv1.3 協議。

目前網絡上嘗試過對 TLS 解密的手法,經筆者測試均不能在 wireshark 上解密 MySQL 8.0 的 TLS 加密消息。如果有新手法,可留言交流。

如果要進行一些 wireshark 對 MySQL 抓包的測試,需要看到 SQL query,目前建議採用 MySQL 5.7 版本或在 MySQL 8.0 上 skip-ssl 關閉加密通信。


分享到:


相關文章: