新年伊始,你的数据库是否是该巡检了?通常巡检都会关心密码安全问题,好比密码复杂度设置,是否有按期修改等。特别是进行等保评测时,评测机构会要求具有密码安全策略。其实 MySQL 系统自己能够设置密码复杂度及自动过时策略的,可能比较少用,大多数同窗并未详细去了解。本篇文章咱们一块儿来学习下如何设置数据库帐号密码复杂度及自动过时策略。mysql
MySQL 系统自带有 validate_password 插件,此插件能够验证密码强度,未达到规定强度的密码则不容许被设置。MySQL 5.7 及 8.0 版本默认状况下貌似都不启用该插件,这也使得咱们能够随意设置密码,好比设置为 12三、123456等。若是咱们想从根源上规范密码强度,能够启用该插件,下面一块儿来看下如何经过此插件来设置密码复杂度策略。面试
进入 MySQL 命令行,经过 show plugins 或者查看 validate_password 相关参数能够判断是否已安装此插件。若没有相关参数则表明未安装此插件。算法
# 安装前检查 为空则说明未安装此插件sql
mysql> show variables like 'validate%';数据库
Empty set (0.00 sec)安全
# 经过 INSTALL PLUGIN 命令可安装此插件session
# 每一个平台的文件名后缀都不一样 对于 Unix 和类 Unix 系统,为.so,对于 Windows 为.dllide
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)
安装 validate_password 插件后,多了一些密码强度相关参数,这些参数从字面意思上也很容易看懂,下面简单解释下几个重点参数。
a、validate_password_policy
表明的密码策略,默认是MEDIUM 可配置的值有如下:
0 or LOW 仅需需符合密码长度(由参数validate_password_length指定) 1 or MEDIUM 知足LOW策略,同时还需知足至少有1个数字,小写字母,大写字母和特殊字符 2 or STRONG 知足MEDIUM策略,同时密码不能存在字典文件(dictionary file)中
b、validate_password_dictionary_file
用于配置密码的字典文件,当validate_password_policy设置为STRONG时能够配置密码字典文件,字典文件中存在的密码不得使用。
c、validate_password_length
用来设置密码的最小长度,默认值是8
d、validate_password_mixed_case_count
当validate_password_policy设置为MEDIUM或者STRONG时,密码中至少同时拥有的小写和大写字母的数量,默认是1最小是0;默认是至少拥有一个小写和一个大写字母。
e、validate_password_number_count
当validate_password_policy设置为MEDIUM或者STRONG时,密码中至少拥有的数字的个数,默认1最小是0
f、validate_password_special_char_count
当validate_password_policy设置为MEDIUM或者STRONG时,密码中至少拥有的特殊字符的个数,默认1最小是0
学习完以上参数,咱们就能够根据自身状况来具体设置密码复杂度策略了,好比我想让密码至少 10 位且包含大小写字母、数字、特殊字符,则能够这样设置。
密码复杂度策略只对生效后的操做有效,好比说你以前有个帐号,密码是 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)
除了设置密码复杂度策略外,咱们还能够设置密码自动过时,好比说隔 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 考虑,最好选择其余密码。
本篇文章主要介绍了关于数据库密码的两项安全策略,密码复杂度加上密码过时策略,多一份策略多一份安心。要记住:安全无小事。
最后,特别推荐一个分享C/C++和算法的优质内容,学习交流,技术探讨,面试指导,简历修改...还有超多源码素材等学习资料,零基础的视频等着你!
还没关注的小伙伴,能够长按关注一下: