前言

因等保安全的要求,需要对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;

配置密码复杂度

  1. 查看相关参数
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
  1. 修改密码长度参数,至少12位
SET GLOBAL validate_password_length=12;
  1. 测试,创建用户
-- 用弱密码测试,应该会提示 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;

配置登录失败锁定

  1. 查看相关参数
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将延迟该连接请求。
  1. 修改connection_control_min_connection_delay参数的值为300000毫秒,即300秒、5分钟
set global connection_control_min_connection_delay=300000;
  1. 测试。使用错误的密码登录测试,错误登录三次后再登录会等待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

参考