mysql 安全插件

-密码复杂度和登录失败处理

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值