-密码复杂度和登录失败处理
1,背景
应等保三级安全要求,现需要对生产环境MySQL数据库进行插件安装,以满足密码复杂度和登录失败处理的安全要求
(1)设置口令位数至少为8位,至少一位大小写字母,一位数字,一位特殊字符
(2)设置当密码错误超过一定次数后(建议3次或5次),自动锁定账户(建议30分钟以上)
2,密码复杂度插件
(1)安装插件
mysql> install plugin validate_password soname 'validate_password.so';
Query OK, 0 rows affected (1.00 sec)
更改my.cnf文件
[mysqld]
plugin-load-add=validate_password.so
#服务器在启动时加载插件,并防止在服务器运行时删除插件。
validate-password=FORCE_PLUS_PERMANENT
(2)卸载插件
mysql> uninstall plugin validate_password;
Query OK, 0 rows affected (0.09 sec)
(3)查看插件安装状态
mysql> show plugins;
(4)变量参数查看
mysql> show global variables like '%validate_password%';
参数定义:
validate_password_check_user_name :设置为ON的时候表示能将密码设置成当前用户名。
validate_password_dictionary_file :validate_password用于检查密码的字典文件的路径名。
validate_password_length :validate_password所需密码的最小字符数。
validate_password_mixed_case_count :如果密码策略是中等或更强的,validate_password要求密码具有的小写和大写字符的最小数量。对于给定的这个值密码必须有那么多小写字符和那么多大写字符。
validate_password_number_count :如果密码策略是中等或更强的,validate_password要求密码具有的数字(数字)字符的最小数量。
validate_password_policy : validate_password强制执行的密码策略,validate_password_policy影响validate_password如何使用它的其他策略设置系统变量,除了根据用户名检查密码之外,后者由validate_password_check_user_name独立控制。
validate_password_policy值可以使用数值0、1、2或相应的符号值LOW、MEDIUM、STRONG来指定。下表描述了为每个策略执行的测试。对于长度测试,所需的长度是validate_password_length系统变量的值。类似地,其他测试所需的值由其他validate_password_xxx变量提供。
(5)结果验证
mysql> create user cow identified by '12345678';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
mysql> create user cow identified by 'A12345678';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
mysql> create user cow identified by 'Aa1234567';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
mysql> create user cow identified by 'Aa#12345678';
Query OK, 0 rows affected (0.17 sec)
3,登录失败处理插件
(1)安装插件
mysql> INSTALL PLUGIN CONNECTION_CONTROL SONAME 'connection_control.so';
Query OK, 0 rows affected (0.09 sec)
mysql> INSTALL PLUGIN CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS SONAME 'connection_control.so';
Query OK, 0 rows affected (0.01 sec)
配置文件my.cnf
[mysqld]
plugin-load-add=connection_control.so
connection-control=FORCE_PLUS_PERMANENT
connection-control-failed-login-attempts=FORCE_PLUS_PERMANENT
connection_control_failed_connections_threshold=5
connection_control_max_connection_delay=2147483647
connection_control_min_connection_delay=1500
(2)验证
mysql> show plugins;
或者
select PLUGIN_NAME, PLUGIN_STATUS from INFORMATION_SCHEMA.PLUGINS where PLUGIN_NAME like 'connection%';
(3)变量参数查看
show variables like "connection_control%";
参数含义:
connection_control_failed_connections_threshold:单个用户登录失败(由于密码错误引起)次数上限,默认3次
connection_control_max_connection_delay:失败上限之后再次尝试登录前最小等待时间,单位ms
connection_control_min_connection_delay:失败上限之后再次尝试登录前最小等待时间,默认1秒(1000ms)
上述3个参数均可以利用 set global 的方式在线修改。
(4)结果验证
[root@localhost ~]# mysql -uroot -p123
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
mysql> show global status like "%conn%control%";
+------------------------------------+-------+
| Variable_name | Value |
+------------------------------------+-------+
| Connection_control_delay_generated | 2 |
+------------------------------------+-------+
1 row in set (0.02 sec)
Connection_control_delay_generated :尝试3次错误输入密码后,在第4次登录时会delay 1秒(由connection_control_min_connection_delay指定),同时Connection_control_delay_generated计数+1(若登录密码继续输入错误,则delay秒数与计数器继续增加。直到成功登录为止之后,此时delay清零,但计数器不清零。需要注意的是,即使后续密码正确,依然要先延迟一定的秒数,才会进入账号校验流程)
mysql> select * from information_schema.CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS;
+--------------------+-----------------+
| USERHOST | FAILED_ATTEMPTS |
+--------------------+-----------------+
| 'root'@'localhost' | 4 |
+--------------------+-----------------+
4,生产问题处理
生产环境mysql最大连接数用满,本地也无法登录,这里采用gdb修改最大连接数gdb -p 2075 -ex "set max_connections=1500" -batch
通过show processlist ,发现大量状态为“Waiting in connection_control plugin”的等待连接。
由于问题连接过多,逐个kill掉显然不太现实。
故障模拟脚本:
[root@localhost scripts]# cat tt.sh
#!/bin/bash
for i in {1..254};do
ip="172.20.202.$i"
#ping -c 2 $ip &> /dev/null && echo $ip is up &
mysql -uroot -p123 -hlocalhost -e "select now()" &
sleep 1
done
wait
使用pt-kill工具
pt-kill --user=root --password=123456 -hlocalhost --no-version-check --match-command Connect --match-state "Waiting in connection_control plugin" --victims all --interval 2 --print --kill
批量拼接 kill 语句
select concat('KILL ',id,';') from information_schema.processlist where Command='Connect' and STATE='Waiting in connection_control plugin';
原文链接:https://blog.csdn.net/weihaodong0557/article/details/113805838