一、介绍
connection_control 插件,主要用来控制客户端在登录操作连续失败一定次数后的响应的延迟。那就是当客户端连接数据库连续失败到达一定次数后,服务端会进行一段时间的响应延迟,连续失败尝试的次数越多,响应延迟时间越长。
该插件可有效的防止客户端暴力登录的风险。该插件包含以下两个组件:
CONNECTION_CONTROL:用来控制登录失败的次数及延迟响应时间。
CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS:将登录失败的操作记录至 information_schema系统库中。
配置
[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
配置说明:
plugin-load-add=connection_control.so#插件预加载
connection-control=FORCE_PLUS_PERMANENT#强制打开插件
connection-control-failed-login-attempts=FORCE_PLUS_PERMANENT#强制打开插件
以下3个参数均可以利用 set global 的方式在线修改
connection_control_failed_connections_threshold=5#允许帐户进行的连续失败尝试的次数。默认为3,表示当连接失败3次后启用连接控制,
0表示不开启
connection_control_max_connection_delay=2147483647##超出阈值的连接失败的最大延迟(以毫秒为单位),默认 2147483647 毫秒,约25天
connection_control_min_connection_delay=1500#超过阈值的连接失败的最小延迟(以毫秒为单位),默认 1000 毫秒,即 1 秒
show plugins;
show variables like "connection_control%";
查看失败记录
SELECT * FROM information_schema.CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS;
正常情况下,输错密码是即刻返回错误的,当连续失败次数达到阈值后,再次进行连接尝试,则会延迟响应,具体表现就是一直卡着,到延迟结束后才返回错误。information_schema 系统库中的表会记录登录失败的用户名及失败次数,当延迟发生时,从 processlist 中也可以查到正在延迟的
连接。若输入密码正确,则会取消延迟、重新计数。
尝试3次错误输入密码后,在第4次登录时会delay 1秒(由connection_control_min_connection_delay指定),同时Connection_control_delay_generated计数+1(若登录密码继续输入错误,则delay秒数与计数器继续增加。直到成功登录为止之后,此时
delay清零,但计数器不清零。需要注意的是,即使后续密码正确,依然要先延迟一定的秒数,才会进入账号校验流程)
这里注意的是delay的值并不是说每次都是1500毫秒,而是以(当前失败总次数-失败阈值)*1500,所以假如当前设定为上,当我失败登陆第6次时,我的等待时间不是1.5秒而是3秒,还有就是想不让尝试登陆超过一次,可以把阈值改为0。
二、问题解决
1、问题描述
使用命令连接mysql发现非常卡,要十几秒才能连上
连上使用show processlist;查看
发现状态为Waiting in connection_control plugin
2、原因
链接异常(用户名密码错误)导致connectioncontrol 插件进行拦截,拦截用户身份验证处于 “waiting in connection_control plugin”的链接延迟状态
3、解决
1、使用kill杀掉连接的id,应用会一直连接,这种方法不行
select ID from information_schema.PROCESSLIST where Command='Connect' and STATE='Waiting in connection_control plugin';
2、排查应用连接的账号密码,更改正确,然后重启数据库,重启应用
重启服务,重启服务后会刷新CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS表下账号的对应失败登录错误次数
3、修改上述的表内容,前提是你有其他对应权限的账号登录进行
4、将插件取消使用,不建议