MySQL管理——网络传输安全
数据库会遭受多种攻击方式,例如,SQL注入、利用缓冲区错误、暴力破解、及网络窃听等等。这一篇主要介绍关于MySQL如何防止网络窃听的方法。
MySQL防止网络窃听主要的方法是在所有的连接和传输时都要进行加密,使用SSL/TLS(Secure Socket Layer/ Transport Layer Security)。加密后的传输内容无法被窃听者读取。MySQL的SSL/TSL基于 OpenSSL API实现。MySQL中的许多选项和变量都涉及SSL,但实际上它使用的是更为安全的TLS,包括验证身份、检测传输中的更改及防止重放等机制在内。
TLS通过加密算法保证从公共网络接收到的数据是可信的,并能够检查数据是否有更改、丢失或被重放,此外,TLS还结合了使用X509标准提供身份验证的算法。
X509可以通过使用证书CA识别来自互联网的用户,证书依赖于具有公钥和私钥的非对称加密算法,证书的持有者可以向另一方出示证书作为身份证明,证书包含所有者的公钥,通过公钥加密的数据,仅能够给通过对应的私钥进行解密,私钥仅保存在证书的持有者手中。
MySQL包含OpenSSL库用以支持 TLSv1,TLSv1.1,TLSv1.2 及TLSv1.3。用户可以通过查看“Ssl_version”和“Ssl_cipher”状态变量确认MySQL当前使用哪种加密协议及密码。
一些应用程序需要使用安全连接提供的额外安全性,因此,MySQL可以基于每个连接决定是否启用安全连接方式,并可以对每个用户强制或作为选项启用。
MySQL建立安全连接的过程如下:
客户端发起一个连接至服务器的安全连接
服务器提供数字证书给客户端用以识别服务器及提供服务器的公钥
客户端决定会话密钥,并使用服务器的公钥加密传输到服务器
服务器用私钥解密客户端传至服务器的会话密钥
此时,该会话密钥仅客户端和服务器持有
其他会话使用该会话密钥进行加密解密传输内容
SSL包括检测修改并防止回放的机制
生成数字证书
使用SSL时,服务器必须具有一个由凭据管理中心CA发行,基于X509格式的数字证书。CA验证服务器并提供用于非对称加密的公钥/私钥,CA可以是一个第三方组织,或者由服务器充当CA提供自签名的数字证书。MySQL可以作为CA并生成自签名的证书。如果MySQL启用了SSL,并且服务器满足OpenSSL的要求,当服务器启动时,会自动检查数字证书,如果证书不存在,会生成新的证书。用户也可以使用"mysql_ssl_rsa_setup"生成数字证书文件,通过使用不同的选项,满足用户对证书的需求。
默认情况下,服务器开启了SSL,用户可以通过“SHOW VARIABLES LIKE 'have_ssl'”查看是否开启。如果需要禁用MySQL服务器的SSL,在启动MySQL时,需要执行选项"--ssl=0"或“--skip-ssl”。
当客户端使用TCP/IP协议连接MySQL服务器时,默认开启了SSL。可以在mysql shell下执行“\status”查看当前SSL状态,例如,
MySQL 127.0.0.1:3350 ssl SQL > \status
MySQL Shell version 8.0.28-commercial
<br>
Connection Id: 47
Current schema:
Current user: root@localhost
SSL: Cipher in use: TLS_AES_256_GCM_SHA384 TLSv1.3
Using delimiter: ;
Server version: 8.0.30-commercial MySQL Enterprise Server - Commercial
Protocol version: Classic 10
Client library: 8.0.28
Connection: 127.0.0.1 via TCP/IP
TCP port: 3350
Server characterset: utf8mb4
Schema characterset: utf8mb4
Client characterset: utf8mb4
Conn. characterset: utf8mb4
Result characterset: utf8mb4
Compression: Disabled
Uptime: 104 days 21 hours 31 min 22.0000 sec
<br>
Threads: 2 Questions: 984 Slow queries: 36 Opens: 623 Flush tables: 4 Open tables: 328 Queries per second avg: 0.000