密码验证组件
该validate_password
组件通过要求提供帐户密码并启用潜在密码的强度测试来提高安全性。该组件提供了使您能够配置密码策略的系统变量以及用于组件监视的状态变量。
注意在MySQL 8.0中,该
validate_password
插件已重新实现为validate_password
组件。(有关服务器组件的一般信息,请参见“ MySQL服务器组件”。)以下说明描述了如何使用组件而不是插件。有关使用的插件形式的说明validate_password
,请参阅密码验证插件中的MySQL 5.7参考手册。插件形式
validate_password
仍然可用,但已过时,并将在MySQL的未来版本中删除。使用该插件的MySQL安装应过渡到使用组件。
该validate_password
组件实现以下功能:
- 对于分配了以明文值形式提供的密码的SQL语句,请
validate_password
对照当前密码策略检查密码,如果密码不正确,则拒绝该密码(该语句返回ER_NOT_VALID_PASSWORD
错误)。这适用于ALTER USER
,CREATE USER
和SET PASSWORD
语句。 - 对于
CREATE USER
语句,validate_password
要求提供密码并满足密码策略。即使最初锁定了一个帐户也是如此,因为否则以后再解锁该帐户将导致无需密码即可使用该策略就可以访问该帐户。 validate_password
实现VALIDATE_PASSWORD_STRENGTH()
评估潜在密码强度的SQL函数。此函数接受密码参数,并返回从0(弱)到100(强)的整数。
注意对于分配或修改帐户密码(
ALTER USER
,CREATE USER
和SET PASSWORD
)的语句,validate_password
此处描述的功能仅适用于使用身份验证插件的帐户,该身份验证插件将凭据存储在内部。对于使用插件针对MySQL外部凭据系统执行身份验证的帐户,密码管理也必须针对该系统从外部进行处理。有关内部凭据存储的更多信息,请参见“帐户密码管理”。前述限制不适用于该
VALIDATE_PASSWORD_STRENGTH()
功能,因为它不会直接影响帐户。
例子:
validate_password
在以下语句中检查明文密码。在默认密码策略下(该密码要求密码的长度至少为8个字符),该密码是弱密码,并且该语句会产生错误:mysql>
ALTER USER USER()IDENTIFIED BY 'abc'; ERROR 1819 (HY000): Your password does not satisfy the current policy requirements由于原始密码值不可用于检查,因此不会检查指定为哈希值的密码:
mysql>
ALTER USER 'jeffrey'@'localhost'IDENTIFIED WITH mysql_native_passwordAS '*0D3CED9BEC10A777AEC23CCC353A8C08A633045E'; Query OK, 0 rows affected (0.01 sec)即使帐户最初被锁定,此帐户创建语句也会失败,因为它不包含满足当前密码策略的密码:
mysql>
CREATE USER 'juanita'@'localhost'ACCOUNT LOCK ; ERROR 1819 (HY000): Your password does not satisfy the current policy requirements要检查密码,请使用以下
VALIDATE_PASSWORD_STRENGTH()
功能:mysql>
SELECT VALIDATE_PASSWORD_STRENGTH('weak'); +------------------------------------ + | VALIDATE_PASSWORD_STRENGTH('weak') | +------------------------------------ + | 25 | +------------------------------------ + mysql>SELECT VALIDATE_PASSWORD_STRENGTH('lessweak$_@123'); +---------------------------------------------- + | VALIDATE_PASSWORD_STRENGTH('lessweak$_@123') | +---------------------------------------------- + | 50 | +---------------------------------------------- + mysql>SELECT VALIDATE_PASSWORD_STRENGTH('N0Tweak$_@123!'); +---------------------------------------------- + | VALIDATE_PASSWORD_STRENGTH('N0Tweak$_@123!') | +---------------------------------------------- + | 100 | +---------------------------------------------- +
要配置密码检查,请修改具有以下形式的名称的系统变量:这些是控制密码策略的参数。请参见“密码验证选项和变量”。validate_password.xxx
如果validate_password
未安装,则系统变量不可用,不检查语句中的密码,并且该函数始终返回0。例如,如果未安装插件,则可以为帐户分配少于8个字符的密码,或者根本不分配密码。validate_password.xxx
VALIDATE_PASSWORD_STRENGTH()
假设validate_password
安装后,它会执行三个级别口令检查的:LOW
,MEDIUM
,和STRONG
。默认值为MEDIUM
;要更改此设置,请修改的值validate_password.policy
。这些策略实施越来越严格的密码测试。以下描述涉及默认参数值,可以通过更改适当的系统变量来对其进行修改。
LOW
策略仅测试密码长度。密码必须至少8个字符长。要更改此长度,请修改validate_password.length
。MEDIUM
策略添加了以下条件:密码必须至少包含1个数字字符,1个小写字符,1个大写字符和1个特殊(非字母数字)字符。要改变这些值,修改validate_password.number_count
,validate_password.mixed_case_count
和validate_password.special_char_count
。STRONG
策略添加了一个条件,即长度为4或更长的密码子字符串必须与字典文件中的单词不匹配(如果已指定)。要指定字典文件,请修改validate_password.dictionary_file
。
此外,还validate_password
支持拒绝与当前会话的有效用户帐户的用户名部分匹配的密码的功能,无论是正向还是反向。要提供对此功能的控制,请validate_password
公开一个validate_password.check_user_name
系统变量,该变量默认情况下处于启用状态。
密码验证组件的安装和卸载
本节介绍如何安装和卸载validate_password
密码验证组件。有关安装和卸载组件的一般信息,请参见“ MySQL服务器组件”。
注意如果使用Oracle提供的MySQL Yum存储库, MySQL SLES存储库或 RPM软件包安装MySQL 8.0 ,则
validate_password
在首次启动MySQL Server之后,默认情况下会启用该组件。使用Yum或RPM软件包从5.7升级到MySQL 8.0
validate_password
会将插件保留在原处。要从validate_password
插件过渡到validate_password
组件,
要由服务器使用,组件库文件必须位于MySQL插件目录(由plugin_dir
系统变量命名的目录)中。如有必要,通过设置plugin_dir
服务器启动时的值来配置插件目录位置。
要安装validate_password
组件,请使用以下语句:
INSTALL COMPONENT 'file://component_validate_password';
组件安装是一次性的操作,不需要在每次服务器启动时进行。INSTALL COMPONENT
加载组件,并将其注册在mysql.component
系统表中,以使其在后续服务器启动期间加载。
要卸载validate_password
组件,请使用以下语句:
UNINSTALL COMPONENT 'file://component_validate_password';
UNINSTALL COMPONENT
卸载组件,然后从mysql.component
系统表中注销该组件,以使其在后续服务器启动期间不被加载。
密码验证选项和变量
本节介绍提供的系统和状态变量,validate_password
以使其能够被配置和监视。
- 密码验证组件系统变量
- 密码验证组件状态变量
- 密码验证插件选项
- 密码验证插件系统变量
- 密码验证插件状态变量
密码验证组件系统变量
如果validate_password
启用了该组件,则它将暴露几个启用密码检查配置的系统变量:
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 | +-------------------------------------- +-------- +
要更改密码的检查方式,可以在服务器启动或运行时设置这些系统变量。以下列表描述了每个变量的含义。
validate_password.check_user_name
属性 值 命令行格式 --validate-password.check-user-name[={OFF|ON}]
系统变量 validate_password.check_user_name
范围 Global 动态 是 SET_VAR
提示适用没有 类型 布尔型 默认值 ON
是否
validate_password
将密码与当前会话的有效用户帐户的用户名部分进行比较,如果匹配则拒绝。除非validate_password
已安装,否则此变量不可用。默认情况下
validate_password.check_user_name
启用。此变量控制用户名匹配,而与的值无关validate_password.policy
。当
validate_password.check_user_name
启用时,它具有以下作用:- 在
validate_password
调用所有上下文的情况下都会进行检查,包括使用诸如ALTER USER
或的语句SET 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
系统变量 validate_password.dictionary_file
范围 Global 动态 是 SET_VAR
提示适用没有 类型 文件名 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 动态 是 SET_VAR
提示适用没有 类型 整数 默认值 8
最低值 0
validate_password
需要密码才能包含的最小字符数。除非validate_password
已安装,否则此变量不可用。该
validate_password.length
最小值是其他几个相关的系统变量的函数。该值的设置不能小于此表达式的值: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 动态 是 SET_VAR
提示适用没有 类型 整数 默认值 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 动态 是 SET_VAR
提示适用没有 类型 整数 默认值 1
最低值 0
validate_password
如果密码策略为MEDIUM
或更强密码,则要求密码具有的最小数字(数字)字符数。除非validate_password
已安装,否则此变量不可用。validate_password.policy
属性 值 命令行格式 --validate-password.policy=value
系统变量 validate_password.policy
范围 Global 动态 是 SET_VAR
提示适用没有 类型 列举 默认值 1
有效值 0
1
2
实施的密码策略
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 动态 是 SET_VAR
提示适用没有 类型 整数 默认值 1
最低值 0
validate_password
如果密码策略为MEDIUM
或更强,则要求密码具有的最小非字母数字字符数。除非validate_password
已安装,否则此变量不可用。
密码验证组件状态变量
如果validate_password
启用了该组件,则它将公开提供操作信息的状态变量:
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 | +----------------------------------------------- +--------------------- +
下表描述了每个状态变量的含义。
validate_password.dictionary_file_last_parsed
上次解析字典文件的时间。除非
validate_password
已安装,否则此变量不可用。validate_password.dictionary_file_words_count
从字典文件中读取的单词数。除非
validate_password
已安装,否则此变量不可用。
密码验证插件选项
注意在MySQL 8.0中,该
validate_password
插件已重新实现为validate_password
组件。该validate_password
插件已弃用,并将在MySQL的将来版本中删除。因此,它的选项也被弃用并且将被删除。使用该插件的MySQL安装应过渡到使用组件。
要控制validate_password
插件的激活,请使用以下选项:
--validate-password[=value]
属性 值 命令行格式 --validate-password[=value]
类型 列举 默认值 ON
有效值 ON
OFF
FORCE
FORCE_PLUS_PERMANENT
此选项控制服务器
validate_password
在启动时如何加载已弃用的插件。该值应该是可用于插件加载选项的值之一,如“安装和卸载插件”中所述。例如,--validate-password=FORCE_PLUS_PERMANENT
告诉服务器在启动时加载插件,并防止在服务器运行时将其删除。仅当
validate_password
插件先前已注册INSTALL PLUGIN
或已加载时,此选项才可用--plugin-load-add
。
密码验证插件系统变量
注意在MySQL 8.0中,该
validate_password
插件已重新实现为validate_password
组件。该validate_password
插件已弃用,并将在MySQL的将来版本中删除。因此,它的系统变量也被弃用并将被删除。使用validate_password
组件的相应系统变量;请参阅密码验证组件系统变量。使用该插件的MySQL安装应过渡到使用组件。
validate_password_check_user_name
属性 值 命令行格式 --validate-password-check-user-name[={OFF|ON}]
系统变量 validate_password_check_user_name
范围 Global 动态 是 SET_VAR
提示适用没有 类型 布尔型 默认值 ON
validate_password
不推荐使用此插件系统变量,并将在MySQL的将来版本中将其删除。请改用组件的相应validate_password.check_user_name
系统变量validate_password
。validate_password_dictionary_file
属性 值 命令行格式 --validate-password-dictionary-file=file_name
系统变量 validate_password_dictionary_file
范围 Global 动态 是 SET_VAR
提示适用没有 类型 文件名 validate_password
不推荐使用此插件系统变量,并将在MySQL的将来版本中将其删除。请改用组件的相应validate_password.dictionary_file
系统变量validate_password
。validate_password_length
属性 值 命令行格式 --validate-password-length=#
系统变量 validate_password_length
范围 Global 动态 是 SET_VAR
提示适用没有 类型 整数 默认值 8
最低值 0
validate_password
不推荐使用此插件系统变量,并将在MySQL的将来版本中将其删除。请改用组件的相应validate_password.length
系统变量validate_password
。validate_password_mixed_case_count
属性 值 命令行格式 --validate-password-mixed-case-count=#
系统变量 validate_password_mixed_case_count
范围 Global 动态 是 SET_VAR
提示适用没有 类型 整数 默认值 1
最低值 0
validate_password
不推荐使用此插件系统变量,并将在MySQL的将来版本中将其删除。请改用组件的相应validate_password.mixed_case_count
系统变量validate_password
。validate_password_number_count
属性 值 命令行格式 --validate-password-number-count=#
系统变量 validate_password_number_count
范围 Global 动态 是 SET_VAR
提示适用没有 类型 整数 默认值 1
最低值 0
validate_password
不推荐使用此插件系统变量,并将在MySQL的将来版本中将其删除。请改用组件的相应validate_password.number_count
系统变量validate_password
。validate_password_policy
属性 值 命令行格式 --validate-password-policy=value
系统变量 validate_password_policy
范围 Global 动态 是 SET_VAR
提示适用没有 类型 列举 默认值 1
有效值 0
1
2
validate_password
不推荐使用此插件系统变量,并将在MySQL的将来版本中将其删除。请改用组件的相应validate_password.policy
系统变量validate_password
。validate_password_special_char_count
属性 值 命令行格式 --validate-password-special-char-count=#
系统变量 validate_password_special_char_count
范围 Global 动态 是 SET_VAR
提示适用没有 类型 整数 默认值 1
最低值 0
validate_password
不推荐使用此插件系统变量,并将在MySQL的将来版本中将其删除。请改用组件的相应validate_password.special_char_count
系统变量validate_password
。
密码验证插件状态变量
注意在MySQL 8.0中,该
validate_password
插件已重新实现为validate_password
组件。该validate_password
插件已弃用,并将在MySQL的将来版本中删除。因此,其状态变量也将被弃用并将被删除。使用validate_password
组件的相应状态变量;请参阅密码验证组件状态变量。使用该插件的MySQL安装应过渡到使用组件。
validate_password_dictionary_file_last_parsed
validate_password
不推荐使用此插件状态变量,并将在将来的MySQL版本中将其删除。请改用组件的相应validate_password.dictionary_file_last_parsed
状态变量validate_password
。validate_password_dictionary_file_words_count
validate_password
不推荐使用此插件状态变量,并将在将来的MySQL版本中将其删除。请改用组件的相应validate_password.dictionary_file_words_count
状态变量validate_password
。
过渡到密码验证组件
注意在MySQL 8.0中,该
validate_password
插件已重新实现为validate_password
组件。该validate_password
插件已弃用,并将在MySQL的将来版本中删除。
当前使用该validate_password
插件的MySQL安装应过渡到使用该validate_password
组件。为此,请使用以下过程。该过程将在卸载插件之前安装组件,以避免出现没有密码验证的时间窗口。(可以同时安装组件和插件。在这种情况下,服务器尝试使用组件,如果组件不可用,则退回到插件。)
安装
validate_password
组件:INSTALL COMPONENT 'file://component_validate_password';- 测试该
validate_password
组件以确保其按预期工作。如果需要设置任何系统变量,则可以在运行时使用进行设置。(下一步必须对选项文件进行任何更改。)validate_password.xxx
SET GLOBAL
调整对插件系统和状态变量的任何引用,以引用相应的组件系统和状态变量。假设您在启动时使用如下选项文件配置插件:
[mysqld] validate-password=FORCE_PLUS_PERMANENT validate_password_dictionary_file=/usr/share/dict/words validate_password_length=10 validate_password_number_count=2
要调整选项文件,请忽略
--validate-password
选项(它仅适用于插件,不适用于组件),然后修改系统变量引用:[mysqld] validate_password.dictionary_file=/usr/share/dict/words validate_password.length=10 validate_password.number_count=2
对于在运行时引用
validate_password
插件系统和状态变量的应用程序,需要进行类似的调整。卸载
validate_password
插件:UNINSTALL PLUGIN validate_password;如果
validate_password
插件在服务器启动时使用--plugin-load
或--plugin-load-add
选项加载,请在服务器启动过程中忽略该选项。例如,如果该选项在服务器选项文件中列出,则将其从文件中删除。- 重新启动服务器。