Documentation Home

6.2.11 密码管理

MySQL 使数据库管理员能够手动使帐户密码过期,并建立自动密码过期策略。可以在全球范围内建立过期策略,并且可以将各个帐户设置为遵循全局策略或使用特定的每个帐户行为覆盖全局策略。

内部与外部凭证存储

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

  • mysql_native_password

  • sha256_password

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

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

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

密码过期政策

要手动使帐户密码过期,请使用以下 ALTER USER语句:

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

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

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

要在全局范围内建立自动密码过期策略,请使用default_password_lifetime 系统变量。它的默认值为 0,即禁用自动密码过期。如果 的值为 default_password_lifetime正整数N,则表示允许的密码生存期,即每天必须更改密码N

笔记

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

然而,对于自动连接到服务器的客户端来说,这很容易被忽略,例如从脚本建立的连接。为避免此类客户端因密码过期而突然停止工作,请确保更改这些客户端的密码过期设置,如下所示:

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

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

例子:

  • 要建立密码有效期约为六个月的全局策略,请在服务器my.cnf文件中使用以下行启动服务器:

    [mysqld]
    default_password_lifetime=180
  • 要建立密码永不过期的全局策略,请设置 default_password_lifetime 为 0:

    [mysqld]
    default_password_lifetime=0
  • default_password_lifetime 也可以在运行时更改:

    SET GLOBAL default_password_lifetime = 180;
    SET GLOBAL default_password_lifetime = 0;

全局密码过期策略适用于所有未设置为覆盖它的帐户。要为个人帐户建立策略,请使用和 语句的PASSWORD EXPIRE 选项。请参阅 第 13.7.1.2 节,“CREATE USER 语句”第 13.7.1.1 节,“ALTER USER 语句”CREATE USERALTER 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;

当客户端连接成功后,服务端判断账号密码是否过期:

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

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

If the password is expired (whether manually or automatically), the server either disconnects the client or restricts the operations permitted to it (see Section 6.2.12, “Server Handling of Expired Passwords”). Operations performed by a restricted client result in an error until the user establishes a new account password:

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)

This restricted mode of operation permits SET statements, which is useful before MySQL 5.7.6 if SET PASSWORD must be used instead of ALTER USER and the account password has a hashing format that requires old_passwords to be set to a value different from its default.

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

笔记

虽然可以通过将过期的密码设置为当前值来重置该密码,但作为一种好的策略,最好选择一个不同的密码。