本节介绍如何安装连接控制插件,CONNECTION_CONTROL
和 CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS
。有关安装插件的一般信息,请参阅 第 7.6.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
系统表中,以便服务器在每次后续正常启动时加载它,而无需使用 --plugin-load-add
。
要验证插件安装,请检查信息模式 PLUGINS
表或使用 SHOW PLUGINS
语句(请参阅 第 7.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
。请参阅 第 15.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 帐户匹配,但提供的凭据不正确或与任何已知帐户都不匹配。
失败连接计数基于每次连接尝试的用户/主机组合。确定适用的用户名和主机名时会考虑代理,具体如下:
如果客户端用户代理另一个用户,则用于失败连接计数的帐户是代理用户,而不是被代理用户。例如,如果
[email protected]
代理[email protected]
,则连接计数使用代理用户[email protected]
,而不是被代理用户[email protected]
。[email protected]
和[email protected]
都必须在mysql.user
系统表中具有有效的条目,并且必须在mysql.proxies_priv
系统表中定义它们之间的代理关系(请参阅 第 8.2.19 节“代理用户”)。如果客户端用户没有代理另一个用户,但与
mysql.user
条目匹配,则计数使用与该条目对应的CURRENT_USER()
值。例如,如果从主机host1.example.com
连接的用户user1
与[email protected]
条目匹配,则计数使用[email protected]
。如果用户改为与user1@%.example.com
、user1@%.com
或user1@%
条目匹配,则计数分别使用user1@%.example.com
、user1@%.com
或user1@%
。
对于刚才描述的情况,连接尝试与某些 mysql.user
条目匹配,请求是成功还是失败取决于客户端是否提供了正确的身份验证凭据。例如,如果客户端提供的密码不正确,则连接尝试失败。
如果连接尝试与任何 mysql.user
条目都不匹配,则尝试失败。在这种情况下,没有可用的 CURRENT_USER()
值,并且连接失败计数使用客户端提供的用户名和服务器确定的客户端主机。例如,如果客户端尝试从主机 host2.example.com
以用户 user2
的身份连接,则用户名部分在客户端请求中可用,并且服务器确定主机信息。用于计数的用户/主机组合为 [email protected]
。
服务器会维护有关哪些客户端主机可能连接到服务器的信息(基本上是 mysql.user
条目的主机值的并集)。如果客户端尝试从任何其他主机连接,服务器会在连接建立的早期阶段拒绝该尝试:
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_ATTEMPTS
表提供有关每个帐户(用户/主机组合)当前连续连接尝试失败次数的信息。这会统计所有失败的尝试,而不管它们是否被延迟。
在运行时为 connection_control_failed_connections_threshold
赋值会产生以下影响:
所有累积的失败连接计数器都将重置为零。
Connection_control_delay_generated
状态变量将重置为零。