MySQL 8.0 参考手册  / 第 6 章 安全  / 6.4 安全组件和插件  / 6.4.2 连接控制插件  /  6.4.2.1 连接控制插件安装

6.4.2.1 连接控制插件安装

本节介绍如何安装连接控制插件,CONNECTION_CONTROL以及 CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS. 有关安装插件的一般信息,请参阅 第 5.5.1 节,“安装和卸载插件”

为了被服务器使用,插件库文件必须位于MySQL插件目录(由plugin_dir系统变量命名的目录)中。plugin_dir如有必要,通过在服务器启动时 设置值来配置插件目录位置 。

插件库文件的基本名称是 connection_control. 文件名后缀因平台而异(例如,.so对于 Unix 和类 Unix 系统,.dll对于 Windows)。

要在服务器启动时加载插件,请使用 --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语句(请参阅第 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强制服务器启动失败,如果插件未成功初始化。

笔记

可以只安装一个插件而不安装另一个插件,但必须安装两个插件才能获得完整的连接控制功能。特别是,仅安装 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 GLOBAL connection_control_failed_connections_threshold = 4;
SET GLOBAL connection_control_min_connection_delay = 1500;

SET GLOBAL为正在运行的 MySQL 实例设置值。要使更改永久生效,请在 my.cnf文件中添加一行,如前所示。

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.comexternal_user@example.com和 都 proxy_user@example.com必须在系统表中具有有效条目,并且必须在mysql.user系统表中定义它们之间的代理关系mysql.proxies_priv(请参阅第 6.2.14 节,“代理用户”)。

  • 如果客户端用户没有代理另一个用户,但确实匹配了一个mysql.user条目,则计数使用CURRENT_USER()与该条目对应的值。例如,如果 user1从主机连接 的用户与条目host1.example.com匹配 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

笔记

服务器维护有关哪些客户端主机可能连接到服务器的信息(本质上是mysql.user条目的主机值的联合)。如果客户端尝试从任何其他主机连接,服务器会在连接设置的早期拒绝该尝试:

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

因为这种拒绝发生的太早, CONNECTION_CONTROL看不到,也不算。

连接失败监控

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

在运行时赋值 connection_control_failed_connections_threshold 有以下效果: