6.3.3 密码策略与认证插件配置
本节聚焦 MySQL 的密码策略与认证插件配置,目标是提升账户安全性、抵御弱口令与暴力破解,并在合规要求下实现可审计、可控的身份验证体系。内容涵盖密码复杂度与生命周期、认证插件机制、切换与兼容策略,以及运维落地操作与验证方法。
一、密码策略核心要点#
- 复杂度要求:长度、大小写、数字、特殊字符组合;禁止包含用户名、主机名、业务标识等弱特征。
- 生命周期管理:强制定期过期(EXPIRE),限制重复使用(HISTORY),防止长期不变导致风险积累。
- 失败锁定机制:连续错误登录触发锁定(FAILED_LOGIN_ATTEMPTS + PASSWORD_LOCK_TIME),降低暴力破解成功率。
- 安全传输:推荐 TLS/SSL 连接,防止口令在传输过程中被嗅探。
原理草图:密码策略与认证插件流程
二、validate_password 组件配置#
MySQL 8.0 使用 validate_password 组件进行密码强度检查,需确保组件加载并设置合理阈值。
1. 组件安装与启用#
检查组件是否加载:
SELECT * FROM mysql.component WHERE component_urn LIKE 'file://component_validate_password%';
加载组件(如未启用):
INSTALL COMPONENT 'file://component_validate_password';
预期效果:
- mysql.component 中出现 component_validate_password 记录。
- 设置弱口令将被拒绝。
2. 运行时配置与持久化#
运行时设置(立即生效,重启后失效):
SET GLOBAL validate_password.length = 12;
SET GLOBAL validate_password.policy = 'STRONG';
SET GLOBAL validate_password.special_char_count = 1;
SET GLOBAL validate_password.mixed_case_count = 1;
SET GLOBAL validate_password.number_count = 1;
SET GLOBAL validate_password.check_user_name = ON;
持久化配置(推荐写入配置文件):
# /etc/my.cnf
[mysqld]
validate_password.length=12
validate_password.policy=STRONG
validate_password.special_char_count=1
validate_password.mixed_case_count=1
validate_password.number_count=1
validate_password.check_user_name=ON
关键参数说明:
- validate_password.length:最小长度
- validate_password.policy:复杂度策略(LOW/MEDIUM/STRONG)
- validate_password.special_char_count:特殊字符数量
- validate_password.mixed_case_count:大小写混合数量
- validate_password.number_count:数字数量
- validate_password.check_user_name:是否禁止使用用户名作为密码
三、密码过期与锁定策略#
MySQL 8.0 支持账户级密码策略设置,推荐在用户创建时执行:
创建账户并强制策略:
CREATE USER 'app_user'@'10.%'
IDENTIFIED WITH caching_sha2_password BY 'Str0ng!Passw0rd'
PASSWORD EXPIRE INTERVAL 90 DAY
FAILED_LOGIN_ATTEMPTS 5 PASSWORD_LOCK_TIME 1;
GRANT SELECT,INSERT,UPDATE ON appdb.* TO 'app_user'@'10.%';
强制立即过期(要求首次登录修改):
ALTER USER 'app_user'@'10.%' PASSWORD EXPIRE;
查看账户策略状态:
SELECT user, host, password_expired, password_lifetime,
failed_login_attempts, password_lock_time
FROM mysql.user
WHERE user='app_user';
四、认证插件与适用场景#
MySQL 提供多种认证插件,需根据业务与客户端支持情况选择:
- caching_sha2_password(默认)
- 更安全的 SHA-2 认证,支持缓存提升性能 - mysql_native_password
- 兼容老客户端,但安全性弱 - sha256_password
- 安全性高,但对连接安全性要求更高 - auth_socket(Linux)
- 依赖系统用户与 Unix Socket,适用于本机运维账户
查看当前插件:
SELECT user, host, plugin FROM mysql.user;
五、认证插件切换与兼容策略#
1. 新账号强制使用安全插件#
CREATE USER 'report_user'@'192.168.%'
IDENTIFIED WITH caching_sha2_password BY 'ReporT!2024#';
2. 已有账号切换插件#
ALTER USER 'legacy_user'@'%'
IDENTIFIED WITH caching_sha2_password BY 'Upgr@de!2024';
3. 兼容性回退(仅临时)#
ALTER USER 'legacy_user'@'%'
IDENTIFIED WITH mysql_native_password BY 'Temp@1234';
注意: 回退需记录审批与到期时间,避免长期弱认证。
六、运维落地流程建议#
- 制定统一密码策略:写入运维标准与合规文档
- 配置参数基线:在 my.cnf 中固化配置
- 账户创建模板:强制指定插件、过期策略、锁定策略
- 定期审计:检查弱口令、长期未更换、失败登录记录
- 应急回退:预留兼容方案,但需严格审批与时间限制
账户创建模板(可作为标准流程脚本片段):
-- 统一模板:强认证 + 过期 + 锁定
CREATE USER 'svc_user'@'10.1.%'
IDENTIFIED WITH caching_sha2_password BY 'Svc@2024#Strong'
PASSWORD EXPIRE INTERVAL 90 DAY
FAILED_LOGIN_ATTEMPTS 5 PASSWORD_LOCK_TIME 1;
GRANT SELECT,EXECUTE ON svcdb.* TO 'svc_user'@'10.1.%';
七、验证、排错与常见问题#
1. 验证密码策略是否生效#
尝试弱口令(预期失败):
ALTER USER 'app_user'@'10.%' IDENTIFIED BY '123456';
-- 预期:ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
2. 插件不兼容导致连接失败#
现象: 客户端报 Authentication plugin 'caching_sha2_password' cannot be loaded
排查步骤:
# 1) 查看服务端插件
mysql -uroot -p -e "SELECT user,host,plugin FROM mysql.user WHERE user='legacy_user';"
# 2) 查看客户端版本
mysql --version
处理建议:
- 升级客户端连接器(JDBC/ODBC/Python驱动)
- 临时回退为 mysql_native_password 并设置到期回滚计划
3. 密码过期导致应用报错#
排查:
SELECT user, host, password_expired, password_last_changed
FROM mysql.user
WHERE user='app_user';
处理:
ALTER USER 'app_user'@'10.%' IDENTIFIED BY 'New@2024#Pass';
八、练习与操作题#
- 练习1: 开启
validate_password组件并设置 STRONG 策略,验证弱口令拒绝效果。 - 练习2: 创建用户
audit_user,设置 60 天过期、失败 3 次锁定 2 天,并授予只读权限。 - 练习3: 将一个旧账号从
mysql_native_password切换为caching_sha2_password,并记录兼容性验证步骤。
通过合理配置密码策略与认证插件,可显著降低账号被盗用风险,提升整体数据库安全基线。