Skip to content

MariaDB 密码策略

密码策略概述

密码策略是 MariaDB 安全管理的重要组成部分,通过配置和管理密码策略,可以确保用户使用强密码,定期更换密码,避免密码重用,从而提高数据库的安全性。MariaDB 提供了多种密码策略相关的功能,包括密码复杂度验证、密码过期、密码历史记录等。

密码复杂度验证

密码复杂度验证用于确保用户使用强密码,避免使用弱密码。MariaDB 通过 validate_password 插件实现密码复杂度验证。

安装和启用 validate_password 插件

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

-- 检查插件是否安装成功
SHOW PLUGINS LIKE 'validate_password';

-- 查看插件状态
SHOW VARIABLES LIKE 'validate_password%';

配置密码复杂度要求

validate_password 插件提供了以下配置参数:

参数名称描述默认值
validate_password_policy密码复杂度策略(0=LOW, 1=MEDIUM, 2=STRONG)MEDIUM
validate_password_length密码最小长度8
validate_password_number_count密码中至少包含的数字个数1
validate_password_special_char_count密码中至少包含的特殊字符个数1
validate_password_mixed_case_count密码中至少包含的大小写字母个数1
validate_password_dictionary_file密码字典文件路径
validate_password_check_user_name是否检查密码是否包含用户名OFF

配置示例

sql
-- 设置密码复杂度策略为 STRONG
SET GLOBAL validate_password_policy = 'STRONG';

-- 设置密码最小长度为 12
SET GLOBAL validate_password_length = 12;

-- 设置密码中至少包含 2 个数字
SET GLOBAL validate_password_number_count = 2;

-- 设置密码中至少包含 1 个特殊字符
SET GLOBAL validate_password_special_char_count = 1;

-- 设置密码中至少包含 2 个大小写字母
SET GLOBAL validate_password_mixed_case_count = 2;

-- 启用检查密码是否包含用户名
SET GLOBAL validate_password_check_user_name = ON;

密码复杂度策略详解

LOW 策略

  • 密码长度至少为 validate_password_length
  • 不检查其他复杂度要求

MEDIUM 策略

  • 密码长度至少为 validate_password_length
  • 至少包含 validate_password_number_count 个数字
  • 至少包含 validate_password_special_char_count 个特殊字符
  • 至少包含 validate_password_mixed_case_count 个大小写字母

STRONG 策略

  • 满足 MEDIUM 策略的所有要求
  • 密码不能是常见的弱密码(如 "password", "123456" 等)
  • 如果设置了 validate_password_dictionary_file,密码不能出现在字典文件中

测试密码复杂度

sql
-- 测试弱密码(应该失败)
CREATE USER 'test_user'@'%' IDENTIFIED BY 'password123';

-- 测试强密码(应该成功)
CREATE USER 'test_user'@'%' IDENTIFIED BY 'MyP@ssw0rd2023!';

密码过期策略

密码过期策略用于确保用户定期更换密码,避免密码长期不变导致的安全风险。

全局密码过期策略

可以通过 default_password_lifetime 参数设置全局密码过期策略:

sql
-- 设置全局密码过期策略为 90 天
SET GLOBAL default_password_lifetime = 90;

-- 禁用全局密码过期
SET GLOBAL default_password_lifetime = 0;

单个用户的密码过期策略

可以为单个用户设置不同的密码过期策略:

sql
-- 创建用户并设置密码过期时间为 30 天
CREATE USER 'temp_user'@'%' IDENTIFIED BY 'password123' PASSWORD EXPIRE INTERVAL 30 DAY;

-- 修改现有用户的密码过期时间为 60 天
ALTER USER 'user'@'%' PASSWORD EXPIRE INTERVAL 60 DAY;

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

-- 立即过期密码,强制用户下次登录时修改
ALTER USER 'user'@'%' PASSWORD EXPIRE;

查看用户密码过期状态

sql
-- 查看用户密码过期信息
SELECT 
  User, 
  Host, 
  password_expired, 
  password_last_changed, 
  password_lifetime 
FROM mysql.user;

密码历史记录

密码历史记录用于防止用户重用最近使用过的密码,提高密码安全性。MariaDB 通过 password_reuse_check 插件实现密码历史记录功能。

安装和启用 password_reuse_check 插件

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

-- 检查插件是否安装成功
SHOW PLUGINS LIKE 'password_reuse_check';

-- 查看插件状态
SHOW VARIABLES LIKE 'password_history';

配置密码历史记录

sql
-- 设置密码历史记录为 5,禁止重用最近 5 个密码
SET GLOBAL password_history = 5;

-- 设置密码历史记录为 10,禁止重用最近 10 个密码
SET GLOBAL password_history = 10;

测试密码历史记录

sql
-- 创建用户
CREATE USER 'test_user'@'%' IDENTIFIED BY 'Password1!';

-- 修改密码(第一次修改)
ALTER USER 'test_user'@'%' IDENTIFIED BY 'Password2!';

-- 修改密码(第二次修改)
ALTER USER 'test_user'@'%' IDENTIFIED BY 'Password3!';

-- 尝试重用第一个密码(应该失败)
ALTER USER 'test_user'@'%' IDENTIFIED BY 'Password1!';

密码更换流程

用户自行更换密码

sql
-- 连接到数据库
mysql -u user -p

-- 更换密码
SET PASSWORD = PASSWORD('new_password');

管理员强制用户更换密码

sql
-- 立即过期用户密码
ALTER USER 'user'@'%' PASSWORD EXPIRE;

-- 用户下次登录时需要更换密码
-- mysql -u user -p
-- Enter password: ********
-- ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
-- SET PASSWORD = PASSWORD('new_password');

密码策略的最佳实践

1. 使用强密码复杂度要求

  • 设置 validate_password_policySTRONG
  • 密码最小长度至少为 12 个字符
  • 要求密码包含大小写字母、数字和特殊字符
  • 启用检查密码是否包含用户名

2. 合理设置密码过期时间

  • 根据业务需求和合规要求设置密码过期时间
  • 一般建议 30-90 天更换一次密码
  • 对于敏感用户(如管理员),建议更频繁地更换密码
  • 避免设置过短的密码过期时间,导致用户频繁更换密码,降低密码质量

3. 配置密码历史记录

  • 设置密码历史记录为 5-10 个
  • 禁止用户重用最近使用过的密码
  • 定期清理旧的密码历史记录

4. 结合其他安全措施

  • 启用双因素认证(如果支持)
  • 限制用户登录尝试次数,防止暴力破解
  • 监控异常登录尝试
  • 加密存储密码(MariaDB 默认使用密码哈希存储)

5. 定期审计密码策略

  • 定期检查用户密码策略的配置
  • 审查用户密码强度和过期情况
  • 测试密码策略的有效性
  • 根据安全威胁和合规要求调整密码策略

6. 培训用户使用强密码

  • 提供密码创建指南
  • 建议使用密码管理器生成和管理强密码
  • 避免使用常见的弱密码
  • 避免在多个系统中使用相同的密码

常见问题及解决方案

问题 1:用户无法创建符合复杂度要求的密码

现象:用户尝试创建密码时,提示密码不符合复杂度要求 原因

  • 密码复杂度要求设置过高
  • 用户不了解密码复杂度要求

解决方案

  • 适当调整密码复杂度要求,平衡安全性和易用性
  • 向用户提供密码复杂度要求的明确说明
  • 建议用户使用密码管理器生成强密码

问题 2:用户忘记密码,无法登录

现象:用户忘记密码,无法登录数据库 解决方案

  • 管理员重置用户密码:
    sql
    ALTER USER 'user'@'%' IDENTIFIED BY 'new_password';
  • 强制用户下次登录时修改密码:
    sql
    ALTER USER 'user'@'%' PASSWORD EXPIRE;

问题 3:密码过期后,用户无法登录

现象:用户密码过期后,无法登录数据库 原因

  • 用户不知道密码已经过期
  • 用户不知道如何修改过期密码

解决方案

  • 向用户发送密码即将过期的通知
  • 提供修改过期密码的指南
  • 管理员可以重置用户密码并强制其下次登录时修改

问题 4:password_reuse_check 插件无法正常工作

现象:用户可以重用最近使用过的密码 原因

  • 插件未正确安装或启用
  • 密码历史记录配置不正确

解决方案

  • 检查插件是否正确安装和启用:
    sql
    SHOW PLUGINS LIKE 'password_reuse_check';
  • 检查密码历史记录配置:
    sql
    SHOW VARIABLES LIKE 'password_history';
  • 确保 password_history 参数设置为大于 0 的值

常见问题 (FAQ)

Q1:如何查看密码策略的配置?

A:使用以下命令查看密码策略配置:

sql
-- 查看密码复杂度配置
SHOW VARIABLES LIKE 'validate_password%';

-- 查看密码历史记录配置
SHOW VARIABLES LIKE 'password_history';

-- 查看全局密码过期配置
SHOW VARIABLES LIKE 'default_password_lifetime';

Q2:如何禁用密码复杂度验证?

A:可以通过以下方式禁用密码复杂度验证:

sql
-- 卸载 validate_password 插件
UNINSTALL PLUGIN validate_password;

-- 或禁用插件
SET GLOBAL validate_password_policy = 0;

Q3:如何为不同用户设置不同的密码策略?

A:可以为不同用户设置不同的密码过期策略,但密码复杂度要求和密码历史记录是全局的,无法为单个用户单独设置。

Q4:密码过期后,用户如何修改密码?

A:用户可以使用以下命令修改过期密码:

sql
SET PASSWORD = PASSWORD('new_password');

Q5:如何防止用户使用弱密码?

A:启用 validate_password 插件,并将密码复杂度策略设置为 STRONG,同时配置合理的密码长度和复杂度要求。

Q6:如何查看用户密码的最后修改时间?

A:使用以下命令查看用户密码的最后修改时间:

sql
SELECT User, Host, password_last_changed FROM mysql.user;

Q7:如何设置密码过期通知?

A:MariaDB 本身不提供密码过期通知功能,但可以通过脚本定期检查用户密码的过期时间,并发送通知邮件给用户。

Q8:如何处理大量用户密码过期的情况?

A:可以使用脚本批量处理大量用户密码过期的情况,例如:

sql
-- 批量重置用户密码
UPDATE mysql.user SET authentication_string = PASSWORD('default_password'), password_expired = 'Y' WHERE User LIKE 'prefix%';
FLUSH PRIVILEGES;

总结

密码策略是 MariaDB 安全管理的重要组成部分,通过配置和管理密码策略,可以确保用户使用强密码,定期更换密码,避免密码重用,从而提高数据库的安全性。建议根据业务需求和合规要求,合理配置密码复杂度要求、密码过期策略和密码历史记录,同时结合其他安全措施,如双因素认证、登录尝试限制等,全面提升数据库的安全性。