mysql数据库中的登录失败次数与锁定策略

11次阅读

mysql 8.0.19+ 的 failed_login_attempts 和 password_lock_time 是用户级账户锁定参数,仅对 caching_sha2_password 或 sha256_password 插件用户生效,默认为0即禁用;需在 CREATE/ALTER USER 中同时指定插件和两参数才生效,存储于 mysql.user 表,不支持 my.cnf 配置。

mysql数据库中的登录失败次数与锁定策略

MySQL 8.0+ 的 failed_login_attemptspassword_lock_time 是什么

这两个参数是 MySQL 8.0.19 引入的账户锁定策略核心配置,**仅对启用了 caching_sha2_passwordsha256_password 认证插件的用户生效**。它们不作用于 mysql_native_password 用户,也不影响 root(除非显式修改其插件)。默认值均为 0,表示禁用锁定功能。

  • failed_login_attempts:连续登录失败多少次后锁定账户(设为 3 表示第 4 次失败才触发锁定)
  • password_lock_time:锁定持续小时数(设为 24 表示锁 24 小时;设为 0 表示手动解锁)
  • 两者必须同时在 CREATE USERALTER USER 中声明才生效,单独设置无效

如何为用户启用登录失败锁定

必须在创建或修改用户时显式指定认证插件和锁定参数。常见错误是只改密码或只设参数,但没换插件。

CREATE USER 'appuser'@'%'  IDENTIFIED WITH caching_sha2_password BY 'Passw0rd!'  FAILED_LOGIN_ATTEMPTS 3  PASSWORD_LOCK_TIME 1;

已存在用户需用 ALTER USER

ALTER USER 'appuser'@'%'  IDENTIFIED WITH caching_sha2_password BY 'NewPass!'  FAILED_LOGIN_ATTEMPTS 3  PASSWORD_LOCK_TIME 0;
  • PASSWORD_LOCK_TIME 0 表示锁定后只能由管理员执行 ALTER USER ... ACCOUNT UNLOCK 解锁
  • 若想自动解锁,必须设为正整数(单位:小时),不能是分钟或秒
  • 修改后无需重启 MySQL,策略立即生效

查看用户是否被锁定及解锁方法

被锁定用户的 account_locked 字段为 Y,可通过系统表查询:

SELECT user, host, account_locked, password_last_changed  FROM mysql.user  WHERE user = 'appuser';

错误提示典型为:Error 3956 (HY000): access denied for user 'appuser'@'10.0.1.5'. Account is blocked due to X failed logins.

  • 锁定期间所有认证方式(包括正确密码)均拒绝登录
  • 管理员解锁命令:ALTER USER 'appuser'@'%' ACCOUNT UNLOCK
  • 注意:如果用户使用的是 mysql_native_password 插件,account_locked 始终为 N,上述策略完全不生效

为什么 mysqld 配置文件里找不到这些参数

它们不是全局服务器变量,而是**用户级属性**,存储在 mysql.user 表中,无法通过 SET GLOBALmy.cnf 配置。试图在配置文件中写 failed_login_attempts=3 会被忽略,且启动时报警告。

  • 检查是否生效,唯一可靠方式是查 mysql.user 表对应字段
  • 备份恢复后,这些属性不会自动继承,需重新执行 ALTER USER
  • Percona Server 或 mariadb 实现不同,不兼容 MySQL 的这套语法

真正起作用的永远是表里的值,而不是你记在文档里的“应该设成多少”。

text=ZqhQzanResources