公网MySQL主从通信必须全程TLS加密,否则binlog、账号凭证、SQL等全明文传输;主库需启用SSL、require_secure_transport=ON并重启,从库CHANGE REPLICATION SOURCE TO须显式指定全部SSL参数且复制账号必须REQUIRE SSL并限定IP。

公网环境下的 MySQL 主从通信必须全程加密,否则 binlog、账号凭证、SQL 内容全以明文传输,抓包即可见全部操作——这不是“可能被监听”,而是“默认裸奔”。加固核心就三点:主库强制加密、从库显式启用且验证、复制账号严格约束。
主库:启用 SSL 并强制加密连接
只配证书不强制,等于门开着锁着钥匙。主库需同时满足三项:
-
确认 SSL 已启用:执行
SHOW VARIABLES LIKE 'have_ssl',返回值必须是YES(不是 DISABLED 或空) -
证书路径真实可读:
ssl_ca、ssl_cert、ssl_key必须指向绝对路径,私钥权限设为600 -
强制加密连接:在
[mysqld]段配置require_secure_transport = ON,并重启 mysqld ——SET GLOBAL方式无效
常见错误:改完配置没重启;SSL 参数错写在 [client] 段;漏掉 require_secure_transport 导致从库仍可走明文连接。
从库:CHANGE REPLICATION SOURCE 必须显式带全参数
只写 SOURCE_SSL = 1 毫无作用,MySQL 会静默降级回明文,且不报错。真正生效靠两个验证点:Slave_SSL_Allowed: Yes 和 Master_SSL_Cipher 非空。
-
必须成对提供:
SOURCE_SSL_CA(验证主库身份)、SOURCE_SSL_CERT与SOURCE_SSL_KEY(仅双向认证需要) -
CA 文件一致:从库的
SOURCE_SSL_CA必须和主库的ssl_ca是同一份 PEM 文件,否则握手失败报certificate verify failed -
绕过主机名校验(必要时):若主库用 IP 或内网域名连接,而证书 CN 是 localhost 或为空,需加
SOURCE_SSL_VERIFY_SERVER_CERT = 0,这不是妥协安全,而是适配现实部署
示例命令(MySQL 8.0.22+):
CHANGE REPLICATION SOURCE TO SOURCE_HOST = 'master.example.com', SOURCE_USER = 'repl', SOURCE_PASSWORD = 'xxx', SOURCE_SSL = 1, SOURCE_SSL_CA = '/etc/mysql/ca.pem', SOURCE_SSL_CERT = '/etc/mysql/client-cert.pem', SOURCE_SSL_KEY = '/etc/mysql/client-key.pem', SOURCE_SSL_VERIFY_SERVER_CERT = 0, SOURCE_LOG_FILE = 'mysql-bin.000001', SOURCE_LOG_POS = 154;
复制账号:REQUIRE SSL + 固定 IP 限制
哪怕链路已加密,若复制账号没强制 SSL,攻击者仍可用该账号发起明文连接,完全绕过所有防护。
-
创建时必须指定 REQUIRE SSL:
CREATE USER 'repl'@'192.168.10.5' IDENTIFIED BY 'StrongPass123!' REQUIRE SSL; - 禁止使用 % 通配符:明确限定从库真实 IP,配合系统防火墙或云安全组,仅放行该 IP 的 3306 端口
- 避免复用其他业务账号:复制账号应专号专用,不授予额外权限(如 SELECT、DROP 等)
验证与日常检查
配置完成不等于长期有效,需定期确认:
- 主库执行
SHOW STATUS LIKE 'Ssl%';,关注Ssl_version和Ssl_cipher是否非空 - 从库执行
SHOW SLAVE STATUS\G,确认Slave_SSL_Allowed: Yes、Master_SSL_Cipher不为空、Seconds_Behind_Master正常更新 - 尝试用非 SSL 客户端连接主库,应被拒绝(
ERROR 3159 (HY000): Connections using insecure transport are prohibited)


















