2.4. 在 MySQL 服务器上设置 TLS 加密
默认情况下,MySQL 使用未加密的连接。对于安全连接,请在 MySQL 服务器上启用 TLS 支持,并将您的客户端配置为建立加密的连接。
2.4.1. 将 CA 证书、服务器证书和私钥放在 MySQL 服务器上 复制链接链接已复制到粘贴板!
在 MySQL 服务器上启用 TLS 加密前,请将证书颁发机构(CA)证书、服务器证书和私钥存储在 MySQL 服务器上。
先决条件
以下 Privacy Enhanced Mail(PEM)格式的文件已复制到服务器:
-
服务器的私钥:
server.example.com.key.pem
-
服务器证书:
server.example.com.crt.pem
-
证书颁发机构(CA)证书:
ca.crt.pem
有关创建私钥和证书签名请求(CSR),以及从 CA 请求证书的详情,请查看您的 CA 文档。
-
服务器的私钥:
流程
将 CA 和服务器证书存储在
/etc/pki/tls/certs/
目录中:mv <path>/server.example.com.crt.pem /etc/pki/tls/certs/ mv <path>/ca.crt.pem /etc/pki/tls/certs/
# mv <path>/server.example.com.crt.pem /etc/pki/tls/certs/ # mv <path>/ca.crt.pem /etc/pki/tls/certs/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 对 CA 和服务器证书设置权限,使 MySQL 服务器能够读取文件:
chmod 644 /etc/pki/tls/certs/server.example.com.crt.pem /etc/pki/tls/certs/ca.crt.pem
# chmod 644 /etc/pki/tls/certs/server.example.com.crt.pem /etc/pki/tls/certs/ca.crt.pem
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 由于证书是建立安全连接前通信的一部分,因此任何客户端都可以在不需要身份验证的情况下检索它们。因此,您不需要对 CA 和服务器证书文件设置严格的权限。
将服务器的私钥存储在
/etc/pki/tls/private/
目录中:mv <path>/server.example.com.key.pem /etc/pki/tls/private/
# mv <path>/server.example.com.key.pem /etc/pki/tls/private/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 对服务器的私钥设置安全权限:
chmod 640 /etc/pki/tls/private/server.example.com.key.pem chgrp mysql /etc/pki/tls/private/server.example.com.key.pem
# chmod 640 /etc/pki/tls/private/server.example.com.key.pem # chgrp mysql /etc/pki/tls/private/server.example.com.key.pem
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果未授权的用户可以访问私钥,则到 MySQL 服务器的连接不再安全。
恢复 SELinux 上下文:
restorecon -Rv /etc/pki/tls/
# restorecon -Rv /etc/pki/tls/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.4.2. 在 MySQL 服务器上配置 TLS 复制链接链接已复制到粘贴板!
要提高安全性,请在 MySQL 服务器上启用 TLS 支持。因此,客户端可以使用 TLS 加密向服务器传输数据。
先决条件
- 您已安装了 MySQL 服务器。
-
mysqld
服务正在运行。 服务器上存在 Privacy Enhanced Mail(PEM)格式的以下文件,并可由
mysql
用户读取:-
服务器的私钥:
/etc/pki/tls/private/server.example.com.key.pem
-
服务器证书:
/etc/pki/tls/certs/server.example.com.crt.pem
-
证书颁发机构(CA)证书
/etc/pki/tls/certs/ca.crt.pem
-
服务器的私钥:
- 主题可识别名称(DN)或服务器证书中的主题备用名称(SAN)字段与服务器的主机名相匹配。
流程
创建
/etc/my.cnf.d/mysql-server-tls.cnf
文件:添加以下内容来配置到私钥、服务器和 CA 证书的路径:
[mysqld] ssl_key = /etc/pki/tls/private/server.example.com.key.pem ssl_cert = /etc/pki/tls/certs/server.example.com.crt.pem ssl_ca = /etc/pki/tls/certs/ca.crt.pem
[mysqld] ssl_key = /etc/pki/tls/private/server.example.com.key.pem ssl_cert = /etc/pki/tls/certs/server.example.com.crt.pem ssl_ca = /etc/pki/tls/certs/ca.crt.pem
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您有一个证书撤销列表(CRL),请将 MySQL 服务器配置为使用它:
ssl_crl = /etc/pki/tls/certs/example.crl.pem
ssl_crl = /etc/pki/tls/certs/example.crl.pem
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:拒绝没有加密的连接尝试。要启用此功能,请附加:
require_secure_transport = on
require_secure_transport = on
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:设置服务器应支持的 TLS 版本。例如,要只支持 TLS 1.3,请附加:
tls_version = TLSv1.3
tls_version = TLSv1.3
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 默认情况下,服务器支持 TLS 1.2 和 TLS 1.3。
重启
mysqld
服务:systemctl restart mysqld
# systemctl restart mysqld
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
要简化故障排除,请在将本地客户端配置为使用 TLS 加密之前在 MySQL 服务器上执行以下步骤:
验证 MySQL 现在是否启用了 TLS 加密:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您将 MySQL 服务器配置为只支持特定的 TLS 版本,请显示
tls_version
变量:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 验证服务器是否使用正确的 CA 证书、服务器证书和私钥文件:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.4.3. MySQL 服务器上的特定用户帐户需要 TLS 加密连接 复制链接链接已复制到粘贴板!
可以访问敏感数据的用户应始终使用 TLS 加密连接,以避免通过网络发送未加密的数据。
如果您无法在服务器上配置所有连接都需要安全传输(require_secure_transport = on
),请将单个用户帐户配置为需要 TLS 加密。
先决条件
- MySQL 服务器启用了 TLS 支持。
- 您配置为需要安全传输的用户已存在。
- CA 证书存储在客户端上。
流程
以管理员用户身份连接到 MySQL 服务器:
mysql -u root -p -h server.example.com
# mysql -u root -p -h server.example.com
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您的管理用户没有远程访问服务器的权限,请在 MySQL 服务器上执行命令,并连接到
localhost
。使用
REQUIRE SSL
子句强制用户必须使用 TLS 加密连接进行连接:MySQL [(none)]> ALTER USER 'example'@'%' REQUIRE SSL;
MySQL [(none)]> ALTER USER 'example'@'%' REQUIRE SSL;
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
使用 TLS 加密,以
example
用户身份连接到服务器:mysql -u example -p -h server.example.com
# mysql -u example -p -h server.example.com ... MySQL [(none)]>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果没有显示错误,并且您可以访问交互式 MySQL 控制台,则与 TLS 的连接成功。
默认情况下,如果服务器提供了,客户端会自动使用 TLS 加密。因此,
--ssl-ca=ca.crt.pem
和--ssl-mode=VERIFY_IDENTITY
选项不是必需的,但可以提高安全性,使用这些选项,客户端可以验证服务器的身份。尝试以禁用 TLS 的
example
用户身份进行连接:mysql -u example -p -h server.example.com --ssl-mode=DISABLED
# mysql -u example -p -h server.example.com --ssl-mode=DISABLED ERROR 1045 (28000): Access denied for user 'example'@'server.example.com' (using password: YES)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 服务器拒绝登录尝试,因为此用户需要 TLS,但禁用了(
--ssl-mode=DISABLED
)。