
作为MySQL数据库管理员,您是否曾在数据库服务器上遭遇过暴力攻击,或者在3306端口上成为类似DDOS的连接流的目标?如果是这样的话,你会很快理解为什么这个与MySQL一起分发的插件在这种情况下会非常有用
事实上,连接控制插件允许MySQL服务器的管理员在进行连接尝试和达到连续数目的连接失败时,在响应时间上引入增加的延迟。
这种方法减缓了针对MySQL的最终攻击,就像对MySQL用户帐户的暴力攻击一样。
让我们测试一下这个插件,看看它是如何工作的。
插件库是connection_control.so,它安装在插件目录中。在Oracle Linux/RedHat Enterprise/CentOS/Fedora上,如果MySQL Server是通过RPM安装的,则默认路径为:/usr/lib64/MySQL/plugin/connection_control.so。如果是二制包安装,则路径为:/usr/local/mysql/lib/plugin/ connection_control.so
安装
可以在my.cnf中安装插件,请参阅手册,但我们将了解如何交互使用它:
mysql> INSTALL PLUGIN CONNECTION_CONTROL SONAME 'connection_control.so';
Query OK, 0 rows affected (0.03 sec)
mysql> INSTALL PLUGIN CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS SONAME 'connection_control.so';
Query OK, 0 rows affected (0.02 sec)
安装后,可以从Information_Schema中列出插件:
mysql> SELECT PLUGIN_NAME,PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'connection%';
+------------------------------------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+------------------------------------------+---------------+
| CONNECTION_CONTROL | ACTIVE |
| CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS | ACTIVE |
+------------------------------------------+---------------+
2 rows in set (0.01 sec)
现在,让我们配置插件。我们将尝试将连续失败连接的阈值设置为4,并至少增加1.5秒:
mysql> SET GLOBAL connection_control_failed_connections_threshold=4;
Query OK, 0 rows affected (0.01 sec)
mysql> SET GLOBAL connection_control_min_connection_delay=1500;
Query OK, 0 rows affected (0.00 sec)
如果有失败的登录尝试,我们可以使用connection_control_failed_login_tempts表在Information_Schema中列出它们,目前它仍然是空的:
mysql> select * from information_schema.connection_control_failed_login_attempts;
Empty set (0.00 sec)
测试环节:
让我们通过尝试使用MySQL Shell和无效密码连接到MySQL Server来测试我们的设置。我们将连续尝试10次,并且只显示命令花费的实时时间(连接尝试):
[root@node250 mysqlshell]#TIMEFORMAT=%R
[root@node250 mysqlshell]# for i in `seq 1 10`; do time mysql -uroot -p'1233' -hlocalhost | grep real; done
0.052
0.037
0.038
1.040
2.061
3.055
4.059
很明显,在第4次尝试后,响应时间不断增加。
我们可以验证状态变量Connection_control_delay_generated,该变量包含服务器对失败连接尝试的响应添加延迟的次数:
mysql> show global status like 'connection_control_%';
+------------------------------------+-------+
| Variable_name | Value |
+------------------------------------+-------+
| Connection_control_delay_generated | 7 |
+------------------------------------+-------+
1 row in set (0.00 sec)
这一次connection_control_failed_login_tempts表不为空:
mysql> select * from information_schema.connection_control_failed_login_attempts;
+--------------------+-----------------+
| USERHOST | FAILED_ATTEMPTS |
+--------------------+-----------------+
| 'root'@'localhost' | 7 |
+--------------------+-----------------+
1 row in set (0.00 sec)
要重置这些计数器,只需再次为变量connection_control_failed_connections_threshold赋值:
mysql> SET GLOBAL connection_control_failed_connections_threshold = 4;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from information_schema.connection_control_failed_login_attempts;
Empty set (0.00 sec)
以上内容为翻译oracle官方博客文章:https://blogs.oracle.com/mysql/post/mysql-connection-controlba




