
作者:唐龙哲,爱可生交付服务团队DBA,负责 MySQL 数据库故障处理及日常维护,擅长故障诊断。
爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。
本文约 1500 字,预计阅读需要 4 分钟。
MySQL 从 5.7.17 版本开始,提供连接控制插件 Connection Control Plugins[1]。该插件可以在用户连续尝试失败后,增加服务器响应延迟,有效防止暴力破解攻击。
Connection Control Plugins
若使用不当,可能会导致以下问题:
客户环境数据库在启用连接控制插件的情况下,监控系统使用了 igcam 不存在的用户进行数据库访问,该行为会导致 Connect 状态的连接大量积压,很快达到 max_connections 上限,最终引起 too many connections 报错。
当 Connection Control Plugins 启用时,插件会记录失败的连接尝试次数。在达到 connection_control_failed_connections_threshold(默认为 3)后,插件会延迟创建新的连接。即使用户被删除,插件仍会记录失败尝试并延迟响应,进一步占用连接资源。
需要安装的插件分为 2 个部分:
执行下列命令安装连接控制插件:
INSTALL PLUGIN CONNECTION_CONTROL SONAME 'connection_control.so';
INSTALL PLUGIN CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS SONAME 'connection_control.so';
通过 INFORMATION_SCHEMA.PLUGINS 检查插件是否安装成功,PLUGIN_STATUS 为 ACTIVE 表示插件安装成功。
SELECT PLUGIN_NAME, PLUGIN_STATUS from INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'connection%';
插件的关键参数包括:
示例配置:
SET GLOBAL connection_control_failed_connections_threshold = ;
SET GLOBAL connection_control_min_connection_delay = ;
-- 设置为 1 小时
SET GLOBAL connection_control_max_connection_delay = ;
创建测试用户 monitor 并删除。
-- 1.新建测试用户
CREATEUSER monitor@'127.0.0.1'IDENTIFIEDBY'monitor';
GRANT PROCESS,REPLICATIONCLIENT,SELECTON *.* TO'monitor'@'127.0.0.1';
-- 2.使用测试用户连接数据库,确认可以正常访问
SELECTcurrent_user();
-- 3.删除用户
DROPUSER monitor@'127.0.0.1';
调整 max_connections 为 5,以模拟连接数满的场景。
SET GLOBAL max_connections=;
并发连接测试。使用多个客户端同时尝试以 monitor 用户连接数据库,观察连接延迟现象。
while true
do
time mysql -umonitor -p'monitor' -h127.0.0.1 -P3306 2>/dev/null
done
验证测试结果。在使用正常账号访问数据库时,返回结果显示已达到最大连接数限制。
从 show processlist 结果中可以看到 monitor 无效用户占用着连接,且 monitor 用户身份验证处于 waiting in connection_control plugin 的连接延迟状态。
通过以上测试发现,使用错误的账号访问数据库时,前三次连接失败后立即断开,第四次及后续连接开始出现延迟,且每次登录失败延迟会增加 1 秒钟时间。
以下信息如果为非零值,表示有某个客户端触发了延迟控制:
connection_control_delay_generated 状态变量信息,该变量记录了连接失败尝试增加响应延迟的次数。information_schema.connection_control_failed_login_attempts,该表提供了每个帐号当前连续失败的连接尝试次数的信息。delay_time = min_delay * (current_count + 1 - threshold)
其中:
当前失败次数 current_count 超过阈值 threshold,或计数器异常(current_count < 0),则触发延迟,且延迟时间随失败次数增加而递增。
在成功连接数据库后,计数器会重置为 0。此前因失败触发的延迟机制将不再影响此客户端,但失败连接尝试的延迟机制仍然生效,直到其再次达到阈值。
开启连接控制插件后,失败连接尝试会触发延迟机制,可能导致以下问题:
max_connections 上限。connection_control_max_connection_delay 设置为较小值(如 1 小时),避免无效连接长期占用资源。CREATE USER 'monitor'@'127.0.0.1' WITH MAX_USER_CONNECTIONS ;
SET GLOBAL connection_control_failed_connections_threshold=;
参考资料
[1]
Connection Control Plugins: https://dev.mysql.com/doc/refman/8.0/en/connection-control-installation.html
本文关键字:#MySQL #连接控制插件