MySQL如何锁定恶意登录的用户账号_ACCOUNT LOCK与失败次数策略

1次阅读

MySQL 8.0+ 中 ACCOUNT LOCK 可立即持久锁定账号,仅阻断新连接;FAILED_LOGIN_ATTEMPTS 需启用 validate_password 插件才生效,二者共存时 ACCOUNT LOCK 优先级更高,且均需精确匹配 host 并注意认证插件兼容性。

MySQL 如何锁定恶意登录的用户账号_ACCOUNT LOCK 与失败次数策略

MySQL 8.0+ 如何用 ACCOUNT LOCK 手动锁定账号

直接执行 ALTER USER 'username'@'host' ACCOUNT LOCK; 就能立刻禁止登录,不管密码是否正确。这个锁是持久的,重启 MySQL 不会自动解除,也不会影响已存在的连接(只拦新连接)。

常见错误现象:执行后仍能登录——大概率是没刷新权限缓存,或者用户 host 匹配不精确(比如用了 'user'@'%' 锁定,但实际连接用的是 'user'@'192.168.1.100')。

  • 务必确认 host 部分完全一致,可用 SELECT User, Host FROM mysql.user; 核对
  • 执行后建议运行 FLUSH PRIVILEGES;(虽然多数情况下非必需,但能避免缓存导致的延迟生效)
  • 解锁用 ALTER USER 'username'@'host' ACCOUNT UNLOCK;

为什么 FAILED_LOGIN_ATTEMPTS 策略在 MySQL 中默认不生效

MySQL 8.0 引入了基于密码验证插件的失败次数锁定机制,但它不是开箱即用的——必须显式启用 validate_password 插件,并配置策略参数,否则 FAILED_LOGIN_ATTEMPTSPASSWORD_LOCK_TIME 这两个选项会被忽略。

使用场景:你希望某个账号输错 3 次密码就自动锁定 1 小时,而不是手动干预。

  • 先检查插件是否加载:SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'validate_password';
  • 若未启用,需在配置文件中加 plugin_load_add = validate_password.so 并重启,或运行 INSTALL PLUGIN validate_password SONAME 'validate_password.so';
  • 然后才能为用户设置:ALTER USER 'attacker'@'%' FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 60;
  • 注意:该策略仅对使用 mysql_native_passwordcaching_sha2_password 认证的用户有效;若用户用 auth_socket 等插件,此策略完全不触发

ACCOUNT LOCK 和失败次数策略混用时的真实行为

两者可以共存,但优先级不同:只要账号被 ACCOUNT LOCK 显式锁定,无论失败次数是否达标、密码是否正确,一律拒绝登录;而失败次数策略触发的锁定,本质是自动给用户加上 ACCOUNT LOCK 状态(可通过 SELECT account_locked FROM mysql.user WHERE User='xxx'; 查看)。

容易踩的坑:误以为“设了失败次数就万事大吉”,结果发现攻击者换 IP 或绕过认证插件(比如用 root 的 socket 登录再提权),导致策略形同虚设。

  • 失败次数策略只防密码爆破,不防 SQL 注入后的权限滥用
  • ACCOUNT LOCK 是最直接的应急手段,适合已确认恶意行为后快速止损
  • 锁定期间用户仍可能通过已建立的连接执行操作,如需彻底中断,得配合 KILL CONNECTION 查杀活跃会话

从日志里定位恶意登录尝试并联动处理

MySQL 默认不记录登录失败详情,必须开启 log_error_verbosity = 3(5.7.2+ / 8.0.13+),并在错误日志中搜索 Access denied for user 行,才能看到具体用户名和来源 IP。

性能影响小,但日志体积会上升;建议搭配定期清理或外部日志聚合工具使用。

  • 确认当前设置:SELECT @@log_error_verbosity;,值为 1/2/3,3 才含失败登录上下文
  • 典型失败日志行:[Warning] [MY-010055] [Server] Access denied for user 'admin'@'10.0.2.100' (using password: YES)
  • 拿到 IP 后可进一步在防火墙层封禁,或写脚本自动匹配高频失败 IP 并执行 ALTER USER …… ACCOUNT LOCK;
  • 注意:错误日志路径由 log_error 变量指定,不是所有部署都默认开启
事情说清了就结束。真正难的不是锁账号,而是判断“谁是恶意的”——日志不全、代理穿透、共享账号、合法用户输错密码,都会干扰判断。别迷信自动策略,留好手动干预的余地。

text=ZqhQzanResources