本节介绍如何安装连接控制插件,CONNECTION_CONTROL
以及
CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS
. 有关安装插件的一般信息,请参阅
第 5.6.1 节,“安装和卸载插件”。
为了被服务器使用,插件库文件必须位于MySQL插件目录(由plugin_dir
系统变量命名的目录)中。plugin_dir
如有必要,通过在服务器启动时
设置值来配置插件目录位置
。
插件库文件的基本名称是
connection_control
. 文件名后缀因平台而异(例如,.so
对于 Unix 和类 Unix 系统,.dll
对于 Windows)。
要在服务器启动时加载插件,请使用
--plugin-load-add
选项命名包含它们的库文件。使用这种插件加载方法,每次服务器启动时都必须给出该选项。例如,将这些行放在服务器
my.cnf
文件中,
.so
根据需要调整平台的后缀:
[mysqld]
plugin-load-add=connection_control.so
修改my.cnf
后重启服务器使新设置生效。
或者,要在运行时加载插件,请使用这些语句,.so
根据需要调整平台的后缀:
INSTALL PLUGIN CONNECTION_CONTROL
SONAME 'connection_control.so';
INSTALL PLUGIN CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS
SONAME 'connection_control.so';
INSTALL PLUGIN
立即加载插件,并将其注册在
mysql.plugins
系统表中,使服务器在后续每次正常启动时加载它,而无需--plugin-load-add
.
要验证插件安装,请检查
INFORMATION_SCHEMA.PLUGINS
表格或使用SHOW PLUGINS
语句(请参阅第 5.6.2 节,“获取服务器插件信息”)。例如:
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 |
+------------------------------------------+---------------+
如果插件无法初始化,请检查服务器错误日志以获取诊断消息。
如果插件之前已经注册过
INSTALL PLUGIN
或者加载过
--plugin-load-add
,可以在服务器启动时使用--connection-control
和
--connection-control-failed-login-attempts
选项来控制插件的激活。例如,要在启动时加载插件并防止它们在运行时被删除,请使用以下选项:
[mysqld]
plugin-load-add=connection_control.so
connection-control=FORCE_PLUS_PERMANENT
connection-control-failed-login-attempts=FORCE_PLUS_PERMANENT
如果希望防止服务器在没有给定连接控制插件的情况下运行,请使用选项值
FORCE
或
FORCE_PLUS_PERMANENT
强制服务器启动失败,如果插件未成功初始化。
可以只安装一个插件而不安装另一个插件,但必须安装两个插件才能获得完整的连接控制功能。特别是,仅安装
CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS
插件用处不大,因为如果没有
CONNECTION_CONTROL
插件来提供填充
CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS
表的数据,表总是空的。
为了配置其操作,
CONNECTION_CONTROL
插件公开了这些系统变量:
connection_control_failed_connections_threshold
:在服务器为后续连接尝试添加延迟之前允许帐户连续失败的连接尝试次数。要禁用失败连接计数,请设置connection_control_failed_connections_threshold
为零。connection_control_min_connection_delay
:超过阈值的连接失败的最小延迟(以毫秒为单位)。connection_control_max_connection_delay
:超过阈值的连接失败的最大延迟(以毫秒为单位)。
如果
connection_control_failed_connections_threshold
为非零,则启用失败连接计数并具有以下属性:
connection_control_failed_connections_threshold
通过连续失败的连接尝试 ,延迟为零 。此后,服务器会为后续的连续尝试增加增加的延迟,直到成功连接为止。初始未调整的延迟从 1000 毫秒(1 秒)开始,每次尝试增加 1000 毫秒。也就是说,一旦为帐户激活延迟,后续失败尝试的未调整延迟为 1000 毫秒、2000 毫秒、3000 毫秒等。
客户端经历的实际延迟是未经调整的延迟,调整后位于 系统变量
connection_control_min_connection_delay
和connection_control_max_connection_delay
系统变量的值范围内,包括在内。一旦为帐户激活了延迟,该帐户此后的第一次成功连接也会经历延迟,但后续连接的失败计数会重置。
例如,默认
connection_control_failed_connections_threshold
值为 3,则帐户的前三个连续失败连接尝试没有延迟。第四次和后续失败连接帐户经历的实际调整延迟取决于
connection_control_min_connection_delay
和
connection_control_max_connection_delay
值:
如果
connection_control_min_connection_delay
和connection_control_max_connection_delay
分别为 1000 和 20000,则调整后的延迟与未调整的延迟相同,最大为 20000 毫秒。第四个和后续失败的连接会延迟 1000 毫秒、2000 毫秒、3000 毫秒,依此类推。如果
connection_control_min_connection_delay
和connection_control_max_connection_delay
分别为 1500 和 20000,则第四次及后续失败连接的调整后延迟为 1500 毫秒、2000 毫秒、3000 毫秒等,最大为 20000 毫秒。如果
connection_control_min_connection_delay
和connection_control_max_connection_delay
分别为 2000 和 3000,则第四次及后续失败连接调整后的延迟分别为 2000 毫秒、2000 毫秒和 3000 毫秒,所有后续失败连接也延迟 3000 毫秒。
您可以CONNECTION_CONTROL
在服务器启动或运行时设置系统变量。假设您希望在服务器开始延迟其响应之前允许连续四次失败的连接尝试,最小延迟为 2000 毫秒。要在服务器启动时设置相关变量,请将这些行放在服务器
my.cnf
文件中:
[mysqld]
plugin-load-add=connection_control.so
connection_control_failed_connections_threshold=4
connection_control_min_connection_delay=2000
要在运行时设置和保留变量,请使用以下语句:
SET PERSIST connection_control_failed_connections_threshold = 4;
SET PERSIST connection_control_min_connection_delay = 2000;
SET
PERSIST
为正在运行的 MySQL 实例设置一个值。它还会保存该值,使其在随后的服务器重新启动时继续使用。要更改正在运行的 MySQL 实例的值而不使其延续到后续重新启动,请使用GLOBAL
关键字而不是PERSIST
. 请参阅
第 13.7.6.1 节,“变量赋值的 SET 语法”。
connection_control_min_connection_delay
和
系统变量
的
connection_control_max_connection_delay
最小值和最大值分别为 1000 和 2147483647。此外,每个变量的允许取值范围还取决于另一个变量的当前值:
因此,要进行某些配置所需的更改,您可能需要按特定顺序设置变量。假设当前的最小延迟和最大延迟分别为 1000 和 2000,而你想将它们设置为 3000 和 5000。你不能先设置
connection_control_min_connection_delay
为 3000,因为它大于当前
connection_control_max_connection_delay
值 2000。而是设置
connection_control_max_connection_delay
为 5000,然后设置
connection_control_min_connection_delay
到 3000。
安装CONNECTION_CONTROL
插件后,它会检查连接尝试并跟踪它们是失败还是成功。为此,失败的连接尝试是指客户端用户和主机与已知 MySQL 帐户匹配但提供的凭据不正确或与任何已知帐户不匹配的连接尝试。
失败连接计数基于每次连接尝试的用户/主机组合。适用的用户名和主机名的确定考虑了代理并发生如下:
如果客户端用户代理其他用户,则连接失败计数的帐户是代理用户,而不是被代理用户。例如,如果
external_user@example.com
代理proxy_user@example.com
,连接计数使用代理用户external_user@example.com
,而不是代理用户proxy_user@example.com
。external_user@example.com
和 都proxy_user@example.com
必须在系统表中具有有效条目,并且必须在mysql.user
系统表中定义它们之间的代理关系mysql.proxies_priv
(请参阅第 6.2.19 节,“代理用户”)。如果客户端用户没有代理另一个用户,但确实匹配了一个
mysql.user
条目,则计数使用CURRENT_USER()
与该条目对应的值。例如,如果user1
从主机连接 的用户与条目host1.example.com
匹配user1@host1.example.com
,则计数使用user1@host1.example.com
. 如果用户改为匹配user1@%.example.com
、user1@%.com
或user1@%
条目,则计数分别使用user1@%.example.com
、user1@%.com
或user1@%
。
对于刚才描述的情况,连接尝试匹配某个mysql.user
条目,请求成功或失败取决于客户端是否提供了正确的身份验证凭据。例如,如果客户端提供的密码不正确,连接尝试就会失败。
如果连接尝试不匹配任何
mysql.user
条目,则尝试失败。在这种情况下,没有CURRENT_USER()
可用的值,连接失败计数使用客户端提供的用户名和服务器确定的客户端主机。例如,如果客户端尝试以用户身份user2
从主机
连接host2.example.com
,则用户名部分在客户端请求中可用,并且服务器确定主机信息。用于计数的用户/主机组合是user2@host2.example.com
。
服务器维护有关哪些客户端主机可能连接到服务器的信息(本质上是mysql.user
条目的主机值的联合)。如果客户端尝试从任何其他主机连接,服务器会在连接设置的早期拒绝该尝试:
ERROR 1130 (HY000): Host 'host_name' is not
allowed to connect to this MySQL server
因为这种拒绝发生的太早,
CONNECTION_CONTROL
看不到,也不算。
要监控失败的连接,请使用以下信息源:
Connection_control_delay_generated
status 变量指示服务器在其对连接尝试失败的响应中添加延迟的次数 。 这不计算在达到connection_control_failed_connections_threshold
系统变量定义的阈值之前发生的尝试。该
INFORMATION_SCHEMA
CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS
表提供有关每个帐户(用户/主机组合)的当前连续失败连接尝试次数的信息。这会计算所有失败的尝试,无论它们是否被延迟。
在运行时赋值
connection_control_failed_connections_threshold
有以下效果:
所有累积的失败连接计数器都重置为零。
Connection_control_delay_generated
状态变量重置为零 。