-
MYSQL 8.0之密码管理(3)
- 1
- 2
丢弃密码更改复制到所有从属服务器后,凭据更改完成。
RETAIN CURRENT PASSWORD
和DISCARD OLD PASSWORD
子句具有以下效果:
-
RETAIN CURRENT PASSWORD
保留帐户当前密码作为其次要密码,以替换任何现有的次要密码。新密码成为主密码,但是客户端可以使用主密码或辅助密码使用该帐户连接到服务器。(例外:如果ALTER USER
或SET PASSWORD
语句指定的新密码为空,则即使给出了RETAIN CURRENT PASSWORD
,二级密码也将为空。) -
如果为具有空主密码的帐户指定
RETAIN CURRENT PASSWORD
,则该语句将失败。 -
如果帐户具有辅助密码,而您在未指定
RETAIN CURRENT PASSWORD
的情况下更改了其主密码,则辅助密码将保持不变。 -
对于
ALTER USER
,如果您更改分配给该帐户的身份验证插件,则辅助密码将被丢弃。如果您更改身份验证插件,并且还指定了RETAIN CURRENT PASSWORD
,则该语句将失败。 -
对于
ALTER USER
,DISCARD OLD PASSWORD
会丢弃辅助密码(如果存在)。该帐户仅保留其主密码,并且客户端只能使用该主密码来使用该帐户连接到服务器。
修改辅助密码的语句需要以下特权:
-
要对适用于您自己的帐户的
ALTER USER
和SET PASSWORD
语句使用RETAIN CURRENT PASSWORD
或DISCARD OLD PASSWORD
子句,必须具有APPLICATION_PASSWORD_ADMIN
特权。由于大多数用户仅需要一个密码,因此需要特权来操作您自己的辅助密码。 -
如果允许一个帐户操作所有帐户的辅助密码,则应授予该帐户
CREATE USER
特权,而不是APPLICATION_PASSWORD_ADMIN
。
随机密码生成
从MySQL 8.0.18开始,CREATE USER
,ALTER USER
和SET PASSWORD
语句具有为用户帐户生成随机密码的功能,可以替代要求管理员指定的文字密码的替代方法。本节描述了生成随机密码的共同特征。
默认情况下,生成的随机密码的长度为20个字符。该长度由generate_random_password_length系统变量控制,范围为5到255。
对于每个为其语句生成随机密码的帐户,该语句将密码存储在mysql.user
系统表中,该密码已针对帐户身份验证插件进行了适当的哈希处理。该语句还在结果集的一行中返回明文密码,以使其对执行该语句的用户或应用程序可用。结果集列被命名为用户,主机和生成的密码,指示标识mysql.user
系统表中受影响行的用户名和主机名值,以及明文生成的密码。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
将CREATE USER
,ALTER USER
或SET PASSWORD
语句生成一个帐户的随机密码,并以IDENTIFIED WITH auth_plugin AS'auth_string'
子句作为CREATE USER
或ALTER USER
语句写入二进制日志中,其中auth_plugin
是帐户身份验证插件,auth_string
是帐户的哈希密码值。
如果安装了validate_password
组件,则它实施的策略对生成的密码无效。(密码验证的目的是帮助人们创建更好的密码。)
登录失败跟踪和临时帐户锁定
从MySQL 8.0.19开始,管理员可以配置用户帐户,以便太多连续登录失败会导致临时帐户锁定。
在这种情况下,“登录失败”表示客户端在连接尝试期间无法提供正确的密码。它不包括由于未知用户或网络问题等原因导致的连接失败。对于具有双重密码的帐户(请参阅双重密码支持),两个帐户密码均视为正确。
可以使用CREATE USER
和ALTER USER
语句的FAILED_LOGIN_ATTEMPTS
和PASSWORD_LOCK_TIME
选项对每个帐户配置所需的登录失败次数和锁定时间。
示例:
- 1
- 2
- 3
- 4
- 5
当发生太多连续登录失败时,客户端会收到如下错误:
- 1
- 2
- 3
使用以下选项:
-
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
值之前发生的任何成功登录都会导致失败计数重置。例如,如果FAILED_LOGIN_ATTEMPTS
为4,并且发生了三个连续的密码失败,则必须再出现一个失败才能开始锁定。但是,如果下一次登录成功,则将重置该帐户的失败登录计数,以便再次需要四个连续的失败来锁定。 -
一旦开始临时锁定,即使使用了正确的密码,也无法成功登录,直到锁定持续时间过去或通过以下讨论中列出的一种帐户重置方法将帐户解锁。
当服务器读取授权表时,它将初始化每个帐户的状态信息,其中包括是否启用了失败登录跟踪,该帐户当前是否被临时锁定以及是否已开始锁定(如果已启用)以及该帐户发生临时锁定之前的失败次数未锁定。
-
在以下任何一种情况下,都会对所有帐户进行全局重置:
- 服务器重新启动。
-
执行
FLUSH PRIVILEGES
。(使用--skip-grant-tables
启动服务器会导致无法读取授权表,这会禁用失败登录跟踪。在这种情况下,首次执行FLUSH PRIVILEGES
会导致服务器读取授权表并启用失败-登录跟踪,以及重置所有帐户。)
-
在以下任何一种情况下都会发生按帐户重置的情况:
- 成功登录该帐户。
- 锁定持续时间过去了。在这种情况下,登录失败计数将在下次尝试登录时重置。
-
为该帐户执行将
FAILED_LOGIN_ATTEMPTS
或PASSWORD_LOCK_TIME
(或两者)设置为任何值(包括当前选项值)的帐户,或对该帐户执行ALTER USER ... UNLOCK
语句。
该帐户的其他
ALTER USER
语句对其当前的失败登录计数或锁定状态没有影响。
登录失败跟踪与用于检查凭据的登录帐户相关联。如果正在使用用户代理,则会对代理用户(而不是被代理用户)进行跟踪。也就是说,跟踪绑定到USER()
指示的帐户,而不是CURRENT_USER()
指示的帐户。有关代理和代理用户之间区别的信息。