8.4.2.1 连接控制插件安装
本节描述了如何安装连接控制插件,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节,“变量赋值语法”。
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
系统表(见第8.2.19节,“代理用户”)。 -
如果客户端用户不代理其他用户,但匹配了
mysql.user
条目,计数使用对应的CURRENT_USER()
值。例如,如果用户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
条目中的 host 值的并集)。如果客户端从任何其他主机尝试连接,服务器在连接设置的早期阶段拒绝该连接:
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
被重置为零。