本节介绍如何安装 validate_password密码验证插件。有关安装插件的一般信息,请参阅 第 5.5.1 节,“安装和卸载插件”

笔记

如果使用安装了MySQL 5.7 MySQL Yum repository, MySQL SLES Repository,或 Oracle提供的RPM包validate_password默认情况下,您启动MySQL服务器的第一次后使能。

要被服务器使用,插件库文件必须位于 MySQL 插件目录(由plugin_dir系统变量命名的目录)中。如有必要,通过设置plugin_dir服务器启动时的值来配置插件目录位置 。

插件库文件基本名称是 validate_password. 文件名后缀因平台.so而异(例如,对于 Unix 和类 Unix 系统,.dll对于 Windows)。

要在服务器启动时加载插件,请使用该 --plugin-load-add选项来命名包含它的库文件。使用这种插件加载方法,每次服务器启动时都必须给出该选项。例如,将这些行放在服务器 my.cnf文件中,.so根据需要调整平台的 后缀:

1
2
[mysqld]
plugin-load-add=validate_password.so

修改my.cnf后重启服务器使新设置生效。

或者,要在运行时加载插件,请使用此语句,.so根据需要调整平台的后缀:

1
2
3
4
5
6
7
8
9
mysql> show variables like 'validate_password%'; 
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| password_history | 0 |
| password_require_current | OFF |
| password_reuse_interval | 0 |
+--------------------------+-------+
mysql> INSTALL PLUGIN validate_password SONAME 'validate_password.so';

INSTALL PLUGIN加载插件,并将其注册到mysql.plugins 系统表中,以便为后续每次正常的服务器启动加载插件,而无需 --plugin-load-add.

要验证插件安装,请检查 INFORMATION_SCHEMA.PLUGINS表或使用SHOW PLUGINS语句(请参阅第 5.5.2 节,“获取服务器插件信息”)。例如:

1
2
3
4
5
6
7
8
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
FROM INFORMATION_SCHEMA.PLUGINS
WHERE PLUGIN_NAME LIKE 'validate%';
+-------------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+-------------------+---------------+
| validate_password | ACTIVE |
+-------------------+---------------+

如果插件无法初始化,请检查服务器错误日志以获取诊断消息。

如果插件之前已注册 INSTALL PLUGIN或已加载 --plugin-load-add,则可以--validate-password在服务器启动时使用该选项来控制插件激活。例如,要在启动时加载插件并防止它在运行时被删除,请使用以下选项:

1
2
3
4
5
[mysqld]
plugin-load-add=validate_password.so
validate-password=FORCE_PLUS_PERMANENT
或添加启动参数:
mysqld --plugin-load-add=validate_password.so --validate-password=FORCE_PLUS_PERMANENT

如果希望在没有密码验证插件的情况下阻止服务器运行,请使用 --validate-password带值FORCEFORCE_PLUS_PERMANENT,如果插件未成功初始化,强制启动服务器。

1
2
3
4
5
6
7
8
9
10
11
12
mysql> show variables like 'validate_password%'; 
+--------------------------------------+--------+
| 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 |
+--------------------------------------+--------+

6.4.3.2 密码验证插件选项和变量

本节介绍了validate_password用于配置和监控其操作的选项、系统变量和状态变量。

密码验证插件选项

要控制validate_password插件的激活 ,请使用此选项:

密码验证插件系统变量

如果validate_password启用了该插件,它会公开几个启用密码检查配置的系统变量:

1
2
3
4
5
6
7
8
9
10
11
12
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 |
+--------------------------------------+--------+

要更改检查密码的方式,您可以在服务器启动或运行时设置这些系统变量。下面的列表描述了每个变量的含义。

  • validate_password_check_user_name

    命令行格式 --validate-password-check-user-name[={OFF|ON}]
    Introduced 5.7.15
    系统变量System Variable validate_password_check_user_name
    范围Scope Global
    动态的Dynamic Yes
    类型 Boolean
    默认值 OFF

    是否validate_password将密码与当前会话的有效用户帐户的用户名部分进行比较,如果匹配则拒绝它们。除非validate_password已安装,否则此变量不可用 。

    默认情况下, validate_password_check_user_name 禁用。此变量控制与 的值无关的用户名匹配 validate_password_policy

    当 validate_password_check_user_name 启用时,它具有以下作用:

    • 检查发生在所有validate_password被调用的上下文中 ,包括使用诸如ALTER USER或 之类的语句 SET PASSWORD来更改当前用户的密码,以及调用诸如PASSWORD()和 之类的函数 VALIDATE_PASSWORD_STRENGTH()
    • 用于比较的用户名取自 当前会话的USER() 和CURRENT_USER()函数的值。这意味着具有足够权限设置另一个用户的密码的用户可以将密码设置为该用户的名称,而不能将该用户的密码设置为执行该语句的用户的名称。例如,'root'@'localhost'可以设定密码 'jeffrey'@'localhost'来 'jeffrey',但不能设置密码'root
    • 仅使用USER()和 CURRENT_USER()函数值的用户名部分 ,而不使用主机名部分。如果用户名为空,则不进行比较。
    • 如果密码与用户名或其反面相同,则会发生匹配并拒绝该密码。
    • 用户名匹配区分大小写。密码和用户名值作为二进制字符串逐字节进行比较。
    • 如果密码与用户名匹配,则VALIDATE_PASSWORD_STRENGTH() 无论其他validate_password系统变量如何设置,都 返回 0 。
  • validate_password_dictionary_file

    命令行格式 --validate-password-dictionary-file=file_name
    System Variable validate_password_dictionary_file
    范围Scope Global
    动态的Dynamic Yes
    类型Type File name

    validate_password用于检查密码 的字典文件的路径名 。除非validate_password已安装,否则此变量不可用 。

    默认情况下,这个变量有一个空值并且不执行字典检查。要进行字典检查,变量值必须为非空。如果文件被命名为相对路径,则它相对于服务器数据目录进行解释。文件内容应为小写,每行一个字。内容被视为具有utf8. 允许的最大文件大小为 1MB。

    对于密码检查时使用的字典文件,密码策略必须设置为2(STRONG);参见validate_password_policy 系统变量的描述 。假设这是真的,长度为 4 到 100 的密码的每个子字符串都与字典文件中的单词进行比较。任何匹配都会导致密码被拒绝。比较不区分大小写。

    对于 VALIDATE_PASSWORD_STRENGTH(),根据所有策略(包括 )检查密码 STRONG,因此无论validate_password_policy 值如何,强度评估都包括字典检查 。

    validate_password_dictionary_file 可以在运行时设置并分配一个值会导致在不重新启动服务器的情况下读取命名文件。

  • validate_password_length

    命令行格式 --validate-password-length=#
    系统变量 validate_password_length
    范围 Global
    动态的 Yes
    类型 整数Integer
    默认值 8
    最小值 0

    validate_password需要密码 的最少字符数 。除非validate_password已安装,否则此变量不可用 。

    该 validate_password_length 最小值是其他几个相关的系统变量的函数。该值不能设置为小于此表达式的值:

    1
    2
    3
    validate_password_number_count
    + validate_password_special_char_count
    + (2 * validate_password_mixed_case_count)

    如果 由于前面的约束而validate_password调整 的值 validate_password_length,则会将消息写入错误日志。

  • validate_password_mixed_case_count

    命令行格式 --validate-password-mixed-case-count=#
    系统变量 validate_password_mixed_case_count
    范围 Global
    动态的 Yes
    类型 整数Integer
    默认值 1
    最小值 0

    validate_password如果密码策略是MEDIUM或更强 ,则要求密码具有 的最小小写和大写字符数。除非validate_password已安装,否则此变量不可用。

    对于给定的 validate_password_mixed_case_count 值,密码必须有那么多小写字符和那么多大写字符。

  • validate_password_number_count

    命令行格式 --validate-password-number-count=#
    系统变量 validate_password_number_count
    范围 Global
    动态的 Yes
    类型 整数Integer
    默认值 1
    最小值 0

    validate_password如果密码策略是MEDIUM 或更强 ,则要求密码具有的最少数字(数字)字符数 。除非validate_password已安装,否则此变量不可用 。

  • validate_password_policy

    set global validate_password_policy=0;

    命令行格式 --validate-password-policy=value
    系统变量 validate_password_policy
    范围 Global
    动态的 Yes
    类型 枚举 Enumeration
    默认值 1
    有效值 0 1 2 LOW MEDIUM HIGH

    由 强制执行的密码策略 validate_password。除非validate_password已安装,否则此变量不可用。

    validate_password_policy 影响validate_password其其他策略设置系统变量的使用方式,除了根据用户名检查密码,这是由 validate_password_check_user_name.

    validate_password_policy 可以使用数值 0、1、2 或相应的符号值LOW、 MEDIUM、来指定 该 值STRONG。下表描述了为每个策略执行的测试。对于长度测试,需要的长度是validate_password_length 系统变量的值 。类似地,其他测试所需的值由其他 变量给出 。 validate_password_*xxx*

    策略 执行的测试
    0 或者 LOW 长度
    1 或者 MEDIUM 长度; 数字、小写/大写和特殊字符
    2 或者 STRONG 长度; 数字、小写/大写和特殊字符;字典文件
  • validate_password_special_char_count

    命令行格式 --validate-password-special-char-count=#
    系统变量 validate_password_special_char_count
    范围 Global
    动态的 Yes
    类型 整数Integer
    默认值 1
    最小值 0

    validate_password如果密码策略是MEDIUM 或更强 ,则要求密码具有的最小非字母数字字符数 。除非validate_password已安装,否则此变量不可用 。

密码验证插件状态变量

如果validate_password启用插件,它会公开提供操作信息的状态变量:

1
2
3
4
5
6
7
mysql> SHOW STATUS LIKE 'validate_password%';
+-----------------------------------------------+---------------------+
| Variable_name | Value |
+-----------------------------------------------+---------------------+
| validate_password.dictionary_file_last_parsed | 2019-10-03 08:33:49 |
| validate_password_dictionary_file_words_count | 1902 |
+-----------------------------------------------+---------------------+

下面的列表描述了每个状态变量的含义。