一:什么是密码校验插件
validate_password
是 MySQL 提供的一个插件(插件名称为validate_password
),用于加强密码的安全性。它通过设置密码复杂度要求,强制用户在设置密码时遵守一定的规则,从而提高数据库系统的安全性。它可以提供密码长度、字符组合、字典检查、密码策略等要求限制。
(一):问题引出
我记得以前在Centos7安装MySQL5.7以后通过grep 'temporary password' /var/log/mysqld.log
命令来获取登录的临时密码,但通过临时密码登录后必须修改root的密码,当时我想更新密码‘123’;但当我执行更新密码语句时懵了,怎么还报错了;我记得以前MySQL5.6更新密码都是直接成功的;当我仔细阅读提示后才知道我的密码不符合策略。记得当时就是报如下错误:
通过后面的资料查询才知道引入了validate_password
密码校验插件,它是在MySQL 5.6中引入的。但它是作为一个可选的安全功能插件,帮助管理员强制执行更严格的密码策略,以提高数据库系统的安全性。到了MySQL 5.7及更高版本中,此插件默认是启用的。
常见密码修改命令:ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
(二):安装卸载密码校验插件
在MySQL5.7以后默认会自动安装和启用密码校验功能,我们可以先通过下面的命令查看是否安装和启用了密码校验功能后再选择安装对应的插件或组件。
安装密码校验功能有两种方式:插件方式、组件方式;其实两种方式都是差不多的,安装完都会有密码校验功能,但是又有细微的差异。需要注意的是MySQL5.7版本只能通过插件的方式安装。
'MySQL5.7及更早版本:只能使用插件,因为组件的概念还未引入。' 'MySQL8.0及更高版本:推荐使用组件,因为组件概念是MySQL8.0中引入的,且提供了更灵活的管理和扩展能力。' '===================== 以MySQL插件的方式安装MySQL密码校验功能 =====================' 命令: INSTALL PLUGIN validate_password SONAME 'validate_password.so'; 说明:该命令用于将validate_password插件注册到元数据,也就是mysql.plugin表中,所以不用担心 MySQL重启后插件会失效。加载后,MySQL会对新创建或修改的密码进行验证,以确保它们符合预设 的密码策略。 注意:插件一旦安装,就会在MySQL服务器启动时自动加载,除非明确卸载。 查看插件安装是否成功: SHOW PLUGINS; +-------------------+--------+-------------------+---------------------+---------+ | Name | Status | Type | Library | License | +-------------------+--------+-------------------+---------------------+---------+ |....... | | validate_password | ACTIVE | VALIDATE PASSWORD | validate_password.so| GPL | +-------------------+--------+-------------------+---------------------+---------+ 说明: Name: 插件的名称。 Status: 插件的状态,比如ACTIVE表示插件正在运行。 Type: 插件的类型,比如VALIDATE PASSWORD(密码验证)。 Library:插件的共享库文件名。 License:插件的许可证信息。 '===================== 以MySQL组件的方式安装MySQL密码校验功能 =====================' 命令: INSTALL COMPONENT 'file://component_validate_password'; 说明:该命令用于将validate_password功能作为MySQL组件安装。组件在MySQL 8.0中引入。 与插件类似,组件也是用来增强MySQL的功能,但它们可能以不同的方式集成和管理。 注意:组件与插件的加载机制不同,组件可以在MySQL运行时动态添加或删除,且不需要服务器重新启动。 查看组件安装是否成功: SELECT * FROM mysql.component; +--------------+--------------------+------------------------------------+ | component_id | component_group_id | component_urn | +--------------+--------------------+------------------------------------+ | 1 | 1 | file://component_validate_password | +--------------+--------------------+------------------------------------+ '===================== 在MySQL中卸载这插件或组件方式的校验功能 =====================' '一旦卸载此插件或者组件后,则代表放弃密码校验功能' # 卸载MySQL密码强度校验插件(若报错应该是插件之前没安装) UNINSTALL PLUGIN validate_password; # 卸载MySQL密码强度校验组件 UNINSTALL COMPONENT 'file://component_validate_password';
二:细聊MySQL密码校验
完成了安装后我们就可以查看一些默认的密码校验配置了,但是需要注意的是以组件方式的安装和插件方式的安装打印出的配置方式是不一样的哟,但表示的意思是一样的,下面我们就来一起看看吧:
通过SHOW VARIABLES LIKE 'validate_password%'
命令查看密码校验配置。
MySQL8.4中通过'插件方式'安装后的配置项: >> 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 | +--------------------------------------+--------+ MySQL8.4中通过'组件方式'安装后的配置项: >> show variables like 'validate_password%'; +-------------------------------------------------+--------+ | Variable_name | Value | +-------------------------------------------------+--------+ | validate_password.changed_characters_percentage | 0 | | 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 | +-------------------------------------------------+--------+ '通过上面的配置可以看出基本上都是一样的,只不过插件方式和组件方式中间的分割符从‘_’变为了‘.’;' 下面以组件方式介绍(除了第一条配置是MySQL 8.0.13引入的,其它都是MySQL 5.7.8引入的): '1:validate_password.changed_characters_percentage' 作用:强制要求用户在更改密码时,新的密码与旧的密码之间有一定比例的字符不同。这个设置可以防止用户 通过仅修改少数几个字符来满足密码更改的要求,从而确保密码更为安全。 默认值:默认情况下,该参数的值为0,即不强制要求新旧密码之间的字符变化。 配置示例: SET GLOBAL validate_password.changed_characters_percentage = 50; 设置要求新密码与旧密码至少有 50%(一半)的字符不同。 '2:validate_password.check_user_name' 作用:检查用户密码是否包含用户名,防止用户在密码中包含自己的用户名。 取值:ON(启用)、OFF(关闭) 使用场景:防止使用用户名作为密码的一部分,增强密码的不可预测性。 配置示例: SET GLOBAL validate_password.check_user_name = OFF; 关闭检查以允许用户名作为密码的一部分。 '3:validate_password.dictionary_file' 作用:指定一个包含常用词汇的字典文件路径,用于检查密码是否包含常见的弱密码词汇。 默认值:未指定字典文件 使用场景:通过使用字典文件,防止用户设置包含常见词汇的弱密码。 配置示例: SET GLOBAL validate_password.dictionary_file = '/dictionary.txt'; 指定字典文件路径用于密码检查。 文件内容要求: 每行一个词汇、无特殊分隔符、不区分大小写;如下文件内容: password 123456 qwerty ... '4:validate_password.length' 作用:设置密码的最小长度,确保密码有足够的字符数以提高安全性。 默认值:8(代表至少8位字符的密码) 使用场景:通过强制密码长度要求,防止使用过短的密码,提升密码强度。 配置示例: SET GLOBAL validate_password.length = 12; 设置最小密码长度为 12 个字符。 '5:validate_password.mixed_case_count' 作用:规定密码中必须包含的大写字母、小写字母的最小数量。 默认值:1(代表密码中至少出现一次大写字母和小写字母) 使用场景:通过要求大小写字母的混合,增强密码的复杂性。 配置示例: SET GLOBAL validate_password.mixed_case_count = 2; 设置密码中至少包含2个大写字母和小写字母。 '6:validate_password.number_count' 作用:规定密码中必须包含的数字字符的最小数量。 默认值:1 配置示例: SET GLOBAL validate_password.number_count = 2; 设置密码中至少包含 2 个数字字符。 '7:validate_password.policy' 作用:定义密码的复杂性策略。主要有三种策略级别: LOW 或 0:仅检查密码长度。 MEDIUM 或 1:检查密码长度、字符类型组合(如大小写字母、数字和特殊字符)。 STRONG 或 2:除了MEDIUM级别的检查外,还要求密码不能包含字典中的词汇(如果字典文件被配置)。 默认值:MEDIUM(只检查是否包含大写、小写、数字、特殊字符) 配置示例: SET GLOBAL validate_password.policy = 'LOW'; 只检查密码长度。 '8:validate_password.special_char_count' 作用:规定密码中必须包含的特殊字符(如 @, #, $)的最小数量。 默认值:1(至少包含一个特殊字符) 配置示例: SET GLOBAL validate_password.special_char_count = 2; 设置密码中至少包含 2 个特殊字符。
通过上面的示例我们基本上可以对每个配置进行修改了,但是有个问题,一旦MySQL重启,那么配置将被清除,若想恢复只能手动一个个单独设置了(重复之前的操作),但是我们也可以通过配置my.cnf的方式来进行持久配置。如下:
配置文件: Linux配置文件则一般在:/etc/mysql/my.cnf 或 /etc/my.cnf Windows配置文件是安装MySQL的目录,配置文件名为:my.ini '修改配置项:' '使用组件方式安装的密码校验配置(选择需要的配置写上即可):' [mysqld] validate_password.changed_characters_percentage = 50 validate_password.check_user_name = ON validate_password.dictionary_file = xxx.txt validate_password.length = 12 validate_password.mixed_case_count = 2 validate_password.number_count = 2 validate_password.policy = STRONG validate_password.special_char_count = 2 '使用插件方式安装的密码校验配置(选择需要的配置写上即可):' [mysqld] validate_password_check_user_name = ON validate_password_dictionary_file = xxx.txt validate_password_length = 12 validate_password_mixed_case_count = 2 validate_password_number_count = 2 validate_password_policy = STRONG validate_password_special_char_count = 2 '设置好重启即可!'