关于mysql:年底了你的数据库密码安全吗

2次阅读

共计 7605 个字符,预计需要花费 20 分钟才能阅读完成。

前言:

年底了,你的数据库是不是该巡检了?个别巡检都会关怀明码平安问题,比方明码复杂度设置,是否有定期批改等。特地是进行等保评测时,评测机构会要求具备明码安全策略。其实 MySQL 零碎自身能够设置明码复杂度及主动过期策略的,可能比拟少用,大多数同学并未具体去理解。本篇文章咱们一起来学习下如何设置数据库账号密码复杂度及主动过期策略。

1. 明码复杂度策略设置

MySQL 零碎自带有 validate_password 插件,此插件能够验证明码强度,未达到规定强度的明码则不容许被设置。MySQL 5.7 及 8.0 版本默认状况下貌似都不启用该插件,这也使得咱们能够随便设置明码,比方设置为 123、123456 等。如果咱们想从本源上标准明码强度,能够启用该插件,上面一起来看下如何通过此插件来设置明码复杂度策略。

1)查看是否已装置此插件

进入 MySQL 命令行,通过 show plugins 或者查看 validate_password 相干参数能够判断是否已装置此插件。若没有相干参数则代表未装置此插件

# 装置前查看 为空则阐明未装置此插件
mysql> show variables like 'validate%';
Empty set (0.00 sec)

2)装置 validate_password 插件

# 通过 INSTALL PLUGIN 命令可装置此插件
# 每个平台的文件名后缀都不同 对于 Unix 和类 Unix 零碎,为.so,对于 Windows 为.dll
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_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 'testuser'@'%' identified by '123';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
mysql> create user 'testuser'@'%' identified by 'ab123';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
mysql> create user 'testuser'@'%' identified by 'Ab@123';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
mysql> create user 'testuser'@'%' identified by 'Bsdf@5467672';
Query OK, 0 rows affected (0.01 sec)

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

2. 设置明码主动过期

除了设置明码复杂度策略外,咱们还能够设置明码主动过期,比如说隔 90 天明码会过期必须批改明码后能力持续应用,这样咱们的数据库账号就更加平安了。上面咱们来看下如何设置明码主动过期。

独自设置某个账号密码过期工夫

应用 ALTER USER 语句能够使单个账号密码过期,也能够更改账号过期工夫。

# 通过 mysql.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 |
+------------------+-----------+------------------+-------------------+-----------------------+----------------+
| expuser          | %         | N                |              NULL | 2021-01-05 14:30:30   | N              |
| root             | %         | N                |              NULL | 2020-10-30 14:45:43   | N              |
| testuser         | %         | N                |              NULL | 2021-01-04 17:22:37   | 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 'expuser'@'%' 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 |
+------------------+-----------+------------------+-------------------+-----------------------+----------------+
| expuser          | %         | Y                |              NULL | 2021-01-05 14:30:30   | N              |
| root             | %         | N                |              NULL | 2020-10-30 14:45:43   | N              |
| testuser         | %         | N                |              NULL | 2021-01-04 17:22:37   | 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 'expuser'@'%' PASSWORD EXPIRE NEVER;
Query OK, 0 rows affected (0.01 sec)

# 独自设置该账号密码 90 天过期
mysql> ALTER USER 'expuser'@'%' 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 |
+------------------+-----------+------------------+-------------------+-----------------------+----------------+
| expuser          | %         | N                |                90 | 2021-01-05 14:41:28   | N              |
| root             | %         | N                |              NULL | 2020-10-30 14:45:43   | N              |
| testuser         | %         | N                |              NULL | 2021-01-04 17:22:37   | 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 'expuser'@'%' 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. 必须更改明码后能力进行失常操作。

对于给定过期工夫的账号,比如说设置 90 天过期,数据库系统会比拟以后工夫与上次批改明码的工夫差值,如果间隔上次批改明码工夫超过 90 天,则将此账号密码标记为过期,必须更改明码后能力进行操作。

设置全局过期策略

要构建全局明码主动过期策略,请应用 default_password_lifetime 零碎变量。在 5.7.11 版本之前,默认的 default_password_lifetime 值为 360(明码大概每年必须更改一次),之后的版本默认值为 0,示意明码不会过期。此参数的单位是天,比方咱们能够将此参数设置为 90,则示意全局明码主动过期策略是 90 天。

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

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

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

只管能够通过将过期的明码设置为以后值来“重置”它,但出于良好的 Policy 思考,最好抉择其余明码。

总结:

本篇文章次要介绍了对于数据库明码的两项安全策略,明码复杂度加上明码过期策略,多一份策略多一份安心。要记住:平安无小事。

正文完
 0