mysql复制密码明文落盘存在严重安全风险,必须禁用change replication source to中的source_password;应通过内存传参或密钥环插件实现密码不落盘存储。

MASTER_PASSWORD 明文传输不是“要不要加密”的问题,而是它根本不该出现在语句里——MySQL 会把它持久化进磁盘表,所有有 SELECT 权限的账号都能查到。
CHANGE REPLICATION SOURCE TO 里写密码就等于泄露
- MySQL 8.0+ 的
CHANGE REPLICATION SOURCE TO SOURCE_USER='repl', SOURCE_PASSWORD='xxx'会把密码写入mysql.slave_master_info表(MyISAM 或 InnoDB),重启不丢,且该表默认对所有SELECT权限用户可读; - 即使你只执行一次,只要没删掉元数据,应用账号一旦被提权(比如 SQL 注入拿到 DBA 权限),立刻能
SELECT * FROM mysql.slave_master_info拿到明文密码; - 这和连接字符串里写密码一样危险,但更隐蔽:没人会去审计这个系统表。
真正安全的做法:密码只存内存,不落盘
- 先用
CHANGE REPLICATION SOURCE TO配好所有非敏感参数(SOURCE_HOST、SOURCE_PORT、SOURCE_AUTO_POSITION=1等),不传SOURCE_PASSWORD; - 再单独执行
START REPLICA—— 此时 MySQL 会从内存中取密码(如果你之前用SET GLOBAL或配置文件设过),或弹出交互式提示(不推荐); - 密码仅驻留于
mysqld进程内存,进程退出即消失,不会写磁盘、不进 binlog、不进任何系统表。
必须配合密钥环插件才能持久化密码
- 如果你必须让
START REPLICA无需人工输密码且重启后仍可用,唯一合规路径是启用keyring_file插件:INSTALL PLUGIN keyring_file SONAME 'keyring_file.so';- 在
my.cnf中配置keyring_file_data=/var/lib/mysql-keyring/keyring(路径需 MySQL 用户可读写,权限 600) - 然后再执行
CHANGE REPLICATION SOURCE TO SOURCE_USER='repl'(不带SOURCE_PASSWORD)
- 此时 MySQL 会自动从密钥环中拉取密码,不再明文落盘;密钥环文件本身需由运维严格管控访问权限。
最容易被忽略的一点:SSL 加密不等于密码安全
- 即使你配了全套 SSL 参数(
SOURCE_SSL_CA、SOURCE_SSL_CERT等),只要SOURCE_PASSWORD出现在CHANGE REPLICATION SOURCE TO语句里,密码依然会落盘; - SSL 只加密网络传输层,防的是中间人抓包,防不了本地权限泄露;
- 所以“加密传输”和“不落盘存储”是两个独立维度,必须同时满足才算真正安全。











