VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 数据库 > MySQL >
  • MYSQL 8.0之密码管理

密码管理

MySQL支持以下密码管理功能:

  • 密码到期,要求定期更改密码。
  • 密码重用限制,以防止再次选择旧密码。
  • 密码验证,要求更改密码还指定要替换的当前密码。
  • 双密码,使客户端可以使用主密码或辅助密码进行连接。
  • 密码强度评估,要求使用强密码。
  • 随机密码生成,作为要求管理员指定明确的文字密码的替代方法。
  • 密码失败跟踪,用于在连续多次错误密码登录失败后启用临时帐户锁定。

以下各节描述了这些功能,但密码强度评估功能除外,后者是使用validate_password组件实现的,在这之前笔者已将这个组件卸载了。

重要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.
  • 1
  • 2

要解决此问题,请执行MySQL升级过程。请参见升级MySQL。在此之前,无法更改密码。

内部与外部凭证存储

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

  • mysql_native_password
  • caching_sha2_password
  • sha256_password

本节中的大多数讨论都适用于此类身份验证插件,因为此处描述的大多数密码管理功能都是基于MySQL本身处理的内部凭据存储。其他身份验证插件将帐户凭据存储在MySQL的外部。对于使用插件针对外部凭据系统执行身份验证的帐户,密码管理也必须在外部针对该系统进行处理。

唯一的例外是登录失败跟踪和临时帐户锁定的选项适用于所有帐户,而不仅限于使用内部凭据存储的帐户,因为MySQL能够评估任何帐户的登录尝试状态,无论它是使用内部帐户还是内部帐户。外部凭证存储。

密码过期策略

MySQL使数据库管理员可以手动使帐户密码过期,并建立自动密码过期策略。可以在全局范围内建立到期策略,并且可以将各个帐户设置为遵从全局策略,或者以特定的每个帐户行为覆盖全局策略。 要手动使帐户密码失效,请使用ALTER USER语句:

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

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

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

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

示例:

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

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

    [mysqld]
    default_password_lifetime=0
    
    • 1
    • 2
  • 还可以在运行时设置default_password_lifetime并将其持久化:

    SET PERSIST default_password_lifetime = 180;
    SET PERSIST default_password_lifetime = 0;
    
    • 1
    • 2

    SET PERSIST设置正在运行的MySQL实例的值。它还保存该值以继续进行后续服务器重新启动。要更改正在运行的MySQL实例的值而不使它继续进行后续的重新启动,请使用GLOBAL关键字而不是PERSIST

全局密码过期策略适用于尚未设置为覆盖该策略的所有帐户。要为单个帐户建立策略,请使用CREATE USERALTER USER语句的PASSWORD EXPIRE选项。

一个对账单示例

  • 要求每90天更改一次密码:

    CREATE USER 'jeffrey'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;
    ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;
    
    • 1
    • 2

    该到期选项将覆盖该语句命名的所有帐户的全局策略。

  • 禁用密码有效期:

    CREATE USER 'jeffrey'@'localhost' PASSWORD EXPIRE NEVER;
    ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE NEVER;
    
    • 1
    • 2

    该到期选项将覆盖该语句命名的所有帐户的全局策略。

  • 对语句命名的所有帐户遵循全局到期策略:

    CREATE USER 'jeffrey'@'localhost' PASSWORD EXPIRE DEFAULT;
    ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE DEFAULT;
    
    • 1
    • 2

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

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

如果密码已过期(无论是手动还是自动),则服务器将断开客户端连接或限制其允许的操作。受限制的客户端执行的操作会导致错误,直到用户建立新的帐户密码为止:

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

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

提示 注意尽管可以通过将过期的密码设置为当前值来“重置”它,但出于良好的政策考虑,最好选择其他密码。DBA可以通过建立适当的密码重用策略来强制不重用。请参阅密码重用策略。

密码重用策略

MySQL允许对重用以前的密码进行限制。可以根据密码更改的次数,经过的时间或同时基于两者来建立重用限制。可以在全局范围内建立重用策略,并且可以将各个帐户设置为遵从全局策略,或者使用特定的按帐户行为替换全局策略。

帐户的密码历史记录由过去分配的密码组成。MySQL可以限制从以下历史记录中选择新密码:

  • 如果根据密码更改次数限制了帐户,则无法从指定数量的最新密码中选择新密码。例如,如果密码更改的最小次数设置为3,则新密码不能与最新的3个密码相同。

  • 如果根据时间限制了帐户,则无法从历史记录中指定天数以上的密码中选择新密码。例如,如果密码重用间隔设置为60,则新密码一定不能属于过去60天内先前选择的密码。

提示 空密码不计入密码历史记录,并且随时可以重复使用。

要全局建立密码重用策略,请使用password_historypassword_reuse_interval系统变量。

示例

  • 要禁止重复使用最后6个密码或比365天新的密码,请在服务器my.cnf文件中添加以下行:

    [mysqld]
    password_history=6
    password_reuse_interval=365
    
    • 1
    • 2
    • 3
  • 要在运行时设置和保留变量,请使用如下语句:

    SET PERSIST password_history = 6;
    SET PERSIST password_reuse_interval = 365;
    
    • 1
    • 2

    SET PERSIST设置正在运行的MySQL实例的值。它还保存该值以继续进行后续服务器重新启动。要更改正在运行的MySQL实例的值而不使它继续进行后续的重新启动,请使用GLOBAL关键字而不是PERSIST

一个对账单示例

  • 在允许重复使用之前,至少需要更改5次密码:

    CREATE USER 'jeffrey'@'localhost' PASSWORD HISTORY 5;
    ALTER USER 'jeffrey'@'localhost' PASSWORD HISTORY 5;
    
    • 1
    • 2

    此历史记录长度选项将覆盖该语句命名的所有帐户的全局策略。

  • 至少需要经过365天,才能允许重复使用:

    CREATE USER 'jeffrey'@'localhost' PASSWORD REUSE INTERVAL 365 DAY;
    ALTER USER 'jeffrey'@'localhost' PASSWORD REUSE INTERVAL 365 DAY;
    
    • 1
    • 2

    这个“过去时间”的选项会覆盖该语句命名的所有帐户的全局策略。

  • 要结合两种类型的重用限制,请一起使用PASSWORD HISTORYPASSWORD 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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    这些选项覆盖了该语句命名的所有帐户的全局策略重用限制。

  • 对于这两种类型的重用限制,请遵循全局策略:

    CREATE USER 'jeffrey'@'localhost'
      PASSWORD HISTORY DEFAULT
      PASSWORD REUSE INTERVAL DEFAULT;
    ALTER USER 'jeffrey'@'localhost'
      PASSWORD HISTORY DEFAULT
    PASSWORD REUSE INTERVAL DEFAULT;