最安全的从库同步账号配置是使用replication slave权限、限定具体ip(如'repl'@'192.168.10.22')和强密码,不赋select等额外权限,配合防火墙最小化放行及tls加密。

复制账号密码别写进 CHANGE MASTER TO 明文语句
直接在 CHANGE MASTER TO 里写 MASTER_PASSWORD='xxx',密码会持久化到元数据仓库(mysql.slave_master_info 表),所有有 SELECT 权限的用户都可能查到——包括被提权的应用账号。这不是临时行为,重启后依然存在。
- MySQL 8.0+ 推荐改用
CHANGE REPLICATION SOURCE TO SOURCE_USER='repl', SOURCE_PASSWORD='xxx',但依然明文落盘 - 真正安全的做法是:先用
CHANGE REPLICATION SOURCE TO配好其他参数(host/port/auto_position等),再单独执行START REPLICA——此时密码只存于内存,不写磁盘 - 若必须持久化,启用
keyring_file插件:INSTALL PLUGIN keyring_file SONAME 'keyring_file.so',再设keyring_file_data='/var/lib/mysql-keyring/keyring',之后CHANGE REPLICATION SOURCE TO SOURCE_USER='repl'就能自动从密钥环取密
主库上复制账号不能用 '%' 通配符
'repl'@'%' 看似方便,实则等于把 binlog 读取能力开放给任意 IP。而 binlog 里可能含脱敏前手机号、密码哈希、甚至 INSERT VALUES 中的明文 token。一旦该账号泄露,攻击者可直接拉取全量变更日志。
- 必须限定为从库真实出口 IP:
'repl'@'192.168.10.22'(NAT/跳板机场景需先用tcpdump -i any port 3306 -A抓包确认源 IP) - MySQL 8.0+ 默认禁用
'repl'@'%'与caching_sha2_password组合,会报ERROR 3092 - 验证权限是否干净:
SHOW GRANTS FOR 'repl'@'192.168.10.22'输出应仅含一行:GRANT REPLICATION SLAVE ON *.* TO `repl`@`192.168.10.22`
从库连接必须强制 SSL,否则密码走明文
即使主库开了 SSL,只要从库 CHANGE REPLICATION SOURCE TO 漏掉任意 SSL 参数,MySQL 就静默降级为明文传输——SHOW REPLICA STATUS\G 里 Master_SSL_Allowed: No 却不报错,这是最隐蔽的泄露点。
- 主库必须设
require_secure_transport=ON(SET PERSIST require_secure_transport = ON),否则仍接受非 SSL 连接 - 从库命令必须带全:
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' - 证书路径是**从库本地路径**,MySQL 进程需有读权限;SELinux/AppArmor 可能拦截,用
ausearch -m avc -ts recent查日志 - MySQL 8.0+ 的
caching_sha2_password插件强制要求 SSL,不配就报MY-002061
密码轮换时别只改主库,忘了从库同步更新
主库执行 ALTER USER 'repl'@'192.168.10.22' IDENTIFIED BY 'new_pass' 后,从库若不更新,复制会持续报错 error connecting to master,运维人员常因急于恢复而临时降级配置(如关 SSL、开 require_secure_transport=OFF),反而扩大风险面。
- 标准流程是:
STOP REPLICA→CHANGE REPLICATION SOURCE TO SOURCE_PASSWORD='new_pass'→START REPLICA - 避免在脚本里硬编码新密码,改用环境变量或密钥管理服务(如 HashiCorp Vault)注入
- 定期检查账号生命周期:
SELECT user, host, password_last_changed FROM mysql.user WHERE user='repl',超 90 天未更新应告警
密码本身不是唯一防线,真正危险的是它和权限、网络、加密配置共同构成的“信任链”——任一环节松动,整个链路就失效。











