本节介绍如何安装连接控制插件 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。
要验证插件安装,请检查 Information Schema 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 帐户匹配,但提供的凭据不正确或与任何已知帐户不匹配的尝试。
失败连接计数基于每次连接尝试的用户/主机组合。确定适用的用户名和主机名会考虑代理,并按如下方式进行。
如果客户端用户代理另一个用户,则用于失败连接计数的帐户是代理用户,而不是被代理用户。例如,如果
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@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状态变量指示服务器向失败的连接尝试添加延迟的次数。这不会统计在达到connection_control_failed_connections_threshold系统变量定义的阈值之前发生的尝试。INFORMATION_SCHEMACONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS表提供了有关每个帐户(用户/主机组合)的连续失败连接尝试当前次数的信息。这会统计所有失败尝试,无论它们是否被延迟。
在运行时为 connection_control_failed_connections_threshold 赋值将产生以下影响。
所有累积的失败连接计数器都将重置为零。
Connection_control_delay_generated状态变量将重置为零。