如何限制登录失败次数_mysql防暴力破解

10次阅读

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

如何限制登录失败次数_mysql防暴力破解

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 次),调用 iptablesfirewalld 封禁源 IP

部署代理层(推荐生产环境)

在 MySQL 前加一层代理(如 ProxySQL、HAProxy 或自研网关),由代理统一处理连接认证逻辑:

  • ProxySQL 支持 mysql-users 表中的 max_connectionsmax_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 自身能力有限,得靠外围体系兜底。

text=ZqhQzanResources