MySQL 8新特性--增强密码管理

4. 密码管理的新特性

MySQL8.0中支持保存已使用过的历史密码,这样可以限制重复利用以前的密码,增加安全性。DBA可以要求在某些密码更改或某时间段内不可以和之前的密码相同。 可以在全局以及每个帐户的基础上建立密码重用策略。
也可以阻止用户如果不知道当前密码,那么就无法修改密码。
现在允许帐户具有双密码,这使得可以在复杂的多服务器系统中无缝地执行分阶段密码更改,而无需停机。
下面将对上面提到的三个新特性进行一一说明:

4.1. 密码的重复使用策略

MySQL允许对重用以前的密码进行限制。 可以根据密码更改次数,已用时间或两者来确定重用限制。 可以在全局建立重用策略,并且可以将个人帐户设置为遵循全局策略或使用指定的某个帐户行为来覆盖全局策略。
帐户的密码历史记录包含着过去分配的密码。 MySQL可以限制从此历史记录中选择新密码:

  • 如果根据密码更改次数限制帐户,则无法从指定数量的最新密码中选择新密码。 例如,如果密码更改的最小数量设置为3,则新密码不能与最近最新的3个密码相同。
  • 如果根据已用时间限制帐户,则无法从历史记录中比指定天数更新的密码中选择新密码。 例如,如果密码重用间隔设置为60,则新密码不能和过去60天内的密码相同。
    注:空密码不会算在密码历史记录中。

想要设置密码重用策略,可以通过设置password_history 和password_reuse_interval系统变量来实现:
默认都是0,即不启用重用密码策略。

  • password_history
    Command-Line Format:–password-history=#
    Introduced:8.0.3
    System Variable:password_history
    Scop:Global
    Dynamic:Yes
    SET_VAR Hint Applies:No
    Type:Integer
    Default Value:0
    Minimum Value:0
    Maximum Value:4294967295
  • password_reuse_interval
    Command-Line Format:–password-reuse-interval=#
    Introduced:8.0.3
    System Variable:password_reuse_interval
    Scope:Global
    Dynamic:Yes
    SET_VAR Hint Applies:No
    Type: Integer
    Default Value:0
    Minimum Value:0
    Maximum Value:4294967295

可以在my.cnf文件中指定:

[mysqld]
password_history=6
password_reuse_interval=365

也可以通过命令来实时修改,可以随时生效而且是永久生效

mysql> SET PERSIST password_history = 6;
Query OK, 0 rows affected (0.00 sec)

mysql> SET PERSIST password_reuse_interval = 365;
Query OK, 0 rows affected (0.00 sec)

可以在通过CREATE USER或ALTER USER…PASSWORD HISTORY 和 PASSWORD REUSE INTERVAL来覆盖全局的参数值:

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

    CREATE USER ‘lei’@‘localhost’ PASSWORD HISTORY 5;
    ALTER USER ‘lei’@‘localhost’ PASSWORD HISTORY 5;

  • 在允许重用之前,至少需要经过365天:

      CREATE USER 'lei'@'localhost' PASSWORD REUSE INTERVAL 365 DAY;
      ALTER USER 'lei'@'localhost' PASSWORD REUSE INTERVAL 365 DAY;
    
  • 也可以两个都指定,也就是要同时满足两个条件

      CREATE USER 'lei'@'localhost'
        PASSWORD HISTORY 5
        PASSWORD REUSE INTERVAL 365 DAY;
      ALTER USER 'lei'@'localhost'
        PASSWORD HISTORY 5
        PASSWORD REUSE INTERVAL 365 DAY;
    
  • 还原到全局的设置

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

4.2. 密码必要的验证策略

在8.0.13中支持该特性(select version()查看版本),简单来说就是修改密码,要输入当前的密码。这样会大大增强用户的安全性。同样,该策略可以全局设置,也可以指定用户设置,也可以覆盖全局设置。

  • PASSWORD REQUIRE CURRENT
    修改密码,需要提供当前的密码

  • PASSWORD REQUIRE CURRENT OPTIONAL
    修改密码,不需要提供当前的密码

  • PASSWORD REQUIRE CURRENT DEFAULT
    需要根据password_require_current系统变量的设置来决定是否需要提供当前的密码:如果是ON,则需要,否则不需要。

  • 全局设置
    通过写入my.cnf配置文件
    [mysqld]
    password_require_current=ON
    或通过SET PERSIST命令设置
    SET PERSIST password_require_current = ON;

  • 用户级别设置
    需要当前密码

    CREATE USER ‘lei’@‘localhost’ PASSWORD REQUIRE CURRENT;
    ALTER USER ‘lei’@‘localhost’ PASSWORD REQUIRE CURRENT;
    不需要当前密码

    CREATE USER ‘lei’@‘localhost’ PASSWORD REQUIRE CURRENT OPTIONAL;
    ALTER USER ‘lei’@‘localhost’ PASSWORD REQUIRE CURRENT OPTIONAL;
    由系统变量password_require_current的设置决定

    CREATE USER ‘lei’@‘localhost’ PASSWORD REQUIRE CURRENT DEFAULT;
    ALTER USER ‘lei’@‘localhost’ PASSWORD REQUIRE CURRENT DEFAULT;
    下表是密码验证策略的简单说明
    用户设置 password_require_current设置 是否需要当前密码

    PASSWORD REQUIRE CURRENT OFF YES
    PASSWORD REQUIRE CURRENT ON YES
    PASSWORD REQUIRE CURRENT OPTIONAL OFF NO
    PASSWORD REQUIRE CURRENT OPTIONAL ON NO
    PASSWORD REQUIRE CURRENT DEFAULT OFF NO
    PASSWORD REQUIRE CURRENT DEFAULT ON YES
    只要用户指定了PASSWORD REQUIRE CURRENT就需要当前的密码,会系统变量password_require_current的设置。

    注:上面所提到的都是用户修改自己的密码的策略,而如果是一个有权限的用户去修改其他用户的密码是不受上面策略影响的。即:有CREATE USER或对mysql有UPDATE权限即可。

如果要修改用户密码,可以通过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’;
4.2.1. 具体例子

创建一个用户,指定PASSWORD REQUIRE CURRENT

mysql> CREATE USER 'lei'@'localhost' IDENTIFIED BY '123456' PASSWORD REQUIRE CURRENT;
Query OK, 0 rows affected (0.05 sec)

用该用户登录并修改密码

[root@ka-m ~]# mysql -ulei -p
Enter password:
mysql> alter user lei@localhost identified by '12345';
ERROR 13226 (HY000): Current password needs to be specified in the REPLACE clause in order to change it.

可以很清楚的看到提示:必须通过REPLACE字句指定当前密码
–通过REPLACE指定当前密码

mysql> alter user lei@localhost identified by '12345' REPLACE '123456';
Query OK, 0 rows affected (0.16 sec)

成功了!

4.3. 双密码

在8.0.14版本中,用户支持双密码(主密码,副密码),相比于一个用户只有一个密码最大优点就是:修改密码不会导致应用不可用,那么应用就可以自动使用副密码(副密码和当前主密码保持一致)连接数据库。
注:由于目前最新的是8.013版本,所以还没法体验。

可通过在ALTER USER和SET PASSWORD命令中指定RETAIN CURRENT PASSWORD字句来将当前的主密码作为副密码,而主密码可以修改为新的密码。如:
而ALTER USER …DISCARD OLD PASSWORD将不设置副密码。

下面通过具体例子来演示如何修改用户密码,而不影响应用的使用:

  1. 修改主密码
    通过RETAIN CURRENT PASSWORD字句将当前主密码作为副密码,而应用可以不需要该密码继续使用当前密码(副密码)来连接应用

    ALTER USER ‘lei’@‘localhost’ IDENTIFIED BY ‘new_pwd’ RETAIN CURRENT PASSWORD;

  2. 等待新密码传播到所有备库
    如果有其他备库的话

  3. 修改应用密码为新密码
    找到合适的时间点,分批将应用连接密码修改为新密码

  4. 去掉副密码
    这时候副密码就完成了它的使命,可以将副密码废除。

    ALTER USER ‘lei’@‘localhost’ DISCARD OLD PASSWORD;

  5. 等待操作同步到所有备库
    如果有其他备库的话。

RETAIN CURRENT PASSWORD 和DISCARD OLD PASSWORD有以下影响:

  • RETAIN CURRENT PASSWORD会把当前密码作为副密码,而会覆盖以前的副密码。
    应用既可以使用主密码连接,也可以通过副密码连接。
    注:如果通过ALTER USER或SET PASSWORD修改密码,而新密码空,那么副密码也会为空。
  • 为一个用户指定RETAIN CURRENT PASSWORD,如果它的当前密码是空的,那么会报错。
  • 如果修改用户密码,而没有指定RETAIN CURRENT PASSWORD,而且之前存在副密码,那么副密码将保持不变
  • 对于使用ALTER USER,如果修改了用户的验证插件,那么副密码将会失效。同样如果修改了验证插件,而且指定了RETAIN CURRENT PASSWORD那么会执行失败。
  • ALTER USER…DISCARD OLD PASSWORD会废弃副密码,应用只能通过主密码连接。

你可能感兴趣的:(MySQL,8)