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