mysql通过connection_control插件实现登录失败防护,连续输错5次密码后将触发连接延迟,虽无直接账户锁定功能,但可结合ACCOUNT LOCK和外部工具构建完整防护体系。

MySQL 本身不直接提供登录失败锁定策略(如连续输错密码5次就锁定账户),但可以通过插件方式实现,最常用的是使用 mysql_native_password 或 caching_sha2_password 配合 failed_login_attempts 插件来实现登录失败锁定功能。从 MySQL 8.0 开始,支持通过企业级插件或社区版的类似机制来配置。
启用登录失败锁定策略(适用于 MySQL 8.0+)
MySQL 提供了一个名为 connection_control 的插件,它可以限制登录失败后的重试行为,实现延迟登录甚至间接锁定账户的效果。虽然它不是直接“锁定账号”,但可通过增加登录延迟来防止暴力破解。
步骤如下:
- 安装 connection_control 插件
执行以下 SQL 命令启用插件:
INSTALL PLUGIN connection_control SONAME ‘connection_control.so’;
INSTALL PLUGIN connection_control_failed_login_attempts SONAME ‘connection_control.so’;
- 验证插件是否已加载
select PLUGIN_NAME, PLUGIN_STATUS FROM information_schema.PLUGINS
WHERE PLUGIN_NAME LIKE ‘%connection%’;
输出中应看到 connection_control 和 connection_control_failed_login_attempts 状态为 ACTIVE。
配置登录失败处理参数
修改以下系统变量来定义失败尝试的行为:
- connection_control_failed_connections_threshold:允许连续失败的次数(例如 5 次)
- connection_control_min_connection_delay:达到阈值后,最小延迟时间(毫秒)
- connection_control_max_connection_delay:最大延迟时间,控制登录等待上限
示例设置:
SET GLOBAL connection_control_failed_connections_threshold = 5;
SET GLOBAL connection_control_min_connection_delay = 1000; — 1秒
SET GLOBAL connection_control_max_connection_delay = 3600000; — 1小时
当某个IP连续输错密码超过5次,后续连接将被强制延迟,延迟时间逐步增加,达到阻断效果。
持久化配置(避免重启失效)
上述 SET GLOBAL 只在运行时生效。要永久生效,需写入 MySQL 配置文件(如 my.cnf 或 my.ini):
[mysqld]
plugin-load-add=connection_control.so
connection-control-failed-login-attempts=ON
connection_control_failed_connections_threshold = 5
connection_control_min_connection_delay = 1000
connection_control_max_connection_delay = 3600000
保存后重启 MySQL 服务使配置永久生效。
补充:真正“锁定账户”需结合用户管理
如果需要完全锁定用户(如锁定30分钟),MySQL 原生不支持,但可通过以下方式实现:
- 编写外部监控脚本,检测错误日志中的失败登录,自动执行 ALTER USER ‘user’@’host’ ACCOUNT LOCK;
- 使用应用层认证控制,避免频繁试探数据库账户
- 结合防火墙或 fail2ban 工具封禁恶意 IP
例如手动锁定用户:
ALTER USER ‘testuser’@’localhost’ ACCOUNT LOCK;
解锁:
ALTER USER ‘testuser’@’localhost’ ACCOUNT UNLOCK;
基本上就这些。MySQL 通过插件能有效缓解暴力破解,虽无直接“失败N次就锁定”的功能,但配合 connection_control 插件和账户锁机制,可以构建较安全的登录防护体系。注意定期检查日志和监控异常登录行为。


