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 提供多种认证插件,需根据业务与客户端支持情况选择:

  1. caching_sha2_password(默认)
    - 更安全的 SHA-2 认证,支持缓存提升性能
  2. mysql_native_password
    - 兼容老客户端,但安全性弱
  3. sha256_password
    - 安全性高,但对连接安全性要求更高
  4. 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';

注意: 回退需记录审批与到期时间,避免长期弱认证。

六、运维落地流程建议#

  1. 制定统一密码策略:写入运维标准与合规文档
  2. 配置参数基线:在 my.cnf 中固化配置
  3. 账户创建模板:强制指定插件、过期策略、锁定策略
  4. 定期审计:检查弱口令、长期未更换、失败登录记录
  5. 应急回退:预留兼容方案,但需严格审批与时间限制

账户创建模板(可作为标准流程脚本片段):

-- 统一模板:强认证 + 过期 + 锁定
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. 练习1: 开启 validate_password 组件并设置 STRONG 策略,验证弱口令拒绝效果。
  2. 练习2: 创建用户 audit_user,设置 60 天过期、失败 3 次锁定 2 天,并授予只读权限。
  3. 练习3: 将一个旧账号从 mysql_native_password 切换为 caching_sha2_password,并记录兼容性验证步骤。

通过合理配置密码策略与认证插件,可显著降低账号被盗用风险,提升整体数据库安全基线。