Skip to content

MySQL 密码策略

密码策略是 MySQL 数据库安全的重要组成部分,它决定了用户密码的复杂性、有效期、更新频率等规则。合理的密码策略可以有效防止弱密码攻击,保护数据库的安全性。本文将详细介绍 MySQL 密码策略的配置、管理和最佳实践,包括不同版本的密码特性差异。

密码策略基础

密码策略的重要性

在生产环境中,弱密码是数据库安全的重大隐患:

  • 弱密码容易被暴力破解或字典攻击
  • 共享密码增加了权限泄露的风险
  • 长期不更换的密码容易被窃取和滥用
  • 缺乏密码复杂度要求可能导致密码过于简单

密码策略的核心要素

一个完善的密码策略应包含以下核心要素:

  • 密码复杂度要求:密码长度、字符类型(字母、数字、特殊字符)
  • 密码有效期:密码的最大使用期限
  • 密码历史记录:防止用户重复使用最近使用过的密码
  • 密码过期处理:密码过期后的处理方式
  • 失败登录尝试限制:防止暴力破解
  • 密码哈希算法:确保密码存储的安全性

不同版本的密码特性

MySQL 5.6 密码特性

MySQL 5.6 的密码管理功能相对基础:

  • 密码哈希算法:仅支持 mysql_native_password 算法
  • 密码复杂度:无内置的密码复杂度验证
  • 密码有效期:不支持密码过期策略
  • 密码历史记录:不支持密码历史记录
  • 失败登录限制:不支持内置的失败登录限制

MySQL 5.7 密码特性

MySQL 5.7 对密码管理进行了显著增强:

  • 密码哈希算法
    • 支持 mysql_native_password 算法
    • 引入 sha256_password 算法
  • 密码复杂度
    • 支持 validate_password 插件,可配置密码复杂度要求
    • 支持密码长度、字符类型、字典文件等配置
  • 密码有效期
    • 引入 password_expired 列,支持密码过期
    • 引入 password_last_changedpassword_lifetime
    • 支持全局和用户级别的密码过期设置
  • 失败登录限制
    • 支持 connection_control 插件,可限制失败登录尝试次数
    • 支持失败登录延迟

MySQL 8.0 密码特性

MySQL 8.0 对密码管理进行了全面增强:

  • 密码哈希算法
    • 默认使用 caching_sha2_password 算法(更安全)
    • 支持 mysql_native_passwordsha256_password 等算法
    • 增强了密码存储的安全性
  • 密码复杂度
    • 引入密码验证组件 component_validate_password
    • 支持更灵活的密码复杂度配置
    • 支持自定义密码验证规则
  • 密码有效期
    • 继承 MySQL 5.7 的密码过期功能
    • 支持更精细的密码过期配置
  • 密码历史记录
    • 支持密码历史记录,防止重复使用最近密码
    • 可配置历史记录长度
  • 失败登录限制
    • 增强了 connection_control 插件功能
    • 支持更灵活的失败登录限制配置
  • 密码轮换
    • 支持自动密码轮换
    • 支持密码过期提醒

密码策略配置

MySQL 5.7 密码策略配置

安装和启用 validate_password 插件

sql
-- 安装 validate_password 插件
INSTALL PLUGIN validate_password SONAME 'validate_password.so';

-- 启用 validate_password 插件
SET GLOBAL validate_password_policy = 'STRONG';
SET GLOBAL validate_password_length = 12;
SET GLOBAL validate_password_mixed_case_count = 1;
SET GLOBAL validate_password_number_count = 1;
SET GLOBAL validate_password_special_char_count = 1;
SET GLOBAL validate_password_dictionary_file = '/path/to/dictionary/file';

配置密码过期策略

sql
-- 全局密码过期策略(90天)
SET GLOBAL default_password_lifetime = 90;

-- 为特定用户设置密码过期时间
ALTER USER 'app_user'@'192.168.1.%' PASSWORD EXPIRE INTERVAL 30 DAY;

-- 禁用特定用户的密码过期
ALTER USER 'admin_user'@'localhost' PASSWORD EXPIRE NEVER;

-- 强制用户下次登录修改密码
ALTER USER 'user'@'host' PASSWORD EXPIRE;

配置失败登录限制

sql
-- 安装 connection_control 插件
INSTALL PLUGIN connection_control SONAME 'connection_control.so';
INSTALL PLUGIN connection_control_failed_login_attempts SONAME 'connection_control.so';

-- 配置失败登录限制
SET GLOBAL connection_control_max_connection_delay = 30000; -- 最大延迟30秒
SET GLOBAL connection_control_min_connection_delay = 1000; -- 最小延迟1秒
SET GLOBAL connection_control_failed_connections_threshold = 3; -- 3次失败尝试后开始延迟

MySQL 8.0 密码策略配置

安装和启用密码验证组件

sql
-- 安装密码验证组件
INSTALL COMPONENT 'file://component_validate_password';

-- 配置密码验证组件
SET GLOBAL validate_password.policy = 'STRONG';
SET GLOBAL validate_password.length = 12;
SET GLOBAL validate_password.mixed_case_count = 1;
SET GLOBAL validate_password.number_count = 1;
SET GLOBAL validate_password.special_char_count = 1;
SET GLOBAL validate_password.dictionary_file = '/path/to/dictionary/file';

配置密码过期策略

sql
-- 全局密码过期策略(90天)
SET GLOBAL default_password_lifetime = 90;

-- 为特定用户设置密码过期时间
ALTER USER 'app_user'@'192.168.1.%' PASSWORD EXPIRE INTERVAL 30 DAY;

-- 禁用特定用户的密码过期
ALTER USER 'admin_user'@'localhost' PASSWORD EXPIRE NEVER;

-- 强制用户下次登录修改密码
ALTER USER 'user'@'host' PASSWORD EXPIRE;

配置密码历史记录

sql
-- 全局密码历史记录(保存最近5个密码)
SET GLOBAL password_history = 5;

-- 为特定用户设置密码历史记录
ALTER USER 'app_user'@'192.168.1.%' PASSWORD HISTORY 10;

配置密码重试策略

sql
-- 安装 connection_control 插件
INSTALL PLUGIN connection_control SONAME 'connection_control.so';
INSTALL PLUGIN connection_control_failed_login_attempts SONAME 'connection_control.so';

-- 配置失败登录限制
SET GLOBAL connection_control_max_connection_delay = 30000; -- 最大延迟30秒
SET GLOBAL connection_control_min_connection_delay = 1000; -- 最小延迟1秒
SET GLOBAL connection_control_failed_connections_threshold = 3; -- 3次失败尝试后开始延迟

配置默认密码哈希算法

sql
-- 设置默认密码哈希算法
SET GLOBAL default_authentication_plugin = 'caching_sha2_password';

-- 为特定用户指定密码哈希算法
CREATE USER 'app_user'@'192.168.1.%' IDENTIFIED WITH caching_sha2_password BY 'StrongPass@2023';
ALTER USER 'old_user'@'host' IDENTIFIED WITH caching_sha2_password BY 'NewStrongPass@2023';

密码管理最佳实践

生产环境密码策略建议

密码复杂度要求

  • 密码长度:至少12个字符
  • 字符类型:包含大小写字母、数字和特殊字符
  • 避免常见模式:避免使用生日、电话号码、连续字符等
  • 禁止使用字典词:避免使用常见字典中的单词

密码有效期

  • 普通用户:30-90天
  • 管理员用户:15-30天
  • 服务账号:根据安全要求设置,建议最长不超过180天
  • 临时账号:设置明确的过期时间

密码轮换策略

  • 定期轮换:按照密码有效期定期更换密码
  • 强制轮换:密码过期后必须更换
  • 平滑过渡:提前提醒用户密码即将过期
  • 避免频繁轮换:过于频繁的密码轮换可能导致用户选择更简单的密码

密码存储安全

  • 使用强哈希算法:MySQL 8.0 建议使用 caching_sha2_password
  • 禁止明文存储:绝对禁止在配置文件或脚本中明文存储密码
  • 使用密钥管理系统:考虑使用 AWS KMS、HashiCorp Vault 等密钥管理系统
  • 加密传输:使用 SSL/TLS 加密密码传输

密码策略实施建议

制定明确的密码策略文档

  • 明确密码复杂度、有效期、轮换规则
  • 明确密码管理流程和责任
  • 定期更新和审查密码策略

培训和意识提升

  • 定期对用户进行密码安全培训
  • 提高用户的密码安全意识
  • 提供密码管理工具和建议

自动化密码管理

  • 使用自动化工具管理密码生命周期
  • 实现密码过期提醒和自动轮换
  • 集成企业身份管理系统

定期审计和监控

  • 定期审计用户密码策略的合规性
  • 监控失败登录尝试和异常密码活动
  • 及时处理密码泄露事件

密码相关问题排查

密码过期导致的连接失败

错误信息

ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

解决方案

sql
-- 登录后修改密码
ALTER USER 'user'@'host' IDENTIFIED BY 'NewStrongPass@2023';

-- 或使用 SET PASSWORD 语句
SET PASSWORD FOR 'user'@'host' = PASSWORD('NewStrongPass@2023'); -- MySQL 5.6/5.7
SET PASSWORD FOR 'user'@'host' = 'NewStrongPass@2023'; -- MySQL 8.0

密码复杂度验证失败

错误信息

ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

解决方案

  • 使用符合密码复杂度要求的密码
  • 临时调整密码策略(不建议在生产环境中使用)
  • 检查密码策略配置,确保其合理

失败登录尝试次数过多导致的延迟

错误信息

ERROR 1786 (HY000): Connection was blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'

解决方案

sql
-- 刷新主机缓存
FLUSH HOSTS;

-- 或使用 mysqladmin 命令
mysqladmin -u root -p flush-hosts

-- 调整 max_connect_errors 参数
SET GLOBAL max_connect_errors = 10000;

密码哈希算法不兼容

错误信息

ERROR 2059 (HY000): Authentication plugin 'caching_sha2_password' cannot be loaded: ...

解决方案

  • 升级客户端驱动,支持 caching_sha2_password 算法
  • 临时为用户切换到 mysql_native_password 算法
  • 确保 MySQL 服务器和客户端使用兼容的密码算法

企业级密码管理方案

集成企业身份管理系统

  • LDAP/AD 集成:将 MySQL 密码管理与企业 LDAP/AD 集成
  • 单点登录:实现 MySQL 与企业 SSO 系统集成
  • 统一密码策略:确保 MySQL 密码策略与企业整体安全策略一致

自动化密码管理工具

  • Ansible:用于自动化密码变更和策略实施
  • HashiCorp Vault:用于安全存储和管理 MySQL 密码
  • AWS Secrets Manager:用于 AWS 环境中的密码管理
  • Jenkins:用于自动化密码轮换和部署

密码审计和合规

  • 定期审计:定期审计用户密码的合规性
  • 生成报告:生成密码策略合规性报告
  • 合规性检查:确保密码策略符合 GDPR、HIPAA 等合规要求
  • 日志记录:记录所有密码相关的操作

总结

密码策略是 MySQL 数据库安全的重要组成部分,合理的密码策略可以有效防止弱密码攻击,保护数据库的安全性。在生产环境中,DBA 应根据 MySQL 版本选择合适的密码策略配置:

  • MySQL 5.6

    • 重点关注密码复杂度,可通过应用层或外部工具实现
    • 定期手动轮换密码
    • 限制用户连接来源
  • MySQL 5.7

    • 启用 validate_password 插件,配置合理的密码复杂度要求
    • 启用 connection_control 插件,限制失败登录尝试
    • 配置密码过期策略
    • 定期审计密码策略合规性
  • MySQL 8.0

    • 充分利用 caching_sha2_password 算法
    • 配置密码验证组件,实现更灵活的密码复杂度要求
    • 启用密码历史记录,防止重复使用最近密码
    • 集成企业身份管理系统,实现统一的密码管理

通过合理的密码策略配置和管理,可以有效提高 MySQL 数据库的安全性,防止未授权访问和密码泄露事件。DBA 应定期审查和更新密码策略,确保其符合不断变化的安全要求。

参考资料