On this page
6.4.2.1 连接控制插件的安装
本节介绍如何安装连接控制插件CONNECTION_CONTROL
和CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS
。有关安装插件的一般信息,请参见第 5.5.1 节“安装和卸载插件”。
要由服务器使用,插件库文件必须位于 MySQL 插件目录(由plugin_dir系统变量命名的目录)中。如有必要,通过在服务器启动时设置plugin_dir的值来配置插件目录位置。
插件库文件的基本名称为connection_control
。每个平台的文件名后缀都不同(例如,对于 Unix 和类 Unix 系统,为.so
,对于 Windows 为.dll
)。
要在服务器启动时加载插件,请使用--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
系统 table 中,以使服务器为每次后续的正常启动加载该插件,而无需--plugin-load-add。
要验证插件安装,请检查INFORMATION_SCHEMA.PLUGINStable 或使用SHOW PLUGINS语句(请参见第 5.5.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
强制如果插件未成功初始化则服务器启动失败。
Note
可以安装一个插件而不安装另一个插件,但是必须安装两个插件才能完全控制连接。特别是,仅安装CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS
插件几乎没有用,因为如果没有CONNECTION_CONTROL
插件来提供填充CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTStable 的数据,则从 table 中检索的内容将始终为空。
连接延迟配置
要启用配置其操作,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 毫秒,等等。
Client 遇到的实际延迟是未经调整的延迟,调整为位于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 GLOBAL connection_control_failed_connections_threshold = 4;
SET GLOBAL connection_control_min_connection_delay = 1500;
SET GLOBAL设置正在运行的 MySQL 实例的值。如要永久保留更改,请在my.cnf
文件中添加一行。
connection_control_min_connection_delay和connection_control_max_connection_delay系统变量的最小值和最大值分别为 1000 和 2147483647.此外,每个变量的允许值范围还取决于另一个变量的当前值:
connection_control_min_connection_delay不能设置为大于connection_control_max_connection_delay的当前值。
connection_control_max_connection_delay的设置不能小于当前值connection_control_min_connection_delay。
因此,要进行某些配置所需的更改,您可能需要按特定 Sequences 设置变量。假设当前的最小和最大延迟分别为 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
插件后,它将检查连接尝试并跟踪它们是否失败。为此,失败的连接尝试是 Client 端用户和主机匹配已知的 MySQL 帐户,但提供的凭据不正确或与任何已知的帐户都不匹配的尝试。
连接失败计数基于每次连接尝试的用户/主机组合。确定适用的用户名和主机名时会考虑代理,并且发生以下情况:
如果 Client 端用户代理另一个用户,则用于连接失败计数的帐户是代理用户,而不是代理用户。例如,如果
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
系统 table 中都必须具有有效的条目,并且它们之间的代理关系必须在mysql.proxies_priv
系统 table 中定义(请参见第 6.2.14 节“代理用户”)。如果 Client 端用户未代理其他用户,但与
mysql.user
条目匹配,则计数将使用与该条目对应的CURRENT_USER()值。例如,如果从主机host1.example.com
连接的用户user1
与user1@host1.example.com
条目匹配,则计数使用user1@host1.example.com
。如果用户匹配user1@%.example.com
,user1@%.com
或user1@%
条目,则计数分别使用user1@%.example.com
,user1@%.com
或user1@%
。
对于上述情况,连接尝试与某些mysql.user
条目匹配,并且请求成功还是失败取决于 Client 端是否提供正确的身份验证凭据。例如,如果 Client 端 Importing 的密码不正确,则连接尝试将失败。
如果连接尝试不匹配任何mysql.user
条目,则尝试失败。在这种情况下,没有CURRENT_USER()值可用,并且连接失败计数将使用 Client 端提供的用户名和服务器确定的 Client 端主机。例如,如果 Client 端尝试以用户user2
的身份从主机host2.example.com
连接,则用户名部分在 Client 端请求中可用,并且服务器确定主机信息。用于计数的用户/主机组合为user2@host2.example.com
。
Note
服务器维护有关哪些 Client 端主机可能连接到服务器的信息(基本上是mysql.user
个条目的主机值的并集)。如果 Client 端尝试从任何其他主机进行连接,则服务器会在连接构建的早期阶段拒绝该尝试:
ERROR 1130 (HY000): Host 'host_name' is not
allowed to connect to this MySQL server
由于这种拒绝发生的时间太早,因此CONNECTION_CONTROL
看不到它,也不算在内。
连接失败监视
要监视失败的连接,请使用以下信息源:
Connection_control_delay_generated状态变量指示服务器为响应失败的连接尝试添加延迟的次数。这不计算在达到connection_control_failed_connections_threshold系统变量定义的阈值之前发生的尝试。
INFORMATION_SCHEMA
CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTStable 提供有关每个帐户(用户/主机组合)的当前连续失败连接尝试次数的信息。这将计算所有失败的尝试,无论它们是否被延迟。
在运行时为connection_control_failed_connections_threshold分配值具有以下效果:
所有累积的失败连接计数器都将重置为零。
Connection_control_delay_generated状态变量重置为零。
CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTStable 变为空。