Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  ...  /  Connection-Control Plugin Installation

8.4.2.1 连接控制插件安装

本节描述了如何安装连接控制插件,CONNECTION_CONTROLCONNECTION_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

如果想要防止服务器在没有指定连接控制插件的情况下启动,可以使用选项值FORCEFORCE_PLUS_PERMANENT强制服务器启动失败,如果插件初始化不成功。

Note

可以单独安装一个插件,但两个插件都必须安装以获取完整的连接控制能力。特别是,只安装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毫秒,以此类推。

  • 客户端实际经验的延迟是未调整延迟,但在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 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_delayconnection_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.comproxy_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.comuser1@%.comuser1@%条目,计数使用user1@%.example.comuser1@%.comuser1@%,分别。

在上述情况下,连接尝试匹配了某个mysql.user条目,请求是否成功或失败取决于客户端提供的身份验证凭证。例如,如果客户端提供了错误密码,连接尝试失败。

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

Note

服务器维护关于哪些客户端主机可以连接到服务器的信息(实际上是 mysql.user 条目中的 host 值的并集)。如果客户端从任何其他主机尝试连接,服务器在连接设置的早期阶段拒绝该连接:

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

由于这种类型的拒绝发生得太早,CONNECTION_CONTROL 不会看到它,也不会计数它。

监控失败连接使用这些信息源:

在运行时将值分配给connection_control_failed_connections_threshold,产生以下效果: