mysql自身不支持登录失败次数限制,需通过validate_password插件强化密码策略、日志分析+脚本封禁IP、代理层(如proxySQL)限流、fail2ban等系统级防护四层叠加实现防暴力破解。

MySQL 本身不内置“登录失败次数限制”功能,无法像操作系统那样直接锁定账户或触发延迟。但可以通过组合配置、插件和外部机制来有效防暴力破解。
启用 validate_password 插件(基础加固)
该插件虽不控制尝试次数,但能强制强密码策略,大幅增加暴力破解难度:
- 启动插件:
INSTALL PLUGIN validate_password SONAME 'validate_password.so'; - 设置策略等级:
SET GLOBAL validate_password.policy = STRONG; - 要求最小长度、大小写字母、数字、特殊字符等,避免弱口令成为突破口
使用 mysql_native_password + 失败记录 + 脚本拦截(实用方案)
MySQL 8.0+ 默认使用 caching_sha2_password,其认证过程不暴露明文错误细节,但日志仍可分析失败行为。关键步骤如下:
- 确保开启通用查询日志或错误日志,并包含认证失败记录(在
my.cnf中配置log_error_verbosity = 3) - 定期解析错误日志,提取频繁失败的 IP 和用户,例如匹配
"access denied for user"行 - 用 shell 或 python 脚本统计单位时间内失败次数(如 10 分钟内超 5 次),调用
iptables或firewalld封禁源 IP
部署代理层(推荐生产环境)
在 MySQL 前加一层代理(如 ProxySQL、HAProxy 或自研网关),由代理统一处理连接认证逻辑:
- ProxySQL 支持
mysql-users表中的max_connections和max_connect_errors字段(注意:此为连接错误数,非纯登录失败,需结合 use_ssl / default_hostgroup 等判断) - 更可靠的做法是:代理记录每次认证请求,对同一 IP+用户名组合做滑动窗口计数,超阈值后临时拒绝连接或返回模拟延迟
- 优势:不依赖 MySQL 内核改动,可集中管控、快速响应、不影响数据库稳定性
操作系统级防护(不可忽视)
MySQL 运行在 linux 上,系统防火墙和登录审计是第一道防线:
- 用
fail2ban监控 MySQL 错误日志,自动封禁异常 IP(需配置 jail.local 中的 [mysqld-auth] 段) - 限制 MySQL 绑定地址:仅监听内网 IP(
bind-address = 192.168.1.10),禁止公网直连 - 关闭 root 远程登录:
delete FROM mysql.user WHERE User='root' AND Host!='localhost'; FLUSH PRIVILEGES;
不复杂但容易忽略:真正有效的防暴力破解,从来不是靠单一机制,而是“强口令 + 日志监控 + 网络隔离 + 代理限流”四层叠加。MySQL 自身能力有限,得靠外围体系兜底。