本节描述如何安装连接控制插件,CONNECTION_CONTROL
和 CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS
。有关安装插件的一般信息,请参阅 第 7.6.1 节,“安装和卸载插件”。
要使插件库文件可供服务器使用,必须将其位于 MySQL 插件目录中(由 plugin_dir
系统变量命名的目录)。如果必要,请通过在服务器启动时设置 plugin_dir
的值来配置插件目录的位置。
插件库文件的基本名称是 connection_control
。文件名后缀因平台而异(例如,Unix 和 Unix-like 系统上的 .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
设置为零。 -
连接控制最小连接延迟
: 连接失败阈值以上的最小延迟,以毫秒为单位。 -
连接控制最大连接延迟
: 连接失败阈值以上的最大延迟,以毫秒为单位。
如果 连接控制失败连接阈值
不为零,失败连接计数启用,并具有以下属性:
-
延迟为零,直到
连接控制失败连接阈值
连续失败连接尝试。 -
然后,服务器为后续连续尝试添加递增延迟,直到成功连接发生。未调整的延迟从 1000 毫秒(1 秒)开始,每次尝试增加 1000 毫秒。那就是说,一旦延迟被激活 для账户,后续失败尝试的未调整延迟为 1000 毫秒、2000 毫秒、3000 毫秒等。
-
客户端实际经历的延迟是未调整延迟,调整以在
连接控制最小连接延迟
和连接控制最大连接延迟
系统变量之间,包括。 -
一旦延迟被激活 для账户,账户的第一次成功连接也将经历延迟,但失败计数将被重置为后续连接。
例如,使用默认的 连接控制失败连接阈值
值 3,对于账户的前三个连续失败连接尝试没有延迟。账户对第四个和后续失败连接的实际调整延迟取决于 连接控制最小连接延迟
和 连接控制最大连接延迟
值:
-
如果
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 语法 for 变量赋值”。
系统变量 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_SCHEMA
的CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS
表提供了每个账户(用户/主机组合)当前连续失败的连接尝试次数的信息。这包括所有失败的尝试,无论是否延迟。
在运行时分配 connection_control_failed_connections_threshold
的值将产生以下效果:
-
所有累积的失败连接计数器将被重置为零。
-
状态变量
Connection_control_delay_generated
将被重置为零。 -
信息模式
INFORMATION_SCHEMA
的CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS
表将变为空。