MySQL支持以下密码管理功能:
-
密码过期,要求密码定期更改。
-
密码重用限制,防止旧密码被重新选择。
-
密码验证,要求密码更改时指定当前密码以被替换。
-
双密码,启用客户端使用主要或次要密码连接。
-
密码强度评估,要求强密码。
-
随机密码生成,作为管理员指定明文密码的替代方案。
-
密码失败跟踪,启用临时账户锁定在多次连续错误密码登录失败后。
以下部分描述这些功能,除了密码强度评估,它使用 validate_password
组件实现,并在 第 8.4.3 节,“密码验证组件” 中描述。
MySQL 使用 mysql
系统数据库中的表来实现密码管理功能。如果您从早期版本升级 MySQL,系统表可能不够最新。在这种情况下,服务器在启动过程中写入类似以下的错误日志(确切的数字可能有所不同):
[ERROR] Column count of mysql.user is wrong. Expected
49, found 47. The table is probably corrupted
[Warning] ACL table mysql.password_history missing.
Some operations may fail.
要纠正该问题,请执行 MySQL 升级过程。请参阅 第 3 章 升级 MySQL。直到完成升级,密码更改不可用。
一些身份验证插件将账户凭证存储在 MySQL 的 mysql.user
系统表中:
-
mysql_native_password
(已弃用) -
caching_sha2_password
-
sha256_password
大多数讨论在本节适用于这些身份验证插件,因为大多数密码管理功能描述在这里基于 MySQL 自己处理的内部凭证存储。其他身份验证插件将账户凭证存储在 MySQL 之外的系统中。对于使用这些插件的账户,密码管理必须在外部系统中处理。
唯一的例外是,失败登录跟踪和临时账户锁定的选项适用于所有账户,不仅仅是使用内部凭证存储的账户,因为 MySQL 能够评估任何账户的登录尝试状态,无论它使用内部或外部凭证存储。
有关单个身份验证插件的信息,请参阅 第 8.4.1 节,“身份验证插件”。
MySQL 允许数据库管理员手动使账户密码过期,并建立自动密码过期策略。过期策略可以在全局范围内建立,并且可以在每个账户上设置为遵循全局策略或覆盖全局策略的特定行为。
要手动使账户密码过期,请使用 ALTER USER
语句:
ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE;
这将在 mysql.user
系统表中的相应行中标记密码过期。
根据策略,密码过期是自动的,基于密码年龄,该年龄从账户的最近一次密码更改日期和时间计算。 mysql.user
系统表表明每个账户的密码最后一次更改的日期和时间,服务器在客户端连接时自动将密码视为过期,如果其年龄大于其允许的生命周期。这不需要手动密码过期。
要建立全球自动密码过期策略,使用 default_password_lifetime
系统变量。其默认值为 0,禁用自动密码过期。如果 default_password_lifetime
的值是一个正整数 N
,它表明允许的密码生命周期,以便密码必须每 N
天更改一次。
示例:
-
要建立一个全球策略,使密码的生命周期约为六个月,可以在服务器的
my.cnf
文件中添加以下行:[mysqld] default_password_lifetime=180
-
要建立一个全球策略,使密码永不过期,可以将
default_password_lifetime
设置为 0:[mysqld] default_password_lifetime=0
-
default_password_lifetime
也可以在运行时设置和持久化:SET PERSIST default_password_lifetime = 180; SET PERSIST default_password_lifetime = 0;
SET PERSIST
设置当前 MySQL 实例的值。它还将值保存到后续服务器重新启动中;见 第 15.7.6.1 节,“SET 语法 for 变量赋值”。要更改当前 MySQL 实例的值,而不使其在后续重新启动中生效,可以使用GLOBAL
关键字,而不是PERSIST
。
全球密码过期策略适用于所有未设置为覆盖它的账户。要为个别账户建立策略,可以使用 PASSWORD EXPIRE
选项的 CREATE USER
和 ALTER USER
语句。见 第 15.7.1.3 节,“CREATE USER 语句”,和 第 15.7.1.1 节,“ALTER USER 语句”。
示例账户特定语句:
-
需要每 90 天更改密码:
CREATE USER 'jeffrey'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY; ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;
该过期选项覆盖了全球策略,对所有由语句命名的账户生效。
-
禁用密码过期:
CREATE USER 'jeffrey'@'localhost' PASSWORD EXPIRE NEVER; ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE NEVER;
该过期选项覆盖了全球策略,对所有由语句命名的账户生效。
-
推迟到全球过期策略,对所有由语句命名的账户生效:
CREATE USER 'jeffrey'@'localhost' PASSWORD EXPIRE DEFAULT; ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE DEFAULT;
当客户端成功连接时,服务器确定账户密码是否已过期:
-
服务器检查密码是否被手动过期。
-
否则,服务器检查密码年龄是否大于其允许的生命周期,根据自动密码过期策略。如果是,服务器认为密码已过期。
如果密码已过期(无论是手动还是自动),服务器将断开客户端连接或限制其操作(见 第 8.2.16 节,“服务器处理过期密码”)。客户端执行的操作将导致错误,直到用户建立新的账户密码:
mysql> SELECT 1;
ERROR 1820 (HY000): You must reset your password using ALTER USER
statement before executing this statement.
mysql> ALTER USER USER() IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.01 sec)
mysql> SELECT 1;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)
在客户端重置密码后,服务器恢复正常访问权限,包括当前会话和后续连接。管理员用户也可以重置账户密码,但任何现有的限制会话仍将保持限制。客户端必须断开连接并重新连接,以便执行语句。
虽然可以通过将密码设置为当前值来“重置”过期密码,但出于良好策略的考虑,最好选择不同的密码。DBA 可以通过建立适当的密码重用策略来强制执行非重用。见 密码重用策略。
MySQL 允许对以前的密码进行限制。可以根据密码更改次数、时间间隔或两者来建立限制策略。可以在全局范围内建立限制策略,并且可以让每个账户选择遵守全局策略或覆盖全局策略以实现特定的账户行为。
账户的密码历史记录包括它曾经被分配的密码。MySQL 可以限制新密码不能来自这个历史记录:
-
如果账户根据密码更改次数进行限制,那么新密码不能是最近的指定数量的密码。例如,如果最小密码更改次数设置为 3,那么新密码不能是最近的 3 个密码。
-
如果账户根据时间间隔进行限制,那么新密码不能来自密码历史记录中最新的指定天数的密码。例如,如果密码重用间隔设置为 60,那么新密码必须不在最近 60 天内曾经使用过的密码。
空密码不计入密码历史记录,并且可以随时重用。
要在全局范围内建立密码重用策略,请使用 password_history
和 password_reuse_interval
系统变量。
示例:
-
要禁止重用最近 6 个密码或最近 365 天内的密码,请在服务器
my.cnf
文件中添加以下行:[mysqld] password_history=6 password_reuse_interval=365
-
要在运行时设置和持久化变量,请使用以下语句:
SET PERSIST password_history = 6; SET PERSIST password_reuse_interval = 365;
SET PERSIST
设置当前 MySQL 实例的值,并将其保存以便在后续服务器重启时生效;见 第 15.7.6.1 节,“SET 语法 for Variable Assignment”。要在当前 MySQL 实例中更改值而不影响后续重启,请使用GLOBAL
关键字而不是PERSIST
。
全局密码重用策略适用于所有未设置为覆盖全局策略的账户。要为个别账户建立策略,请使用 PASSWORD HISTORY
和 PASSWORD REUSE INTERVAL
选项的 CREATE USER
和 ALTER USER
语句。见 第 15.7.1.3 节,“CREATE USER 语句” 和 第 15.7.1.1 节,“ALTER USER 语句”。
示例账户特定语句:
-
要求至少 5 次密码更改后才能重用:
CREATE USER 'jeffrey'@'localhost' PASSWORD HISTORY 5; ALTER USER 'jeffrey'@'localhost' PASSWORD HISTORY 5;
这个历史记录长度选项覆盖了全局策略,对所有由语句命名的账户生效。
-
要求至少 365 天后才能重用:
CREATE USER 'jeffrey'@'localhost' PASSWORD REUSE INTERVAL 365 DAY; ALTER USER 'jeffrey'@'localhost' PASSWORD REUSE INTERVAL 365 DAY;
这个时间间隔选项覆盖了全局策略,对所有由语句命名的账户生效。
-
要组合这两种类型的重用限制,请使用
PASSWORD HISTORY
和PASSWORD REUSE INTERVAL
一起:CREATE USER 'jeffrey'@'localhost' PASSWORD HISTORY 5 PASSWORD REUSE INTERVAL 365 DAY; ALTER USER 'jeffrey'@'localhost' PASSWORD HISTORY 5 PASSWORD REUSE INTERVAL 365 DAY;
这些选项覆盖了全局策略的两种重用限制,对所有由语句命名的账户生效。
-
遵守全局策略的两种重用限制:
CREATE USER 'jeffrey'@'localhost' PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT; ALTER USER 'jeffrey'@'localhost' PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT;
可以要求在更改账户密码时验证当前密码,以防止恶意用户在不知道当前密码的情况下更改密码。这种策略可以防止以下情况:
-
原始用户无法访问 MySQL,直到管理员重置账户密码。
-
直到密码重置,恶意用户可以使用原始用户的更改后的凭证访问 MySQL。
密码验证策略可以在全局范围内建立,并且可以让每个账户选择遵守全局策略或覆盖全局策略以实现特定的账户行为。
对于每个账户,其 mysql.user
行指示是否需要验证当前密码以更改密码。该设置是通过 CREATE USER
和 ALTER USER
语句的 PASSWORD REQUIRE
选项建立的:
-
如果账户设置为
PASSWORD REQUIRE CURRENT
,则密码更改必须指定当前密码。 -
如果账户设置为
PASSWORD REQUIRE CURRENT OPTIONAL
,则密码更改可以但不需要指定当前密码。 -
如果账户设置为
PASSWORD REQUIRE CURRENT DEFAULT
,则password_require_current
系统变量确定账户的验证策略:-
如果
password_require_current
启用,密码更改必须指定当前密码。 -
如果
password_require_current
禁用,密码更改可以但不需要指定当前密码。
-
换言之,如果账户设置不是 PASSWORD REQUIRE CURRENT DEFAULT
,则账户设置优先于由 password_require_current
系统变量建立的全局策略。否则,账户将遵循 password_require_current
设置。
默认情况下,密码验证是可选的:password_require_current
禁用,账户创建时没有 PASSWORD REQUIRE
选项默认为 PASSWORD REQUIRE CURRENT DEFAULT
。
以下表格显示了每个账户设置如何与 password_require_current
系统变量值交互以确定账户密码验证策略。
表 8.10 密码验证策略
Per-Account Setting | password_require_current System Variable | Password Changes Require Current Password? |
---|---|---|
PASSWORD REQUIRE CURRENT |
OFF |
是 |
PASSWORD REQUIRE CURRENT |
ON |
是 |
PASSWORD REQUIRE CURRENT OPTIONAL |
OFF |
否 |
PASSWORD REQUIRE CURRENT OPTIONAL |
ON |
否 |
PASSWORD REQUIRE CURRENT DEFAULT |
OFF |
否 |
PASSWORD REQUIRE CURRENT DEFAULT |
ON |
是 |
特权用户可以在不指定当前密码的情况下更改任何账户密码,无论验证策略如何。特权用户是指拥有全局 CREATE USER
权限或 mysql
系统数据库的 UPDATE
权限的用户。
要建立全局密码验证策略,请使用 password_require_current
系统变量。其默认值为 OFF
,因此不需要账户密码更改指定当前密码。
示例:
-
要建立一个全局策略,即密码更改必须指定当前密码,请在服务器
my.cnf
文件中添加以下行:[mysqld] password_require_current=ON
-
要设置和持久
password_require_current
在运行时,请使用类似以下语句:SET PERSIST password_require_current = ON; SET PERSIST password_require_current = OFF;
SET PERSIST
设置当前 MySQL 实例的值,并将其保存以便在后续服务器重新启动时生效;见 第 15.7.6.1 节,“SET 语法 for 变量赋值”。要更改当前 MySQL 实例的值而不使其在后续重新启动时生效,请使用GLOBAL
关键字而不是PERSIST
。
全局密码验证策略适用于所有未设置为覆盖它的帐户。要为个体帐户建立策略,请使用 PASSWORD REQUIRE
选项的 CREATE USER
和 ALTER USER
语句。请参阅 第 15.7.1.3 节,“CREATE USER 语句” 和 第 15.7.1.1 节,“ALTER USER 语句”。
示例帐户特定语句:
-
要求密码更改指定当前密码:
CREATE USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT; ALTER USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT;
该验证选项覆盖了全局策略,对所有由语句命名的帐户生效。
-
不要求密码更改指定当前密码(当前密码可以但不需要被给出):
CREATE USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT OPTIONAL; ALTER USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT OPTIONAL;
该验证选项覆盖了全局策略,对所有由语句命名的帐户生效。
-
推迟到全局密码验证策略,对所有由语句命名的帐户生效:
CREATE USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT DEFAULT; ALTER USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT DEFAULT;
当前密码的验证在用户使用 ALTER USER
或 SET PASSWORD
语句更改密码时生效。示例使用 ALTER USER
,它比 SET PASSWORD
更好,但这里描述的原则对两种语句都是相同的。
在密码更改语句中,REPLACE
子句指定要被替换的当前密码。示例:
-
更改当前用户的密码:
ALTER USER USER() IDENTIFIED BY 'auth_string' REPLACE 'current_auth_string';
-
更改命名用户的密码:
ALTER USER 'jeffrey'@'localhost' IDENTIFIED BY 'auth_string' REPLACE 'current_auth_string';
-
更改命名用户的身份验证插件和密码:
ALTER USER 'jeffrey'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'auth_string' REPLACE 'current_auth_string';
该 REPLACE
子句的工作方式如下:
-
REPLACE
必须给出,如果帐户的密码更改需要指定当前密码,以验证用户实际知道当前密码。 -
REPLACE
是可选的,如果帐户的密码更改可以但不需要指定当前密码。 -
如果指定了
REPLACE
,它必须指定正确的当前密码,否则将发生错误。这甚至适用于REPLACE
是可选的。 -
REPLACE
只能在更改当前用户的帐户密码时指定。(这意味着在上面的示例中,对于jeffrey
的语句将失败,除非当前用户是jeffrey
。)这甚至适用于特权用户;但是,这样的用户可以更改任何密码而不需要指定REPLACE
。 -
REPLACE
将从二进制日志中省略,以避免将明文密码写入其中。
用户帐户可以拥有双密码,分别称为主密码和次要密码。双密码功能使得可以在以下场景中无缝地执行凭证更改:
-
系统具有大量 MySQL 服务器,可能涉及复制。
-
多个应用程序连接到不同的 MySQL 服务器。
-
需要定期更改帐户或帐户的凭证,以便连接到服务器。
考虑在上述场景中,当帐户仅允许单个密码时,如何执行凭证更改。这种情况下,需要紧密合作,以便在所有服务器上同时更改帐户密码,并更新所有使用该帐户的应用程序以使用新密码。这可能会导致停机时间,期间服务器或应用程序不可用。
使用双密码,可以更容易地执行凭证更改,分阶段进行,且无需停机:
-
对于每个受影响的帐户,在服务器上建立新的主密码,保留当前密码作为次要密码。这使得服务器可以识别每个帐户的主密码或次要密码,而应用程序可以继续使用相同的密码连接到服务器(现在是次要密码)。
-
在密码更改传播到所有服务器后,修改使用受影响帐户的应用程序,以使用帐户的主密码连接到服务器。
-
所有应用程序从辅助密码迁移到主要密码后,辅助密码不再需要并可以被丢弃。在此更改传播到所有服务器后,只有每个帐户的主要密码可以用于连接。凭证更改现在已完成。
MySQL 实现双密码功能,语法保存和丢弃辅助密码:
-
使用
RETAIN CURRENT PASSWORD
子句的ALTER USER
和SET PASSWORD
语句将当前密码保存为辅助密码,当您分配新主要密码时。 -
使用
DISCARD OLD PASSWORD
子句的ALTER USER
丢弃帐户辅助密码,只留下主要密码。
假设在之前描述的凭证更改场景中,使用帐户名为 'appuser1'@'host1.example.com'
的应用程序连接到服务器,并且帐户密码将从 '
更改为 password_a
''
。password_b
'
要执行此凭证更改,请使用 ALTER USER
语句如下:
-
在每个非副本服务器上,建立
'
作为新的password_b
'appuser1
主要密码,保留当前密码作为辅助密码:ALTER USER 'appuser1'@'host1.example.com' IDENTIFIED BY 'password_b' RETAIN CURRENT PASSWORD;
-
等待密码更改传播到整个系统的所有副本。
-
修改每个使用
appuser1
帐户的应用程序,以便它使用密码'
而不是password_b
''
连接到服务器。password_a
' -
此时,辅助密码不再需要。在每个非副本服务器上,丢弃辅助密码:
ALTER USER 'appuser1'@'host1.example.com' DISCARD OLD PASSWORD;
-
在丢弃密码更改传播到所有副本后,凭证更改已完成。
RETAIN CURRENT PASSWORD
和 DISCARD OLD PASSWORD
子句具有以下效果:
-
RETAIN CURRENT PASSWORD
保留帐户当前密码作为辅助密码,替换任何现有的辅助密码。新的密码成为主要密码,但客户端可以使用帐户连接到服务器,使用主要密码或辅助密码。(例外:如果新密码为空,则辅助密码也为空,即使指定了RETAIN CURRENT PASSWORD
。) -
如果您指定
RETAIN CURRENT PASSWORD
对于具有空主要密码的帐户,语句将失败。 -
如果帐户具有辅助密码,并且您更改其主要密码而不指定
RETAIN CURRENT PASSWORD
,则辅助密码保持不变。 -
对于
ALTER USER
,如果您更改了分配给帐户的身份验证插件,辅助密码将被丢弃。如果您更改身份验证插件并指定RETAIN CURRENT PASSWORD
,语句将失败。 -
对于
ALTER USER
,DISCARD OLD PASSWORD
丢弃辅助密码,如果存在辅助密码。帐户仅保留主要密码,客户端只能使用主要密码连接到服务器。
修改辅助密码的语句需要以下权限:
-
需要
APPLICATION_PASSWORD_ADMIN
权限来使用RETAIN CURRENT PASSWORD
或DISCARD OLD PASSWORD
子句 дляALTER USER
和SET PASSWORD
语句,应用于您自己的帐户。该权限是必需的,因为大多数用户只需要一个密码。 -
如果账户需要允许操纵所有账户的次要密码,它应该被授予
CREATE USER
权限,而不是APPLICATION_PASSWORD_ADMIN
权限。
CREATE USER
、 ALTER USER
和 SET PASSWORD
语句可以生成随机密码用于用户账户,而不是需要管理员明确指定的文字密码。请参阅每个语句的描述以获取语法详细信息。本节描述了生成的随机密码的共同特征。
默认情况下,生成的随机密码的长度为 20 个字符。该长度由 generated_random_password_length
系统变量控制,范围从 5 到 255。
对于每个账户,语句生成随机密码,并将其存储在 mysql.user
系统表中,适当地哈希用于账户身份验证插件。语句还将明文密码返回到结果集的行中,以便用户或执行语句的应用程序可用。结果集的列名为 user
、host
、generated password
和 auth_factor
,分别表示用户名称和主机名称值,标识 mysql.user
系统表中的受影响行,明文生成的密码和身份验证因子显示的密码值适用。
mysql> CREATE USER
'u1'@'localhost' IDENTIFIED BY RANDOM PASSWORD,
'u2'@'%.example.com' IDENTIFIED BY RANDOM PASSWORD,
'u3'@'%.org' IDENTIFIED BY RANDOM PASSWORD;
+------+---------------+----------------------+-------------+
| user | host | generated password | auth_factor |
+------+---------------+----------------------+-------------+
| u1 | localhost | iOeqf>Mh9:;XD&qn(Hl} | 1 |
| u2 | %.example.com | sXTSAEvw3St-R+_-C3Vb | 1 |
| u3 | %.org | nEVe%Ctw/U/*Md)Exc7& | 1 |
+------+---------------+----------------------+-------------+
mysql> ALTER USER
'u1'@'localhost' IDENTIFIED BY RANDOM PASSWORD,
'u2'@'%.example.com' IDENTIFIED BY RANDOM PASSWORD;
+------+---------------+----------------------+-------------+
| user | host | generated password | auth_factor |
+------+---------------+----------------------+-------------+
| u1 | localhost | Seiei:&cw}8]@3OA64vh | 1 |
| u2 | %.example.com | j@&diTX80l8}(NiHXSae | 1 |
+------+---------------+----------------------+-------------+
mysql> SET PASSWORD FOR 'u3'@'%.org' TO RANDOM;
+------+-------+----------------------+-------------+
| user | host | generated password | auth_factor |
+------+-------+----------------------+-------------+
| u3 | %.org | n&cz2xF;P3!U)+]Vw52H | 1 |
+------+-------+----------------------+-------------+
生成随机密码的 CREATE USER
、ALTER USER
或 SET PASSWORD
语句将被写入二进制日志作为 CREATE USER
或 ALTER USER
语句,带有 IDENTIFIED WITH
子句,其中 auth_plugin
AS 'auth_string
'auth_plugin
是账户身份验证插件,'
是账户哈希密码值。auth_string
'
如果安装了 validate_password
组件,那么它实施的策略对生成的密码没有影响。(密码验证的目的是帮助人类创建更好的密码。)
管理员可以配置用户账户,使得连续登录失败导致临时账户锁定。
“登录失败” 在这里指的是客户端在连接尝试期间提供不正确密码的失败,不包括由于未知用户或网络问题而无法连接的失败。对于具有双密码的账户(见 双密码支持),任一账户密码都被视为正确。
需要的登录失败次数和锁定时间可以根据每个账户使用 FAILED_LOGIN_ATTEMPTS
和 PASSWORD_LOCK_TIME
选项配置,使用 CREATE USER
和 ALTER USER
语句。例如:
CREATE USER 'u1'@'localhost' IDENTIFIED BY 'password'
FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 3;
ALTER USER 'u2'@'localhost'
FAILED_LOGIN_ATTEMPTS 4 PASSWORD_LOCK_TIME UNBOUNDED;
当太多连续登录失败时,客户端将收到以下错误:
ERROR 3957 (HY000): Access denied for user user.
Account is blocked for D day(s) (R day(s) remaining)
due to N consecutive failed logins.
使用以下选项:
-
FAILED_LOGIN_ATTEMPTS
N
该选项指示是否跟踪账户登录尝试,指定了不正确的密码。数字
N
指定了连续不正确密码导致临时账户锁定的次数。 -
PASSWORD_LOCK_TIME {
N
| UNBOUNDED}此选项指示在多次连续登录尝试提供错误密码后锁定帐户的时间。该值是一个数字
N
,指定帐户保持锁定的天数,或者UNBOUNDED
,指定帐户进入暂时锁定状态时,该状态的持续时间不受限制,直到帐户被解锁。帐户解锁的条件将在后面描述。
每个选项的允许值 N
的范围从 0 到 32767。值为 0 将禁用该选项。
失败登录跟踪和临时帐户锁定的特征是:
-
要使失败登录跟踪和临时帐户锁定对帐户生效,必须将其
FAILED_LOGIN_ATTEMPTS
和PASSWORD_LOCK_TIME
选项都设置为非零。 -
对于
CREATE USER
,如果FAILED_LOGIN_ATTEMPTS
或PASSWORD_LOCK_TIME
未指定,则其隐式默认值为 0,对所有由语句命名的帐户。这意味着失败登录跟踪和临时帐户锁定被禁用。 -
对于
ALTER USER
,如果FAILED_LOGIN_ATTEMPTS
或PASSWORD_LOCK_TIME
未指定,则其值保持不变,对所有由语句命名的帐户。 -
要使临时帐户锁定生效,密码失败必须是连续的。任何成功的登录尝试都将重置失败计数。例如,如果
FAILED_LOGIN_ATTEMPTS
是 4,并且已经发生了三次连续密码失败,那么需要再次失败以开始锁定。但是,如果下一个登录尝试成功,失败计数将被重置,以便四次连续失败再次锁定。 -
一旦临时锁定开始,即使使用正确的密码,也不能成功登录,直到锁定期限结束或帐户被解锁。
当服务器读取授权表时,它将初始化每个帐户的状态信息,包括是否启用失败登录跟踪、帐户当前是否临时锁定、锁定开始时间(如果锁定)和失败前锁定所需的失败次数(如果未锁定)。
帐户的状态信息可以被重置,这意味着失败计数将被重置,帐户将被解锁(如果当前临时锁定)。帐户重置可以是全局的,对所有帐户,或者是每个帐户:
-
所有帐户的全局重置将在以下任何条件下发生:
-
服务器重启。
-
执行
FLUSH PRIVILEGES
。(使用--skip-grant-tables
启动服务器时,授权表不会被读取,从而禁用失败登录跟踪。在这种情况下,第一次执行FLUSH PRIVILEGES
将导致服务器读取授权表并启用失败登录跟踪,除了重置所有帐户外。)
-
-
每个帐户的重置将在以下任何条件下发生:
-
帐户的成功登录。
-
锁定期限结束。在这种情况下,失败计数将在下一次登录尝试时重置。
-
执行
ALTER USER
语句以设置帐户的FAILED_LOGIN_ATTEMPTS
或PASSWORD_LOCK_TIME
(或两者),或执行ALTER USER ... UNLOCK
语句以解锁帐户。其他
ALTER USER
语句对帐户的当前失败计数或锁定状态没有影响。
-
失败登录跟踪与用于检查凭证的登录帐户相关。如果使用代理用户,则跟踪将应用于代理用户,而不是代理的用户。也就是说,跟踪与 USER()
指示的帐户相关,而不是 CURRENT_USER()
指示的帐户相关。有关代理用户和代理用户之间的区别的信息,请参阅 第 8.2.19 节,“Proxy Users”。