6.2.11 密码 Management

MySQL 使数据库 Management 员可以手动使帐户密码过期,并构建自动密码过期策略。可以在 Global 范围内构建到期策略,并且可以将各个帐户设置为服从全局策略,或者使用特定的按帐户行为替换全局策略。

内部与外部凭证存储

一些身份验证插件将帐户凭据存储在 MySQL 内部的mysql.user系统 table 中:

  • mysql_native_password

  • sha256_password

本节中的讨论适用于此类身份验证插件,因为此处描述的密码 Management 功能基于 MySQL 本身处理的内部凭据存储。

其他身份验证插件将帐户凭据存储在 MySQL 的外部。对于使用插件针对外部凭据系统执行身份验证的帐户,密码 Management 也必须针对该系统从外部进行处理。

有关单个身份验证插件的信息,请参见第 6.4.1 节“身份验证插件”

密码过期 Policy

要手动使帐户密码失效,请使用ALTER USER语句:

ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE;

此操作在相应的mysql.user系统 table 行中标记密码已过期。

根据策略,密码有效期是自动的,并且基于密码有效期,对于给定帐户,将从最近一次密码更改的日期和时间开始评估。 mysql.user系统 table 为每个帐户指示上次更改密码的时间,如果服务器的使用期限大于允许的使用期限,则服务器会在 Client 端连接时自动将其视为过期密码。这没有明确的手动密码有效期。

要全局构建自动密码过期策略,请使用default_password_lifetime系统变量。其默认值为 0,这将禁用自动密码过期。如果default_password_lifetime的值为正整数* N ,则 table 示允许的密码有效期,因此必须每 N *天更改一次密码。

Note

在 5.7.11 之前,默认的default_password_lifetime值为 360(密码大约每年必须更改一次)。对于此类版本,请注意,如果您未对default_password_lifetime变量或单个用户帐户进行任何更改,则每个用户密码将在 360 天后过期,并且该帐户开始以受限模式运行。使用该帐户连接到服务器的 Client 端会收到错误消息,指示必须更改密码:ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

但是,对于自动连接到服务器的 Client 端(例如通过脚本进行的连接),这很容易错过。为避免此类 Client 端由于密码过期而突然停止工作,请确保更改这些 Client 端的密码过期设置,如下所示:

ALTER USER 'script'@'localhost' PASSWORD EXPIRE NEVER

或者,将default_password_lifetime变量设置为0,从而禁用所有用户的自动密码过期。

Examples:

  • 要构建密码有效期大约为六个月的全局策略,请使用服务器my.cnf文件中的以下行启动服务器:
[mysqld]
default_password_lifetime=180
[mysqld]
default_password_lifetime=0
SET GLOBAL default_password_lifetime = 180;
SET GLOBAL default_password_lifetime = 0;

全局密码过期策略适用于尚未设置为覆盖该策略的所有帐户。要为单个帐户构建策略,请使用CREATE USERALTER USER语句的PASSWORD EXPIRE选项。参见第 13.7.1.2 节“ CREATE USER 语句”第 13.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;

Client 端成功连接后,服务器将确定帐户密码是否已过期:

  • 服务器检查密码是否已手动过期。

  • 否则,服务器会根据自动密码过期策略检查密码使用期限是否大于其允许的使用期限。如果是这样,则服务器认为密码已过期。

如果密码已过期(无论是手动还是自动),则服务器将断开与 Client 端的连接或限制对其允许的操作(请参见第 6.2.12 节“过期密码的服务器处理”)。受限制的 Client 端执行的操作会导致错误,直到用户构建新的帐户密码为止:

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)

这种受限的操作模式允许SET语句,如果必须使用SET PASSWORD而不是ALTER USER且帐户密码具有要求将old_passwords设置为不同于默认值的哈希格式,则在 MySQL 5.7.6 之前很有用。

Client 端重置密码后,服务器将恢复会话以及使用该帐户的后续连接的正常访问。Management 用户也可以重设帐户密码,但是该帐户的所有现有受限会话仍然受到限制。使用该帐户的 Client 端必须断开连接并重新连接,然后语句才能成功执行。

Note

尽管可以通过将过期的密码设置为当前值来“重置”它,但出于良好的 Policy 考虑,最好选择其他密码。