6.4.2.1 连接控制插件的安装

本节介绍如何安装连接控制插件CONNECTION_CONTROLCONNECTION_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

如果希望阻止服务器在没有给定连接控制插件的情况下运行,请使用选项值FORCEFORCE_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个连续的失败连接尝试,延迟为零。

  • 此后,服务器为后续的连续尝试增加了增加的延迟,直到发生成功的连接为止。最初的未调整延迟开始于 1000 毫秒(1 秒),每次尝试增加 1000 毫秒。也就是说,一旦为帐户激活了延迟,则后续失败尝试的未调整延迟为 1000 毫秒,2000 毫秒,3000 毫秒,等等。

  • Client 遇到的实际延迟是未经调整的延迟,调整为位于connection_control_min_connection_delayconnection_control_max_connection_delay系统变量的值之内(包括该值)。

  • 一旦为帐户激活了延迟,此帐户之后的第一个成功连接也将经历延迟,但是将为后续连接重置失败计数。

例如,默认的connection_control_failed_connections_threshold值为 3,一个帐户的前三个连续的失败连接尝试没有延迟。帐户对第四个及随后失败的连接所经历的实际调整延迟取决于connection_control_min_connection_delayconnection_control_max_connection_delay值:

您可以在服务器启动或运行时设置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_delayconnection_control_max_connection_delay系统变量的最小值和最大值分别为 1000 和 2147483647.此外,每个变量的允许值范围还取决于另一个变量的当前值:

因此,要进行某些配置所需的更改,您可能需要按特定 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 帐户,但提供的凭据不正确或与任何已知的帐户都不匹配的尝试。

连接失败计数基于每次连接尝试的用户/主机组合。确定适用的用户名和主机名时会考虑代理,并且发生以下情况:

对于上述情况,连接尝试与某些mysql.user条目匹配,并且请求成功还是失败取决于 Client 端是否提供正确的身份验证凭据。例如,如果 Client 端 Importing 的密码不正确,则连接尝试将失败。

如果连接尝试不匹配任何mysql.user条目,则尝试失败。在这种情况下,没有CURRENT_USER()值可用,并且连接失败计数将使用 Client 端提供的用户名和服务器确定的 Client 端主机。例如,如果 Client 端尝试以用户user2的身份从主机host2.example.com连接,则用户名部分在 Client 端请求中可用,并且服务器确定主机信息。用于计数的用户/主机组合为[email protected]

Note

服务器维护有关哪些 Client 端主机可能连接到服务器的信息(基本上是mysql.user个条目的主机值的并集)。如果 Client 端尝试从任何其他主机进行连接,则服务器会在连接构建的早期阶段拒绝该尝试:

ERROR 1130 (HY000): Host 'host_name' is not
allowed to connect to this MySQL server

由于这种拒绝发生的时间太早,因此CONNECTION_CONTROL看不到它,也不算在内。

连接失败监视

要监视失败的连接,请使用以下信息源:

在运行时为connection_control_failed_connections_threshold分配值具有以下效果: