相信很多同学都遇到过这样的窘境登录MySQL系统时突然弹出一行报错直接被拒之门外ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement明明密码没记错却提示必须重置密码。这其实是MySQL密码过期策略在起作用。而背后更深层的原因是网络安全等级保护等保的强制要求不管是等保二级还是三级都明确规定数据库密码需具备足够复杂度、定期过期、禁止重用以此防范暴力破解、密码泄露等安全风险。今天我就一起探讨一下MySQL的validate_password插件组件。一、 如何使用validate_password1. validate_password的作用validate_password的核心作用很明确强制密码满足指定复杂度从根源上杜绝123456、admin这类弱密码。不过要注意MySQL5.7和MySQL8.0中它的使用方式差别还是比较大的后文会做具体的操作演示。MySQL版本插件形式默认状态5.7插件Plugin未安装需手动安装启用8.0(8.0.17版本后组件Component插件及组件均可2. MySQL5.7安装启用插件很多同学在MySQL5.7中查询插件状态时容易报错大部分情况是因为混淆了版本差异如下步骤可以供大家参考。-- 1. 安装插件无需重启MySQL立即生效INSTALL PLUGIN validate_password SONAME validate_password.so;-- 2. 查看插件状态SELECT * FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE validate_password%;-- 3. 永久启用避免重启MySQL后插件失效修改my.cnf配置[mysqld]plugin-load-addvalidate_password.sovalidate_passwordFORCE_PLUS_PERMANENT安装前后的结果如下图所示开启后可以查到对应的参数验证方法尝试设置弱密码出现报错即说明插件已生效。例如mysql set password PASSWORD(123456);ERROR 1819 (HY000): Your password does not satisfy the current policy requirementsmysql3. MySQL8.0启用方法在MySQL8.0中强制密码策略由validate_password组件提供。从MySQL8.0.17开始它通常作为组件Component安装和管理而不是传统的插件但为了兼容性旧的安装方式依然有效。3.1 兼容老版本的方式开启和MySQL5.7的方式一样开启例如mysql INSTALL PLUGIN validate_password SONAME validate_password.so; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql SELECT * FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE %password%;-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| PLUGIN_NAME | PLUGIN_VERSION | PLUGIN_STATUS | PLUGIN_TYPE | PLUGIN_TYPE_VERSION | PLUGIN_LIBRARY | PLUGIN_LIBRARY_VERSION | PLUGIN_AUTHOR | PLUGIN_DESCRIPTION | PLUGIN_LICENSE | LOAD_OPTION |-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| mysql_native_password | 1.1 | ACTIVE | AUTHENTICATION | 2.1 | NULL | NULL | Oracle Corporation | Native MySQL authentication | GPL | FORCE || sha256_password | 1.1 | ACTIVE | AUTHENTICATION | 2.1 | NULL | NULL | Oracle Corporation | SHA256 password authentication | GPL | FORCE || caching_sha2_password | 1.0 | ACTIVE | AUTHENTICATION | 2.1 | NULL | NULL | Oracle Corporation | Caching sha2 authentication | GPL | FORCE || validate_password | 1.1 | ACTIVE | VALIDATE PASSWORD | 1.0 | validate_password.so | 1.11 | Oracle Corporation | check password strength | GPL | ON |-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------4 rows in set (0.00 sec) mysql alter user app_user identified by 123456;ERROR 1819 (HY000): Your password does not satisfy the current policy requirementsmysql查看对应参数结果如下mysql SHOW GLOBAL 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 |----------------------------------------------7 rows in set (0.01 sec)3.2 启用组件的方式MySQL8.0.17 推荐使用组件安装方式进行开启。例如mysql SELECT * FROM mysql.component;Empty set (0.00 sec) mysql SELECT plugin_name, plugin_status - FROM information_schema.plugins - WHERE plugin_name validate_password;Empty set (0.00 sec) mysql INSTALL COMPONENT file://component_validate_password;Query OK, 0 rows affected (0.00 sec) mysql SELECT * FROM mysql.component;----------------------------------------------------------------------| component_id | component_group_id | component_urn |----------------------------------------------------------------------| 1 | 1 | file://component_validate_password |----------------------------------------------------------------------1 row in set (0.00 sec)此时查看变量会发现多出8个4. 永久开启推荐重启后依然有效修改MySQL配置文件在[mysqld]部分添加以下内容[mysqld]# 加载组件plugin-load-addcomponent_validate_password.so# 或者对于传统插件方式# plugin-load-add validate_password.so# 设置默认策略等级 (可选默认为 MEDIUM)validate_password.policyMEDIUM注意文件名后缀.so(Linux)或.dll(Windows)取决于操作系统。在某些发行版中组件可能不需要指定文件名只需写component_validate_password。二、 配置策略1. 配置密码策略强度安装成功后可以通过系统变量调整策略的严格程度。validate_password.policy(或validate_password_policy)有三个主要级别级别值要求LOW0仅检查密码长度默认最小长度为8MEDIUM1默认检查长度、数字、大小写字母、特殊字符STRONG2在MEDIUM基础上增加字典文件检查防止使用常见单词修改策略示例mysql SET GLOBAL validate_password.policySTRONG;Query OK, 0 rows affected (0.00 sec)mysql SET GLOBAL validate_password.policyLOW;Query OK, 0 rows affected (0.00 sec)mysql SET GLOBAL validate_password.policyMEDIUM;Query OK, 0 rows affected (0.00 sec)其他常用配置参数-- 最小密码长度 (默认 8)SET GLOBAL validate_password.length 8;-- 必须包含的数字个数 (默认 1)SET GLOBAL validate_password.number_count 1;-- 必须包含的大小写字母个数 (默认 1)SET GLOBAL validate_password.mixed_case_count 1;-- 必须包含的特殊字符个数 (默认 1)SET GLOBAL validate_password.special_char_count 1;-- 是否检查用户名与密码相同 (默认 ON)SET GLOBAL validate_password.check_user_name ON;注若要永久生效请将上述SET GLOBAL命令对应的参数写入配置文件的[mysqld]段中例如validate_password_length12。2. 配置密码过期策略密码过期不是插件的功能而是MySQL自带的内置机制既可以全局统一设置所有用户的密码有效期也能给单个用户单独配置。下面结合真实使用场景分享两个常用案例。案例1全局配置所有用户通用-- 所有用户密码90天过期生产环境推荐配置符合安全规范SET GLOBAL default_password_lifetime 90;-- 密码永不过期仅测试环境可临时使用生产环境不推荐SET GLOBAL default_password_lifetime 0;案例2单用户个性化配置场景给test用户单独设置60天密码有效期其他用户仍沿用全局90天的规则-- 单独设置test用户密码60天过期ALTER USER test% PASSWORD EXPIRE INTERVAL 60 DAY;-- 手动强制密码过期比如员工离职需立即让其账号密码失效ALTER USER test% PASSWORD EXPIRE;-- 密码过期后登录报错快速解决方法登录后执行ALTER USER test% IDENTIFIED BY Test_2026%NewPwd;3. 密码过期的用户登录报错如果密码过期的用户在登录时会报如下错误[rootalidb ~]# mysql -utest -p -h 127.0.0.1 -P 3307Enter password: ERROR 1862 (HY000): Your password has expired. To log in you must change it using a client that supports expired passwords.三、 卸载插件1. 卸载传统插件如果是原先插件的方式配置的则用如下方式卸载-- LinuxUNINSTALL PLUGIN validate_password;-- Windows (如果上面命令无效有时需要指定但通常只需名字)UNINSTALL PLUGIN validate_password;2. 卸载组件MySQL8.0.17版本后使用安装组件的方式进行的则按照如下方式卸载UNINSTALL COMPONENT file://component_validate_password;注意组件名称通常包含file://前缀。如果报错尝试去掉前缀或直接使用组件名但在官方文档中标准写法是带前缀的。3. 卸载后查看插件组件卸载后再次查看插件组件将发现不存在了对应参数也没有了四、等保要求validate_password插件就是为了达到等保对MySQL密码的核心要求。这也是我们配置插件和策略的出发点避免做无用功。例如主要的几个要求密码复杂度需包含大小写字母、数字、特殊字符长度不低于8位等保三级建议不低于10位密码过期密码有效期不超过90天到期必须强制修改禁止永不过期生产环境严格执行密码重用禁止重用最近5次以上的旧密码且旧密码在180天内不可复用而validate_password插件正是实现“密码复杂度校验”的核心工具再配合MySQL内置的密码过期、重用策略就能完美满足等保合规要求。五、 结语掌握本文以上插件用法和策略配置既能解决登录报错、弱密码等实际问题也能顺利通过等保审计建议收藏用到时直接对照操作即可不用再反复查资料。你在使用MySQL时还遇到过哪些密码相关的坑或者有等保合规相关的疑问评论区留言交流一起避坑
等保认证必备!MySQL密码复杂度、过期策略,插件实操一看就会
相信很多同学都遇到过这样的窘境登录MySQL系统时突然弹出一行报错直接被拒之门外ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement明明密码没记错却提示必须重置密码。这其实是MySQL密码过期策略在起作用。而背后更深层的原因是网络安全等级保护等保的强制要求不管是等保二级还是三级都明确规定数据库密码需具备足够复杂度、定期过期、禁止重用以此防范暴力破解、密码泄露等安全风险。今天我就一起探讨一下MySQL的validate_password插件组件。一、 如何使用validate_password1. validate_password的作用validate_password的核心作用很明确强制密码满足指定复杂度从根源上杜绝123456、admin这类弱密码。不过要注意MySQL5.7和MySQL8.0中它的使用方式差别还是比较大的后文会做具体的操作演示。MySQL版本插件形式默认状态5.7插件Plugin未安装需手动安装启用8.0(8.0.17版本后组件Component插件及组件均可2. MySQL5.7安装启用插件很多同学在MySQL5.7中查询插件状态时容易报错大部分情况是因为混淆了版本差异如下步骤可以供大家参考。-- 1. 安装插件无需重启MySQL立即生效INSTALL PLUGIN validate_password SONAME validate_password.so;-- 2. 查看插件状态SELECT * FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE validate_password%;-- 3. 永久启用避免重启MySQL后插件失效修改my.cnf配置[mysqld]plugin-load-addvalidate_password.sovalidate_passwordFORCE_PLUS_PERMANENT安装前后的结果如下图所示开启后可以查到对应的参数验证方法尝试设置弱密码出现报错即说明插件已生效。例如mysql set password PASSWORD(123456);ERROR 1819 (HY000): Your password does not satisfy the current policy requirementsmysql3. MySQL8.0启用方法在MySQL8.0中强制密码策略由validate_password组件提供。从MySQL8.0.17开始它通常作为组件Component安装和管理而不是传统的插件但为了兼容性旧的安装方式依然有效。3.1 兼容老版本的方式开启和MySQL5.7的方式一样开启例如mysql INSTALL PLUGIN validate_password SONAME validate_password.so; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql SELECT * FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE %password%;-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| PLUGIN_NAME | PLUGIN_VERSION | PLUGIN_STATUS | PLUGIN_TYPE | PLUGIN_TYPE_VERSION | PLUGIN_LIBRARY | PLUGIN_LIBRARY_VERSION | PLUGIN_AUTHOR | PLUGIN_DESCRIPTION | PLUGIN_LICENSE | LOAD_OPTION |-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| mysql_native_password | 1.1 | ACTIVE | AUTHENTICATION | 2.1 | NULL | NULL | Oracle Corporation | Native MySQL authentication | GPL | FORCE || sha256_password | 1.1 | ACTIVE | AUTHENTICATION | 2.1 | NULL | NULL | Oracle Corporation | SHA256 password authentication | GPL | FORCE || caching_sha2_password | 1.0 | ACTIVE | AUTHENTICATION | 2.1 | NULL | NULL | Oracle Corporation | Caching sha2 authentication | GPL | FORCE || validate_password | 1.1 | ACTIVE | VALIDATE PASSWORD | 1.0 | validate_password.so | 1.11 | Oracle Corporation | check password strength | GPL | ON |-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------4 rows in set (0.00 sec) mysql alter user app_user identified by 123456;ERROR 1819 (HY000): Your password does not satisfy the current policy requirementsmysql查看对应参数结果如下mysql SHOW GLOBAL 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 |----------------------------------------------7 rows in set (0.01 sec)3.2 启用组件的方式MySQL8.0.17 推荐使用组件安装方式进行开启。例如mysql SELECT * FROM mysql.component;Empty set (0.00 sec) mysql SELECT plugin_name, plugin_status - FROM information_schema.plugins - WHERE plugin_name validate_password;Empty set (0.00 sec) mysql INSTALL COMPONENT file://component_validate_password;Query OK, 0 rows affected (0.00 sec) mysql SELECT * FROM mysql.component;----------------------------------------------------------------------| component_id | component_group_id | component_urn |----------------------------------------------------------------------| 1 | 1 | file://component_validate_password |----------------------------------------------------------------------1 row in set (0.00 sec)此时查看变量会发现多出8个4. 永久开启推荐重启后依然有效修改MySQL配置文件在[mysqld]部分添加以下内容[mysqld]# 加载组件plugin-load-addcomponent_validate_password.so# 或者对于传统插件方式# plugin-load-add validate_password.so# 设置默认策略等级 (可选默认为 MEDIUM)validate_password.policyMEDIUM注意文件名后缀.so(Linux)或.dll(Windows)取决于操作系统。在某些发行版中组件可能不需要指定文件名只需写component_validate_password。二、 配置策略1. 配置密码策略强度安装成功后可以通过系统变量调整策略的严格程度。validate_password.policy(或validate_password_policy)有三个主要级别级别值要求LOW0仅检查密码长度默认最小长度为8MEDIUM1默认检查长度、数字、大小写字母、特殊字符STRONG2在MEDIUM基础上增加字典文件检查防止使用常见单词修改策略示例mysql SET GLOBAL validate_password.policySTRONG;Query OK, 0 rows affected (0.00 sec)mysql SET GLOBAL validate_password.policyLOW;Query OK, 0 rows affected (0.00 sec)mysql SET GLOBAL validate_password.policyMEDIUM;Query OK, 0 rows affected (0.00 sec)其他常用配置参数-- 最小密码长度 (默认 8)SET GLOBAL validate_password.length 8;-- 必须包含的数字个数 (默认 1)SET GLOBAL validate_password.number_count 1;-- 必须包含的大小写字母个数 (默认 1)SET GLOBAL validate_password.mixed_case_count 1;-- 必须包含的特殊字符个数 (默认 1)SET GLOBAL validate_password.special_char_count 1;-- 是否检查用户名与密码相同 (默认 ON)SET GLOBAL validate_password.check_user_name ON;注若要永久生效请将上述SET GLOBAL命令对应的参数写入配置文件的[mysqld]段中例如validate_password_length12。2. 配置密码过期策略密码过期不是插件的功能而是MySQL自带的内置机制既可以全局统一设置所有用户的密码有效期也能给单个用户单独配置。下面结合真实使用场景分享两个常用案例。案例1全局配置所有用户通用-- 所有用户密码90天过期生产环境推荐配置符合安全规范SET GLOBAL default_password_lifetime 90;-- 密码永不过期仅测试环境可临时使用生产环境不推荐SET GLOBAL default_password_lifetime 0;案例2单用户个性化配置场景给test用户单独设置60天密码有效期其他用户仍沿用全局90天的规则-- 单独设置test用户密码60天过期ALTER USER test% PASSWORD EXPIRE INTERVAL 60 DAY;-- 手动强制密码过期比如员工离职需立即让其账号密码失效ALTER USER test% PASSWORD EXPIRE;-- 密码过期后登录报错快速解决方法登录后执行ALTER USER test% IDENTIFIED BY Test_2026%NewPwd;3. 密码过期的用户登录报错如果密码过期的用户在登录时会报如下错误[rootalidb ~]# mysql -utest -p -h 127.0.0.1 -P 3307Enter password: ERROR 1862 (HY000): Your password has expired. To log in you must change it using a client that supports expired passwords.三、 卸载插件1. 卸载传统插件如果是原先插件的方式配置的则用如下方式卸载-- LinuxUNINSTALL PLUGIN validate_password;-- Windows (如果上面命令无效有时需要指定但通常只需名字)UNINSTALL PLUGIN validate_password;2. 卸载组件MySQL8.0.17版本后使用安装组件的方式进行的则按照如下方式卸载UNINSTALL COMPONENT file://component_validate_password;注意组件名称通常包含file://前缀。如果报错尝试去掉前缀或直接使用组件名但在官方文档中标准写法是带前缀的。3. 卸载后查看插件组件卸载后再次查看插件组件将发现不存在了对应参数也没有了四、等保要求validate_password插件就是为了达到等保对MySQL密码的核心要求。这也是我们配置插件和策略的出发点避免做无用功。例如主要的几个要求密码复杂度需包含大小写字母、数字、特殊字符长度不低于8位等保三级建议不低于10位密码过期密码有效期不超过90天到期必须强制修改禁止永不过期生产环境严格执行密码重用禁止重用最近5次以上的旧密码且旧密码在180天内不可复用而validate_password插件正是实现“密码复杂度校验”的核心工具再配合MySQL内置的密码过期、重用策略就能完美满足等保合规要求。五、 结语掌握本文以上插件用法和策略配置既能解决登录报错、弱密码等实际问题也能顺利通过等保审计建议收藏用到时直接对照操作即可不用再反复查资料。你在使用MySQL时还遇到过哪些密码相关的坑或者有等保合规相关的疑问评论区留言交流一起避坑