MySQL防止非法用户暴力破解密码的配置方法
MySQL防暴力破解需同时配置FAILED_LOGIN_ATTEMPTS(失败次数阈值)和PASSWORD_LOCK_TIME(锁定时间),依赖validate_password插件,且仅对caching_sha2_password等认证插件生效。锁定期满后需成功登录方可重置失败计数。还需安装connection_control及配套组件,配合网络层IP白名
首先给出明确结论:要为 MySQL 配置防暴力破解机制,并非简单设置几个参数就能生效。**FAILED_LOGIN_ATTEMPTS** 和 **PASSWORD_LOCK_TIME** 这两个参数必须成对使用,并且依赖 `validate_password` 插件处于启用状态。此外,它们仅对采用 `caching_sha2_password` 或 `mysql_native_password` 认证插件的用户有效;单独配置其中一个参数等同于未设。参数单位是天,锁定到期后不会自动解除,必须有一次成功的登录才能重置失败计数。

FAILED_LOGIN_ATTEMPTS 和 PASSWORD_LOCK_TIME 必须成对设置
如果单独执行 ALTER USER 'u'@'%' FAILED_LOGIN_ATTEMPTS 3,MySQL 会直接忽略该指令,不会产生任何效果。这两个参数是硬性捆绑的——缺一不可,排列顺序无关紧要,但缺少任意一个就会完全失效。
- 新建用户时,必须一次性完整书写:
CREATE USER 'api'@'%' IDENTIFIED WITH caching_sha2_password BY 'pwd' FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 0.04167(锁定1小时) - 对已有用户进行修改时,连认证插件也必须一同更换:
ALTER USER 'api'@'%' IDENTIFIED WITH caching_sha2_password BY 'newpwd' FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 0.04167 PASSWORD_LOCK_TIME的单位为"天",因此锁定5分钟需要写成0.00347(5 ÷ 1440)。如果设为0,表示永久锁定,而非"不锁定"- 锁定期满后,不会自动解锁——必须有一次成功的登录才能重置失败计数,同时清除
account_locked = 'Y'的状态
validate_password 插件不是可选,而是必需
即使参数书写完整、认证插件也匹配,但如果 `validate_password` 未被启用,失败登录根本不会累积计数。你在 `mysql.user` 表中永远看不到 `account_locked = 'Y'`,错误日志中也无法搜索到 `Too many failed login attempts` 这条信息。
- 检查是否激活:
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'validate_password',状态必须为 `ACTIVE` - 启用方式有两种:在配置文件中添加
plugin_load_add = validate_password.so后重启;或者直接执行INSTALL PLUGIN validate_password SONAME 'validate_password.so' - 启用后会自动激活密码强度策略(例如 `validate_password.length`),这可能会影响已有的创建用户脚本,建议提前做好验证
connection_control 插件必须安装两个组件才生效
只安装 `CONNECTION_CONTROL` 并不足够——它负责延时逻辑,但失败计数依赖于配套组件 `CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS`。如果后者未安装,执行 `SHOW VARIABLES LIKE '%connection_control%'` 将无法看到任何相关变量,所有配置均无效。
- 必须按顺序执行:先执行
INSTALL PLUGIN CONNECTION_CONTROL SONAME 'connection_control.so',再执行INSTALL PLUGIN CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS SONAME 'connection_control.so' connection_control_failed_connections_threshold参数如果不写入 `my.cnf` 则不会持久化——通过 `SET GLOBAL` 设置后,重启即失效- 注意单位:
connection_control_min_connection_delay的单位是毫秒,而非秒;`max` 值设置过高(例如 60000)可能会卡死连接池,引发 `Too many connections` 'root'@'localhost'和所有本地连接默认被绕过,这是设计的正常行为,并非漏洞
别信“%”通配符,IP 白名单才是第一道墙
只要 `3306` 端口对公网开放,并且用户的 Host 设置为 `'%'`,暴力破解的风险就始终真实存在。MySQL 自身的账户锁定仅仅是最外层防线,不能替代网络隔离。
- 禁止远程 root 登录:
DELETE FROM mysql.user WHERE user='root' AND host!='localhost',然后执行FLUSH PRIVILEGES - 业务账号必须绑定具体的 IP 或内网段:
CREATE USER 'webapp'@'192.168.10.50' IDENTIFIED BY 'strong_pwd' - 云环境务必在安全组层面只放行应用服务器的内网 IP;物理机使用 `iptables` 或 `ufw` 严格限制源地址
bind-address绝不可设为 `0.0.0.0`,应优先设为 `127.0.0.1` 或内网地址
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
生产环境MySQL为何不建议使用过多触发器
生产环境触发器过多易引发长事务、死锁和主从延迟,且问题隐蔽,慢SQL日志无法定位触发器内部语句。高并发下触发器逐行同步执行,串行化写入链路,性能急剧下降。替代方案如应用层封装、Canal异步落库等更可靠。
Redis集群SSL/TLS加密传输配置方法
为Redis集群启用TLS,所有节点必须统一开启,版本、证书、配置缺一不可。Redis6及以上版本需编译支持TLS,且OpenSSL版本不低于1 1 1,所有节点共用同一CA证书文件。配置需设置tls-cert-file、tls-key-file等五项参数,并禁用明文端口。客户端连接时需指定CA证书,证书更新需逐节点滚动重启。
MySQL两阶段提交协调机制详解
MySQL的提交通过两阶段提交实现:准备阶段将重做日志标记为准备并刷盘,提交阶段二进制日志写入成功后才通知InnoDB引擎更新日志状态。崩溃恢复时比对事务标识,两者一致才提交,否则回滚。配置参数不当会破坏一致性。
MySQL中DELETE比TRUNCATE更易产生锁等待的原因
MySQL中DELETE属DML操作,逐行加行级锁并写undo日志,事务提交前持续持有锁,易引发锁等待;TRUNCATE属DDL操作,仅瞬时持表级锁并隐式提交,锁等待近乎为零,但存在不可回滚、自增重置、触发器失效及外键拒绝等语义差异。
Spring Boot导出Excel时SQL排序注入点修复方法
在SpringBoot导出Excel中,SQL排序注入因ORDERBY无法参数化而高发,唯一可靠防护是白名单硬编码校验字段名与排序方向,别名也需独立白名单,拒绝用户输入直接拼接,确保所有导出入口均经过统一校验。
- 热门数据榜
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
相关攻略
2026-07-18 18:17
2026-07-18 18:16
2026-07-18 18:16
2026-07-18 18:16
2026-07-18 18:16
2026-07-18 18:15
2026-07-18 18:15
2026-07-18 18:14
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程

