足够,且只能给replication slave权限;该权限专用于从库io线程连接主库并拉取binlog流,添加select、replication client(非gtid模式)、super等权限会扩大攻击面,违背最小权限原则。

REPLICATION SLAVE 权限是否足够
够,而且只能给这个。从库 IO 线程连接主库、拉取 binlog 流,唯一依赖的就是 REPLICATION SLAVE 权限。加其他权限不仅没用,反而扩大攻击面:
-
SELECT:让账号能直接查主库任意表,绕过业务层鉴权,等于开了个只读后门 -
REPLICATION CLIENT:仅用于监控(如SHOW MASTER STATUS),GTID 模式下才需要,普通复制不需要 -
SUPER或PROCESS:完全无关,且可能被用于禁用read_only或杀连接,属高危权限
验证方式:执行 SHOW GRANTS FOR 'repl'@'192.168.10.22';,输出应只有且仅有这一行:GRANT REPLICATION SLAVE ON *.* TO `repl`@`192.168.10.22`
为什么不能用 '%' 而必须限定 IP
因为 repl@'%' 允许任意 IP 连接主库并读取 binlog,而 binlog 里可能含脱敏前手机号、密码哈希等敏感字段。一旦该账号泄露,攻击者可直接拉取全量变更日志。
实操建议:
- 内网环境写成
'repl'@'192.168.10.22'(从库真实内网 IP) - 多从库场景用最小网段,如
'repl'@'10.0.5.0/24',而非'repl'@'10.%' - 若走跳板机或 NAT,需在主库用
tcpdump -i any port 3306 -A抓包确认实际源 IP - MySQL 8.0+ 支持主机名,但 DNS 不稳时会导致连接失败,优先用 IP
MySQL 8.0+ 创建账号报 ERROR 3092 怎么办
这是 MySQL 8.0 引入的安全强制校验:复制账号若密码过期或未显式声明永不过期,REPLICATION SLAVE 权限会被静默禁用,报错 ERROR 3092 (HY000): The account currently does not have the necessary privileges。
正确做法只有一种:
- 创建时明确禁用密码过期:
CREATE USER 'repl'@'192.168.10.22' IDENTIFIED BY 'p' PASSWORD EXPIRE NEVER; - 避免全局降级策略(如
SET GLOBAL default_password_lifetime = 0),这会削弱所有账号安全水位 - 密码别含
@、/等字符,否则CHANGE MASTER TO解析会失败
从库上要不要给应用账号加 REPLICATION CLIENT
不需要。这个权限只用于查看复制状态(如 SHOW SLAVE STATUS),普通业务查询完全用不到。给应用账号赋它,等于让业务代码具备了误停复制的能力(比如调用 STOP SLAVE)。
真正需要它的只有两类角色:
- DBA 手动运维时用的管理账号,且应严格限定 host
- Prometheus +
mysqld_exporter的监控账号,也只需最小权限集,不混用业务连接池
最容易被忽略的一点:GTID 模式下,REPLICATION CLIENT 是必需的,但它仍不该和 REPLICATION SLAVE 绑定在同一个账号上——应拆分为两个独立账号,各司其职。











