前言
因等保安全的要求,需要对MySQL用户密码和登录策略进行安全加固,以满足以下需求:
- 密码至少8位,包含大小写字母、数字和特殊字符。
- 当密码登录失败一定次数后锁定账户。
- 密码90天过期
本文使用的MySQL版本为8.0.33,不同版本可能会有区别。
安装插件
-- 密码复杂度插件 install plugin validate_password soname 'validate_password.so'; -- 登录失败锁定插件 install plugin connection_control soname 'connection_control.so'; -- 查看插件 show plugins;
配置密码复杂度
- 查看相关参数
SHOW GLOBAL VARIABLES LIKE '%validate_password%';
参数 | 说明 |
validate_password_check_user_name | 设置为ON时表示能将密码设置为用户名 |
validate_password_dictionary_file | 检查密码时的字典文件路径 |
validate_password_length | 密码最小长度,默认为8 |
validate_password_mixed_case_count | 大写和小写字母最少数量,默认为1 |
validate_password_number_count | 密码中数字最少数量,默认为1 |
validate_password_policy | 密码强度,默认为MEDIUM,可选LOW、STRONG。STRONG比MEDIUM多配置一个密码字典;LOW只有长度限制 |
validate_password_special_char_count | 特殊字符数量,默认为1 |
- 修改密码长度参数,至少12位
SET GLOBAL validate_password_length=12;
- 测试,创建用户
-- 用弱密码测试,应该会提示 ERROR 1819 (HY000): Your password does not satisfy the current policy requirements create user 'user10'@'%' identified by '123456'; -- 用11位密码测试,也应该会失败 create user 'user10'@'%' identified by 'kQ8!rG2*qA0'; -- 用12位密码测试,成功 create user 'user10'@'%' identified by 'kQ8!rG2*qA01'; -- 如果用户测试完不使用,最好删除 drop user 'user10'@'%';
- 卸载插件。如果插件不想用,则可以选择卸载
uninstall plugin validate_password;
配置登录失败锁定
- 查看相关参数
SHOW GLOBAL VARIABLES LIKE '%connection_control%';
参数 | 说明 |
connection_control_failed_connections_threshold | 登录失败次数,默认为3 |
connection_control_max_connection_delay | 最大延迟登录时间,单位毫秒。当一个新的连接到达MySQL时,如果当前连接数已经超过了最大连接数,且新连接请求延迟时间超过该参数的值,MySQL将拒绝该连接请求。 |
connection_control_min_connection_delay | 最小延迟登录时间,单位毫秒。当一个新的连接到达MySQL时,如果当前连接数已经超过了最大连接数,且新连接请求延迟时间小于该参数的值,MySQL将延迟该连接请求。 |
- 修改connection_control_min_connection_delay参数的值为300000毫秒,即300秒、5分钟
set global connection_control_min_connection_delay=300000;
- 测试。使用错误的密码登录测试,错误登录三次后再登录会等待5分钟才能连接。
配置密码过期策略
相关参数为default_password_lifetime
,默认值为0。
set global default_password_lifetime=90;
修改该参数只会对新用户有效,对于已经创建的用户需要手动设置密码过期
-- 立即过期 alter user 'user10'@'%' PASSWORD EXPIRE; -- 90天后过期 alter user 'user10'@'%' PASSWORD EXPIRE INTERVAL 90 DAY; -- 永不过期 alter user 'user10'@'%' PASSWORD EXPIRE NEVER;
固化配置
以上配置命令在MySQL重启后就会失效,因此需要将配置写到配置文件中。
[mysqld] default_password_lifetime = 90 plugin-load-add=validate_password.so validate_password=FORCE validate_password_length=12 validate_password_check_user_name=OFF validate_password_mixed_case_count=1 validate_password_number_count=1 validate_password_policy=MEDIUM validate_password_special_char_count = 1 plugin-load-add=connection_control.so connection_control=FORCE connection_control_min_connection_delay=300000 connection_control_failed_connections_threshold=3