在测试是上次制作的rpm包,本来打算弄个多实例环境的。但是在配置过程中发现了,创建、修改用户密码时出现了如下的ERROR信息。
mysql> grant all privileges on *.* to 'dba'@'%' identified by '12345678';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
根据错误的提示信息,说我密码不满足要求,但是以前记得都可以啊。于是测试了几个密码最终证实了是软件本身的策略限制,但这是从哪里开始的呢?
原来在新版Mysql中加入了validate_password
插件用于测试密码并提高安全性;这会影响ALTER USER, CREATE USER, GRANT,和 SET PASSWORD语句。
确认系统是否已经加载了插件;因为我的配置文件没有做任何的配置,可以看到一个是rpm打包是加入的日志审计插件,一个就是密码强度验证插件,在新版本中已经默认启动了。
mysql> show plugins;
+----------------------------+----------+--------------------+----------------------+---------+
| Name | Status | Type | Library | License |
+----------------------------+----------+--------------------+----------------------+---------+
| AUDIT | ACTIVE | AUDIT | libaudit_plugin.so | GPL |
| validate_password | ACTIVE | VALIDATE PASSWORD | validate_password.so | GPL |
+----------------------------+----------+--------------------+----------------------+---------+
查看该插件有哪些配置参数:
mysql> show variables like '%validate_password%';
+--------------------------------------+--------+
| Variable_name | Value |
+--------------------------------------+--------+
| validate_password_check_user_name | OFF |
| 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_check_user_name :用户名检测,默认关闭
validate_password_dictionary_file :字典文件,就是要在字典规则里才能满足密码的条件。
validate_password_length :密码的长度至少为8位
validate_password_mixed_case_count :密码中至少有一个大写小字母
validate_password_number_count :密码中至少一个数字
validate_password_special_char_count :密码中至少一个特殊字符
validate_password_policy :密码的安全策略
validate_password_policy 参数可选值:MEDIUM或者0 、LOW或者1、STRONG或者2
LOW :策略仅测试密码长度。密码长度必须至少为8个字符。
MEDIUM :策略添加了密码必须至少包含1个数字字符,1个小写字符,1个大写字符和1个特殊(非字母数字)字符的条件。
STRONG :策略添加了长度为4或更长的密码子字符串不能匹配字典文件中的字词(如果已经指定)的条件。
所以最终的密码设置策略就是:不得低于8位,而且必须至少有一个大写和一个小写字母、至少一个数字和至少的一个特殊字符组成;
最基本的规则:大写+小写+特殊字符+数字组成的8位以上密码
不满足条件的例示:
A1234567
Ab123456
#1234567
A#1234567
b@123456
满足条件的密码:
Ab#12345
Ab@12345
bE~0125758
当然可以使用插件的检测密码是否满足条件: 0-100,当评估在100时就是说明使用上了最基本的规则:大写+小写+特殊字符+数字组成的8位以上密码
mysql> select VALIDATE_PASSWORD_STRENGTH('Q~123456');
+----------------------------------------+
| VALIDATE_PASSWORD_STRENGTH('Q~123456') |
+----------------------------------------+
| 50 |
+----------------------------------------+
1 row in set (0.00 sec)
这个只有50肯定是不能成功创建的;
mysql> select VALIDATE_PASSWORD_STRENGTH('Q~p123456');
+-----------------------------------------+
| VALIDATE_PASSWORD_STRENGTH('Q~p123456') |
+-----------------------------------------+
| 100 |
+-----------------------------------------+
1 row in set (0.00 sec)
只有满足100才能成功创建;
当然也可以这样测试,获取到哈希方法:
mysql> select password('123456')
-> ;
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
mysql> select password('Abc@10253');
+-------------------------------------------+
| password('Abc@10253') |
+-------------------------------------------+
| *D13FD204BA80EF39F37858DDA09D18907DC3FAED |
+-------------------------------------------+
1 row in set, 1 warning (0.00 sec)
如果嫌麻烦,是可以动态在线更改安全级别,重启后恢复默认的级别。
mysql> set global validate_password_policy=LOW;
Query OK, 0 rows affected (0.00 sec)
查看是否成功动态修改:
mysql> show variables like '%validate_password%';
+--------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------+-------+
| validate_password_check_user_name | OFF |
| validate_password_dictionary_file | |
| validate_password_length | 8 |
| validate_password_mixed_case_count | 1 |
| validate_password_number_count | 1 |
| validate_password_policy | LOW |
| validate_password_special_char_count | 1 |
+--------------------------------------+-------+
7 rows in set (0.00 sec)
设置一个简单的密码:
mysql> update user set authentication_string=password('12345678') where user='dba';
Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 1
可以看到,是成功修改的。什么?还是嫌密码长了吗?
那就5位密码好啦!
mysql> set global validate_password_length=5;
Query OK, 0 rows affected (0.00 sec)
修改后要确认是否已经生效:
mysql> show variables like '%validate_password%';
+--------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------+-------+
| validate_password_check_user_name | OFF |
| validate_password_dictionary_file | |
| validate_password_length | 5 |
| validate_password_mixed_case_count | 1 |
| validate_password_number_count | 1 |
| validate_password_policy | LOW |
| validate_password_special_char_count | 1 |
+--------------------------------------+-------+
7 rows in set (0.00 sec)
感觉嘛,挻好的;因为能够动态调整。
mysql> update user set authentication_string=password('12345') where user='dba';
Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 1
当validate_password_policy
参数设置为LOW后,就不再匹配那几条规则了,只要能满足密码长度即可。
使用字典过滤弱口令设置;
玩过爆力破解都知道,工具根据配置生成的弱口令其实都是日常中很多人都会使用的一些单词、命令等;虽然是很方便记住但也导致系统不安全。所以配置了一些弱口令的字典文件就可以帮助我们更好的加强Mysql的密码安全。
当validate_password_policy参数设置STRONG时,还需要与参数validate_password_dictionary_file结合。
1、首先配置validate_password_policy 属性。
mysql> set global validate_password_policy=STRONG;
Query OK, 0 rows affected (0.01 sec)
2、配置个字典文件路径;文件要最好先创建;
mysql> set global validate_password_dictionary_file="/tmp/validate_password_dictionary_file1";
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW STATUS LIKE 'validate%';
+-----------------------------------------------+---------------------+
| Variable_name | Value |
+-----------------------------------------------+---------------------+
| validate_password_dictionary_file_last_parsed | 2017-07-19 14:10:29 |
| validate_password_dictionary_file_words_count | 10 |
+-----------------------------------------------+---------------------+
2 rows in set (0.01 sec)
在MySQL 5.7.8之前,服务器运行时对字典文件的更改需要重新启动才能使服务器识别更改; 而在5.7.9后可动态设置并生效。
例示:以下的密码如果不匹配字典文件时通过的,但是匹配了字典的文件就不可以了,主要是字典文件中加入了一个弱口令,或者常用 的单词数字等。
mysql> update user set authentication_string=password('Aroot123#') where user='dba';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
mysql> update user set authentication_string=password('adminB@1234') where user='dba';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
mysql> update user set authentication_string=password('aBc@1234') where user='dba';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
mysql> update user set authentication_string=password('aBc@12345') where user='dba';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
mysql> update user set authentication_string=password('aBc@12034') where user='dba';
Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 1
测试使用的mysql_passwd_policy1 ,可以看到这个真实的文件名了吧,跟上面看到的配置中的文件名不一样,这不知道是不是又出于安全保证。
[root@moban tmp]# cat validate_password_dictionary_file1
admin
root
love
password
bibi
google
1234
这样一来把常用的一些弱口令加入到字典文件中即可实现过虑,只要字典文件中存在,配置密码的时候有4个或以上连续出现的就不能此插件的安全验证,极大的提高了密码的安全性。
更详细的还是看官方的说明,个人觉得看完了还得要亲自实验过,毕竟小马过河,走过了才知道深浅。
官方说明: https://dev.mysql.com/doc/refman/5.7/en/validate-password-plugin.html