1、原题
1.1、英文原题
An admin attemps to enforce stronger security by using the commands:
mysql> set global validate_password_policy=‘STRONG’;
mysql> set global validate_password_dictionary_file=‘/tmp/dictionary_file’;
mysql> show status like ‘validate_password%’;
±----------------------------------------------±--------------------+
| Variable_name | Value |
±----------------------------------------------±--------------------+
| validate_password_dictionary_file_last_parsed | 2018-03-07 13:25:06 |
| validate_password_dictionary_file_words_count | 10 |
±----------------------------------------------±--------------------+
The admin leaves the system running with the specified changes. What are two remaining security concerns?
A. validate_password_policy cannot be set without restarting MySQL instance.
B. The name of dictionary file is too obvious.
C. The dictionary file word list is too short.
D. validate_password_dictionary_file cannot be set without restarting the MySQL instance.
E. The validate_password plugin has not been loaded.
F, The dictionary file is an insecure location.
1.2、中文翻译
管理员尝试使用以下命令加强安全性:
mysql> set global validate_password_policy=‘STRONG’;
mysql> set global validate_password_dictionary_file=‘/tmp/dictionary_file’;
mysql> show status like ‘validate_password%’;
±----------------------------------------------±--------------------+
| Variable_name | Value |
±----------------------------------------------±--------------------+
| validate_password_dictionary_file_last_parsed | 2018-03-07 13:25:06 |
| validate_password_dictionary_file_words_count | 10 |
±----------------------------------------------±--------------------+
管理员使用指定的更改使系统保持运行。剩下的两个安全问题是什么?
A、 如果不重新启动MySQL实例,则无法设置validate_password_policy。
B、 字典文件的名称太明显。
C、 词典文件单词列表太短。
D、 如果不重新启动MySQL实例,则无法设置validate_password_dictionary_file。
E、 尚未加载validate_password插件。
F、 字典文件的位置不安全。
1.3、答案
C、F
2、题目解析
2.1、题干解析
本题考点为MySQL的密码校验策略。
2.2、选项解析
2.2.1、选项A解析
validate_password_policy变量是可以通过set global动态设置的,可以不重启MySQL实例,所以选项A错误。
2.2.2、选项C解析
当validate_password插件被安装,且validate_password_policy变量设置为2或STRONG后,就会使用字典文件做密码检查,即密码的每个子串(长度为4至100)都会与字典文件中的单词进行比较。这里的字典文件的词列表长度只有10,显然太短了。
2.2.3、选项D解析
validate_password_dictionary_file和validate_password_policy变量一样,是可以动态配置的。
2.2.4、选项E解析
如果validate_password插件未加载,则validate_password_policy变量和validate_password_dictionary_file变量根本无法设置,也不会有值,所以选项E错误。
2.2.5、选项F解析
validate_password_dictionary_file位于/tmp目录下,显然是不安全的,随时可能被覆盖或清除。所以选项F正确。
3、知识点
3.1、知识点1:密码验证策略
3.1.1、密码验证插件validate_password plugin
validate_password插件的作用是通过对账户密码做更高强度的测试来提高安全性,该插件启用后可以通过一组系统变量(
validate_password_xxx)配置密码策略。插件的主要功能包括:
- 检测ALTER USER、CREATE USER、GRANT和SET PASSWORD语句中可能存在的弱密码。
- 对于CREATE USER语句强制要求设置密码,并满足密码策略。
- validate_password实现了一个VALIDATE_PASSWORD_STRENGTH()SQL函数,用于评估潜在密码的强度。这个函数接受一个密码参数,并返回一个从0(弱)到100(强)的整数。
安装了validate_password插件后,可实现三个级别的密码检查:LOW, MEDIUM, 和 STRONG,依次越来越严格,默认是MEDIUM。可以通过修改validate_password_policy的值改变检查策略等级。
MySQL5.7默认是没有安装validate_password插件的,validate_password插件有两种安装方法:
- 第一种方式(推荐):运行时注册插件。无需重启mysql
命令执行:install plugin validate_password soname ‘validate_password.so’; - 第二种方式:
my.cnf配置文件添加,之后需要重启mysql
[mysqld]
plugin-load=validate_password=validate_password.so
3.1.2、密码验证策略配置
3.1.2.1、validate_password_policy变量
validate_password_policy变量表示由validate_password强制执行的密码验证要求等级,是可以动态设置的。除非安装了validate_password,否则这个变量是不可用的。值可以使用数字值0、1、2,或者相应的符号值LOW、MEDIUM、STRONG来指定。对于本变量的说明如下所示:
3.1.2.2、validate_password_dictionary_file变量
除非安装了validate_password,否则validate_password_dictionary_file变量是不可用的。默认情况下,这个变量的值为空,不进行字典检查。要进行字典检查,这个变量的值必须是不空的。如果文件被命名为相对路径,它将被解释为相对于服务器的数据目录。文件内容应该是小写的,每行一个字。内容被视为具有utf8的字符集。允许的最大文件大小为1MB。
要在密码检查过程中使用字典文件,密码策略必须设置为2(STRONG);密码的每个子串(长度为4至100)都会与字典文件中的单词进行比较。任何匹配都会导致密码被拒绝。比较是不分大小写的。
validate_password_dictionary_file可以在运行时动态设置,指定一个值会使命名的文件被读取,而不需要重新启动服务器。
4、实验
4.1、实验1
4.1.1、实验目的
学习MySQL密码验证策略如何启用和设置。
4.1.2、实验前准备
一个已安装并运行的MySQL5.7实例。
4.1.3、实验步骤
1、先查看已安装的插件,发现没有validate_password
mysql> show plugins;
+----------------------------+----------+--------------------+--------------------+---------+
| Name | Status | Type | Library | License |
+----------------------------+----------+--------------------+--------------------+---------+
......
| rpl_semi_sync_master | ACTIVE | REPLICATION | semisync_master.so | GPL |
| rpl_semi_sync_slave | ACTIVE | REPLICATION | semisync_slave.so | GPL |
+----------------------------+----------+--------------------+--------------------+---------+
2、此时设置validate_password_policy和validate_password_dictionary_file变量都会报错。
3、接下来安装validate_password插件。首先查看插件目录:
mysql> show variables like "%plugin_dir%";
+---------------+-------------------------------+
| Variable_name | Value |
+---------------+-------------------------------+
| plugin_dir | /usr/local/mysql//lib/plugin/ |
4、然后到/usr/local/mysql//lib/plugin/目录下查看密码验证插件是否存在。
$ cd /usr/local/mysql//lib/plugin/
$ ls | grep validate_password
validate_password.so
5、在会话中安装插件:
mysql> install plugin validate_password soname 'validate_password.so';
6、这时候再查看,可以看到插件目录里有validate_password插件了:
mysql> show plugins;
+----------------------------+----------+--------------------+----------------------+---------+
| Name | Status | Type | Library | License |
+----------------------------+----------+--------------------+----------------------+---------+
......
| rpl_semi_sync_master | ACTIVE | REPLICATION | semisync_master.so | GPL |
| rpl_semi_sync_slave | ACTIVE | REPLICATION | semisync_slave.so | GPL |
| validate_password | ACTIVE | VALIDATE PASSWORD | validate_password.so | GPL |
+----------------------------+----------+--------------------+----------------------+---------+
7、如下设置validate_password*变量:
mysql> set global validate_password_policy='STRONG';
mysql> set global validate_password_dictionary_file='/tmp/dictionary_file';
4.1.4、实验结论
- MySQL可以通过启用validate_password插件和配置validate_password相关变量以实现对密码验证策略的配置和加强,从而避免弱密码。
- validate_password插件的启用有运行时注册插件(无需重启)和配置文件指定插件(需要重启)两种方式,只要validate_password插件被启用,就可以通过动态设置validate_password的一组系统变量来设置密码验证策略。
5、总结
同实验结论,略。