连接控制插件
p>MySQL Server包括一个插件库,使管理员可以在一定数量的连续失败的连接尝试之后,增加服务器对客户端的响应延迟。此功能提供了一种威慑力,可以减慢尝试访问MySQL用户帐户的暴力攻击。插件库包含两个插件:CONNECTION_CONTROL
检查传入的连接,并根据需要在服务器响应中添加延迟。该插件还公开了可以配置其操作的系统变量和提供基本监视信息的状态变量。该
CONNECTION_CONTROL
插件使用审核插件界面(请参见“编写审核插件”)。为了收集信息,它订阅MYSQL_AUDIT_CONNECTION_CLASSMASK
事件类,并处理MYSQL_AUDIT_CONNECTION_CONNECT
和子MYSQL_AUDIT_CONNECTION_CHANGE_USER
事件以检查服务器是否应在响应客户端连接尝试之前引入延迟。CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS
实现一个INFORMATION_SCHEMA
表,该表公开了有关失败连接尝试的更详细的监视信息。
以下各节提供有关连接控制插件安装和配置的信息。有关该CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS
表的信息,请参见“ INFORMATION_SCHEMA CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS表”。
连接控制插件的安装
本节介绍如何安装连接控制插件,CONNECTION_CONTROL
以及CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS
。有关安装插件的一般信息,请参见“MySQL服务器插件”。
要由服务器使用,插件库文件必须位于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_CONTROLSONAME 'connection_control.so';INSTALL PLUGIN CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTSSONAME 'connection_control.so';
INSTALL PLUGIN
立即加载该插件,并将其注册到mysql.plugins
系统表中,以使服务器为每次后续的正常启动加载该插件,而无需--plugin-load-add
。
要验证插件安装,请检查INFORMATION_SCHEMA.PLUGINS
表或使用以下SHOW PLUGINS
语句(请参见“获取服务器插件信息”)。例如:
mysql>SELECT PLUGIN_NAME, PLUGIN_STATUSFROM 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_min_connection_delay
:对于超出阈值的每个连续连接失败,要添加的延迟量。connection_control_max_connection_delay
:要添加的最大延迟。
要完全禁用检查失败的连接尝试,请设置connection_control_failed_connections_threshold
为零。如果connection_control_failed_connections_threshold
为非零值,则经过多次连续的失败连接尝试,延迟量为零。此后,延迟量是超过阈值的失败尝试次数乘以connection_control_min_connection_delay
毫秒。例如,使用默认值connection_control_failed_connections_threshold
和connection_control_min_connection_delay
值分别为3和1000,客户端的前三个连续失败连接尝试没有延迟,第四次失败尝试没有1000毫秒的延迟,第五次失败尝试有2000毫秒的延迟,依此类推,直到允许的最大延迟connection_control_max_connection_delay
。
您可以CONNECTION_CONTROL
在服务器启动或运行时设置系统变量。假设您要在服务器开始延迟其响应之前允许连续四次失败的连接尝试,并在此之后每增加一次失败,将延迟增加1500毫秒。要在服务器启动时设置相关变量,请将这些行放入服务器my.cnf
文件中:
[mysqld] plugin-load-add=connection_control.so connection_control_failed_connections_threshold=4 connection_control_min_connection_delay=1500
要在运行时设置和保留变量,请使用以下语句:
SET PERSIST connection_control_failed_connections_threshold = 4;SET PERSIST connection_control_min_connection_delay = 1500;
SET PERSIST
设置正在运行的MySQL实例的值。它还保存该值,使该值可用于随后的服务器重新启动。要更改正在运行的MySQL实例的值而不保存其值以供以后重新启动,请使用GLOBAL
关键字而不是PERSIST
。请参见“变量分配的SET语法”。
connection_control_min_connection_delay
和connection_control_max_connection_delay
系统变量具有固定的最小和的分别在1000和2147483647,最大值。此外,每个变量的允许值范围还取决于另一个变量的当前值:
connection_control_min_connection_delay
不能设置为大于的当前值connection_control_max_connection_delay
。connection_control_max_connection_delay
不能设置为小于的当前值connection_control_min_connection_delay
。
因此,要进行某些配置所需的更改,可能需要按特定顺序设置变量。假设当前的最小和最大延迟是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
(请参见“代理用户”)。 - 如果客户端用户未代理其他用户,但与
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
从host 连接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
状态变量被重置为零。 - 该
CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS
表变为空。
连接控制系统和状态变量
本节描述了CONNECTION_CONTROL
插件提供的系统和状态变量,以使其能够被配置和监视。
- 连接控制系统变量
- 连接控制状态变量
连接控制系统变量
如果CONNECTION_CONTROL
安装了插件,则将公开以下系统变量:
connection_control_failed_connections_threshold
属性 值 命令行格式 --connection-control-failed-connections-threshold=#
系统变量 connection_control_failed_connections_threshold
范围 Global 动态 是 SET_VAR
提示适用没有 类型 整数 默认值 3
最低值 0
最大值 2147483647
服务器为后续连接尝试添加延迟之前,允许客户端进行的连续失败连接尝试的次数:
- 如果变量具有非零值
N
,则服务器会添加一个延迟,该延迟从连续的失败尝试N
+1开始。如果客户端已达到延迟连接响应的程度,则下一个后续成功连接也会发生延迟。 - 将此变量设置为零将禁用连接失败计数。在这种情况下,服务器永远不会增加延迟。
有关如何
connection_control_failed_connections_threshold
与其他连接控制系统和状态变量交互的信息,- 如果变量具有非零值
connection_control_max_connection_delay
属性 值 命令行格式 --connection-control-max-connection-delay=#
系统变量 connection_control_max_connection_delay
范围 Global 动态 是 SET_VAR
提示适用没有 类型 整数 默认值 2147483647
最低值 1000
最大值 2147483647
服务器对失败的连接尝试的响应的最大延迟(以毫秒为单位),如果
connection_control_failed_connections_threshold
大于零。有关如何
connection_control_max_connection_delay
与其他连接控制系统和状态变量交互的信息,connection_control_min_connection_delay
属性 值 命令行格式 --connection-control-min-connection-delay=#
系统变量 connection_control_min_connection_delay
范围 Global 动态 是 SET_VAR
提示适用没有 类型 整数 默认值 1000
最低值 1000
最大值 2147483647
服务器对失败的连接尝试的响应的最小延迟(以毫秒为单位),如果
connection_control_failed_connections_threshold
大于零。一旦服务器开始延迟,这也是服务器增加其他连续故障的延迟的量。有关如何
connection_control_min_connection_delay
与其他连接控制系统和状态变量交互的信息,
连接控制状态变量
如果CONNECTION_CONTROL
安装了插件,则它会显示以下状态变量:
Connection_control_delay_generated
服务器对响应失败的连接的响应增加延迟的次数。这不计算在达到
connection_control_failed_connections_threshold
系统变量定义的阈值之前发生的尝试。此变量提供一个简单的计数器。有关更详细的连接控制监视信息,请参见下
INFORMATION_SCHEMA
CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS
表;请参见“ INFORMATION_SCHEMA CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS表”。connection_control_failed_connections_threshold
在运行时Connection_control_delay_generated
为分配一个值将重置为零。