首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >等保认证必备!MySQL密码复杂度、过期策略,插件实操一看就会

等保认证必备!MySQL密码复杂度、过期策略,插件实操一看就会

作者头像
俊才
发布2026-03-31 12:37:37
发布2026-03-31 12:37:37
1140
举报
文章被收录于专栏:数据库干货铺数据库干货铺

相信很多同学都遇到过这样的窘境:登录MySQL系统时,突然弹出一行报错,直接被拒之门外:

代码语言:javascript
复制
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement

明明密码没记错,却提示必须重置密码。这其实是MySQL密码过期策略在起作用。而背后更深层的原因,是网络安全等级保护(等保)的强制要求:不管是等保二级还是三级,都明确规定数据库密码需具备足够复杂度、定期过期、禁止重用,以此防范暴力破解、密码泄露等安全风险。今天我就一起探讨一下MySQL的validate_password插件(组件)。

一、 如何使用validate_password

1. 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中查询插件状态时,容易报错,大部分情况是因为混淆了版本差异,如下步骤可以供大家参考。

代码语言:javascript
复制
-- 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-add=validate_password.so
validate_password=FORCE_PLUS_PERMANENT

安装前后的结果如下图所示:

开启后可以查到对应的参数

验证方法:尝试设置弱密码,出现报错即说明插件已生效。例如:

代码语言:javascript
复制
mysql> set password= PASSWORD('123456');
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
mysql> 

3. MySQL8.0启用方法

在MySQL8.0中强制密码策略由validate_password组件提供。从MySQL8.0.17开始,它通常作为组件(Component)安装和管理,而不是传统的插件,但为了兼容性,旧的安装方式依然有效

3.1 兼容老版本的方式开启

和MySQL5.7的方式一样开启,例如:

代码语言:javascript
复制
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 requirements
mysql> 

查看对应参数结果如下:

代码语言:javascript
复制
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+ 推荐使用组件安装方式进行开启。例如:

代码语言:javascript
复制
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]部分添加以下内容:

代码语言:javascript
复制
[mysqld]
# 加载组件
plugin-load-add=component_validate_password.so
# 或者对于传统插件方式:
# plugin-load-add = validate_password.so
# 设置默认策略等级 (可选,默认为 MEDIUM)
validate_password.policy=MEDIUM

注意:文件名后缀.so(Linux)或.dll(Windows)取决于操作系统。在某些发行版中,组件可能不需要指定文件名,只需写component_validate_password。

二、 配置策略

1. 配置密码策略强度

安装成功后,可以通过系统变量调整策略的严格程度。validate_password.policy(或validate_password_policy)有三个主要级别:

级别

要求

LOW

0

仅检查密码长度(默认最小长度为8)

MEDIUM

1

(默认)检查长度、数字、大小写字母、特殊字符

STRONG

2

在MEDIUM基础上,增加字典文件检查(防止使用常见单词)

修改策略示例:

代码语言:javascript
复制
mysql> SET GLOBAL validate_password.policy=STRONG;
Query OK, 0 rows affected (0.00 sec)
mysql> SET GLOBAL validate_password.policy=LOW;
Query OK, 0 rows affected (0.00 sec)
mysql> SET GLOBAL validate_password.policy=MEDIUM;
Query OK, 0 rows affected (0.00 sec)

其他常用配置参数:

代码语言:javascript
复制
-- 最小密码长度 (默认 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_length=12。

2. 配置密码过期策略

密码过期不是插件的功能,而是MySQL自带的内置机制,既可以全局统一设置所有用户的密码有效期,也能给单个用户单独配置。下面结合真实使用场景,分享两个常用案例。

  • 案例1:全局配置(所有用户通用)
代码语言:javascript
复制
-- 所有用户密码90天过期(生产环境推荐配置,符合安全规范)
SET GLOBAL default_password_lifetime = 90;
-- 密码永不过期(仅测试环境可临时使用,生产环境不推荐)
SET GLOBAL default_password_lifetime = 0;
  • 案例2:单用户个性化配置

场景:给test用户单独设置60天密码有效期,其他用户仍沿用全局90天的规则

代码语言:javascript
复制
-- 单独设置test用户密码60天过期
ALTER USER 'test'@'%' PASSWORD EXPIRE INTERVAL 60 DAY;
-- 手动强制密码过期(比如员工离职,需立即让其账号密码失效)
ALTER USER 'test'@'%' PASSWORD EXPIRE;
-- 密码过期后登录报错,快速解决方法(登录后执行)
ALTER USER  'test'@'%'   IDENTIFIED BY 'Test_2026%NewPwd';

3. 密码过期的用户登录报错

如果密码过期的用户在登录时会报如下错误:

代码语言:javascript
复制
[root@alidb ~]# mysql -utest -p -h 127.0.0.1 -P 3307
Enter password: 
ERROR 1862 (HY000): Your password has expired. To log in you must change it using a client that supports expired passwords.

三、 卸载插件

1. 卸载传统插件

如果是原先插件的方式配置的,则用如下方式卸载

代码语言:javascript
复制
-- Linux
UNINSTALL PLUGIN validate_password;
-- Windows (如果上面命令无效,有时需要指定,但通常只需名字)
UNINSTALL PLUGIN validate_password;

2. 卸载组件

MySQL8.0.17+版本后使用安装组件的方式进行的,则按照如下方式卸载:

代码语言:javascript
复制
UNINSTALL COMPONENT 'file://component_validate_password';

注意:组件名称通常包含file://前缀。如果报错,尝试去掉前缀或直接使用组件名,但在官方文档中标准写法是带前缀的。

3. 卸载后查看插件(组件)

卸载后再次查看插件(组件),将发现不存在了

对应参数也没有了

四、等保要求

validate_password插件就是为了达到等保对MySQL密码的核心要求。这也是我们配置插件和策略的出发点,避免做无用功。例如主要的几个要求:

  • 密码复杂度:需包含大小写字母、数字、特殊字符,长度不低于8位(等保三级建议不低于10位)
  • 密码过期:密码有效期不超过90天,到期必须强制修改,禁止永不过期(生产环境严格执行)
  • 密码重用:禁止重用最近5次以上的旧密码,且旧密码在180天内不可复用

而validate_password插件,正是实现“密码复杂度校验”的核心工具,再配合MySQL内置的密码过期、重用策略,就能完美满足等保合规要求。

五、 结语

掌握本文以上插件用法和策略配置,既能解决登录报错、弱密码等实际问题,也能顺利通过等保审计,建议收藏,用到时直接对照操作即可,不用再反复查资料。

你在使用MySQL时,还遇到过哪些密码相关的坑?或者有等保合规相关的疑问,评论区留言交流,一起避坑~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-03-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据库干货铺 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档