暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

mysql密码复杂度与密码过期策略插件

程序老哥 2021-07-11
1459

一、密码复杂度策略设置

在等保检测中MySQL的密码复杂度一直都是一个重要的参考指标,那么没有一种办法可以强制用户设置mysql密码的时候必须包含字母、数字、特殊符号等比较复杂的密码呢,并且能否设置密码的有效期呢?比如设置密码必须强制在3个月后更换,如果不更换则不允许登录数据库。幸运的是MySQL 系统的确就有 一个插件可以实现所说的问题,那就是本文要介绍的validate_password 插件。


1

查看是否已安装此插件

登录MySQL ,输入 show plugins 或者查看 validate_password 相关参数可以判断是否已安装此插件。若没有相关参数则代表未安装此插件

    # 检查 是否安装此插件
    mysql> show variables like 'validate%';
    Empty set (0.00 sec)


    2

    安装 validate_password 插件

      # 通过 INSTALL PLUGIN 命令可安装此插件
      mysql> INSTALL PLUGIN validate_password SONAME 'validate_password.so';
      Query OK, 0 rows affected, 1 warning (0.28 sec)


      # 查看 validate_password 参数
      mysql> show variables like 'validate%';
      +--------------------------------------+--------+
      |Variable_name                        | Value  |
      +--------------------------------------+--------+
      |validate_password_check_user_name    | ON     |
      |validate_password_dictionary_file    |        |
      |validate_password_length             | 8      |
      |validate_password_mixed_case_count   | 1      |
      |validate_password_number_count       | 1      |
      |validate_password_policy             | MEDIUM |
      |validate_password_special_char_count | 1      |
      +--------------------------------------+--------+
      7 rows in set (0.00 sec)


      3

      密码强度相关参数解释

      安装 validate_password 插件后,多了一些密码强度相关参数,下面简单解释下几个重点参数。

        1、validate_password_check_user_name :用户名检测,默认关闭


        1、validate_password_policy
        代表的密码策略,默认是MEDIUM 可配置的值有以下:
        0 or LOW 仅需需符合密码长度(由参数validate_password_length指定)
        1 or MEDIUM 满足LOW策略,同时还需满足至少有1个数字,小写字母,大写字母和特殊字符
        2 or STRONG 满足MEDIUM策略,同时密码不能存在字典文件(dictionary file)中


        2、validate_password_dictionary_file
        用于配置密码的字典文件,当validate_password_policy设置为STRONG时可以配置密码字典文件,字典文件中存在的密码不得使用。


        3、validate_password_length
        用来设置密码的最小长度,默认值是8


        4、validate_password_mixed_case_count
        当validate_password_policy设置为MEDIUM或者STRONG时,密码中至少同时拥有的小写和大写字母的数量,默认是1最小是0;默认是至少拥有一个小写和一个大写字母。


        5、validate_password_number_count
        当validate_password_policy设置为MEDIUM或者STRONG时,密码中至少拥有的数字的个数,默认1最小是0


        6、validate_password_special_char_count
        当validate_password_policy设置为MEDIUM或者STRONG时,密码中至少拥有的特殊字符的个数,默认1最小是0


        4

        密码复杂度策略具体设置

        例如:设置密码至少10位且包含大小写字母、数字、特殊字符。

          # 设置密码长度至少10位
          mysql> set global validate_password_length = 10;
          Query OK, 0 rows affected (0.00 sec)


          mysql> show variables like 'validate%';
          +--------------------------------------+--------+
          | Variable_name | Value |
          +--------------------------------------+--------+
          | validate_password_check_user_name | ON |
          | validate_password_dictionary_file | |
          | validate_password_length | 10 |
          | validate_password_mixed_case_count | 1 |
          | validate_password_number_count | 1 |
          | validate_password_policy | MEDIUM |
          | validate_password_special_char_count | 1 |
          +--------------------------------------+--------+
          7 rows in set (0.00 sec)


          # 若想永久生效,建议将以下参数写入配置文件
          [mysqld]
          plugin-load = validate_password.so
          validate_password_length = 10
          validate_password_policy = 1
          validate-password = FORCE_PLUS_PERMANENT


          5

          测试密码复杂度

          密码复杂度策略只对生效后的操作有效,比如说你之前有个账号,密码是 123 ,则该账号还是可以继续使用的,不过若再次更改密码则需满足复杂度策略。下面我们来测试下密码复杂度策略的具体效果。

            # 新建用户设置密码
            mysql> create user 'demo'@'%' identified by '123';
            ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
            mysql> create user 'demo'@'%' identified by 'abc123';
            ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
            mysql> create user 'demo'@'%' identified by 'Demo@123';
            ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
            mysql> create user 'demo'@'%' identified by 'Bs@546';
            Query OK, 0 rows affected (0.01 sec)


            # 更改密码
            mysql> alter user 'demo'@'%' identified by 'dfgf3435';
            ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
            mysql> alter user 'demo'@'%' identified by 'dBsdf@546s232';
            Query OK, 0 rows affected (0.01 sec)


            二、设置密码自动过期

            除了设置密码复杂度策略外,我们还可以设置密码自动过期,例如设置180 天密码过期。

            1

            设置全局过期策略

            要构建全局密码自动过期策略,使用 default_password_lifetime 系统变量。在 5.7.11 版本之前,默认的 default_password_lifetime 值为 360(密码大约每年必须更改一次),之后的版本默认值为 0,表示密码不会过期。此参数的单位是天,比如我们可以将此参数设置为 180 ,则表示全局密码自动过期策略是 180 天。

              # 设置全局过期策略 先手动更改再加入配置文件
              mysql> SET GLOBAL default_password_lifetime = 180;
              Query OK, 0 rows affected (0.01 sec)


              mysql> show variables like 'default_password_lifetime';
              +---------------------------+-------+
              | Variable_name | Value |
              +---------------------------+-------+
              | default_password_lifetime | 180 |
              +---------------------------+-------+
              1 row in set (0.00 sec)


              # 写入配置文件使得重启生效
              [mysqld]
              default_password_lifetime = 180


              2

              设置指定用户的密码过期时间

              除了可以设置全局的密码过期时间外,我们还可以对指定用户设置不同的密码过期时间,可以使用 ALTER USER 语句为单个账号设置密码过期,也可以更改账号过期时间。

                mysql> select user,host,password_expired,password_lifetime,password_last_changed,account_locked from mysql.user;
                +------------------+-----------+------------------+-------------------+-----------------------+----------------+
                | user | host | password_expired | password_lifetime | password_last_changed | account_locked |
                +------------------+-----------+------------------+-------------------+-----------------------+----------------+
                | demo | % | N | NULL | 2021-01-05 14:30:30 | N |
                | root             | %         | N                |              NULL | 2020-10-30 14:45:43   | N              |
                | mysql.infoschema | localhost | N | NULL | 2020-10-30 14:37:09 | Y |
                | mysql.session | localhost | N | NULL | 2020-10-30 14:37:09 | Y |
                | mysql.sys | localhost | N | NULL | 2020-10-30 14:37:09 | Y |
                | root | localhost | N | NULL | 2020-10-30 14:38:55 | N |
                +------------------+-----------+------------------+-------------------+-----------------------+----------------+
                7 rows in set (0.01 sec)


                # 使 expuser 账号密码立即过期
                mysql> ALTER USER 'demo'@'%' PASSWORD EXPIRE;
                Query OK, 0 rows affected (0.00 sec)


                mysql> select user,host,password_expired,password_lifetime,password_last_changed,account_locked from mysql.user;
                +------------------+-----------+------------------+-------------------+-----------------------+----------------+
                | user | host | password_expired | password_lifetime | password_last_changed | account_locked |
                +------------------+-----------+------------------+-------------------+-----------------------+----------------+
                | demo | % | Y | NULL | 2021-01-05 14:30:30 | N |
                | root | % | N | NULL | 2020-10-30 14:45:43 | N |
































                | mysql.infoschema | localhost | N | NULL | 2020-10-30 14:37:09 | Y |
                | mysql.session | localhost | N | NULL | 2020-10-30 14:37:09 | Y |
                | mysql.sys | localhost | N | NULL | 2020-10-30 14:37:09 | Y |
                | root | localhost | N | NULL | 2020-10-30 14:38:55 | N |
                +------------------+-----------+------------------+-------------------+-----------------------+----------------+
                7 rows in set (0.00 sec)


                # 修改账号密码永不过期
                mysql> ALTER USER 'demo'@'%' PASSWORD EXPIRE NEVER;
                Query OK, 0 rows affected (0.01 sec)


                # 单独设置该账号密码90天过期
                mysql> ALTER USER 'demo'@'%' PASSWORD EXPIRE INTERVAL 90 DAY;
                Query OK, 0 rows affected (0.00 sec)


                mysql> select user,host,password_expired,password_lifetime,password_last_changed,account_locked from mysql.user;
                +------------------+-----------+------------------+-------------------+-----------------------+----------------+
                | user | host | password_expired | password_lifetime | password_last_changed | account_locked |
                +------------------+-----------+------------------+-------------------+-----------------------+----------------+
                | demo | % | N | 90 | 2021-01-05 14:41:28 | N |
                | root             | %         | N                |              NULL | 2020-10-30 14:45:43   | N              |


                | mysql.infoschema | localhost | N | NULL | 2020-10-30 14:37:09 | Y |
                | mysql.session | localhost | N | NULL | 2020-10-30 14:37:09 | Y |
                | mysql.sys | localhost | N | NULL | 2020-10-30 14:37:09 | Y |
                | root | localhost | N | NULL | 2020-10-30 14:38:55 | N |
                +------------------+-----------+------------------+-------------------+-----------------------+----------------+
                7 rows in set (0.00 sec)


                # 让此账号使用默认的密码过期全局策略
                mysql> ALTER USER 'demo'@'%' PASSWORD EXPIRE DEFAULT;
                Query OK, 0 rows affected (0.01 sec)

                mysql.user 系统表记录着每个账号的相关信息,当 password_expired 字段值为 Y 时,代表此密码已过期,使用过期密码仍可以登录,但不能进行任何操作,进行操作会提示:ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement. 必须更改密码后才能进行正常操作。

                对于给定过期时间的账号,比如说设置 180 天过期,数据库系统会比较当前时间与上次修改密码的时间差值,如果距离上次修改密码时间超过 180 天,则将此账号密码标记为过期,必须更改密码后才能进行操作。


                /

                /

                / 微信号 / 程序老哥/

                文章转载自程序老哥,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                评论