MySQL8 中文参考(二十八)(3)https://developer.aliyun.com/article/1566114
8.4.2 连接控制插件
8.4.2.1 连接控制插件安装
8.4.2.2 连接控制系统和状态变量
MySQL 服务器包含一个插件库,使管理员能够在一定数量的连续失败尝试之后,向连接尝试的服务器响应引入逐渐增加的延迟。这种能力提供了一个减缓措施,可以减缓针对 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
表的信息,请参阅 第 28.6.2 节,“INFORMATION_SCHEMA CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS 表”。
原文:
dev.mysql.com/doc/refman/8.0/en/connection-control-installation.html
8.4.2.1 连接控制插件安装
本节描述了如何安装连接控制插件CONNECTION_CONTROL
和CONNECTION_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
如果希望防止服务器在没有给定连接控制插件的情况下运行,请使用 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
设置为零。connection_control_min_connection_delay
: 连接失败的最小延迟时间(毫秒)超过阈值。connection_control_max_connection_delay
: 连接失败的最大延迟时间(毫秒)超过阈值。
如果 connection_control_failed_connections_threshold
不为零,则启用了失败连接计数,并具有以下属性:
- 延迟为零,直到
connection_control_failed_connections_threshold
连续失败的连接尝试。 - 之后,服务器会为后续连续尝试添加递增延迟,直到成功连接发生。初始未调整的延迟从 1000 毫秒(1 秒)开始,每次尝试增加 1000 毫秒。也就是说,一旦账户激活延迟,后续失败尝试的未调整延迟为 1000 毫秒、2000 毫秒、3000 毫秒等。
- 客户端实际经历的延迟是未调整的延迟,调整后的值在
connection_control_min_connection_delay
和connection_control_max_connection_delay
系统变量的值范围内。 - 一旦账户激活延迟,随后该账户的第一次成功连接也会经历延迟,但是对于后续连接,失败计数会被重置。
例如,使用默认的connection_control_failed_connections_threshold
值为 3,账户的前三次连续连接尝试失败不会有延迟。账户在第四次及后续失败连接中实际调整的延迟取决于connection_control_min_connection_delay
和connection_control_max_connection_delay
的值:
- 如果
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
。参见 Section 15.7.6.1, “变量赋值的 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
系统表中定义代理关系(参见第 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
状态变量被重置为零。CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS
表变为空。
原文:
dev.mysql.com/doc/refman/8.0/en/connection-control-variables.html
8.4.2.2 连接控制系统和状态变量
本节描述了CONNECTION_CONTROL
插件提供的系统和状态变量,以便配置和监视其操作。
- 连接控制系统变量
- 连接控制状态变量
连接控制系统变量
如果安装了CONNECTION_CONTROL
插件,则会公开这些系统变量:
connection_control_failed_connections_threshold
命令行格式 | --connection-control-failed-connections-threshold=# |
系统变量 | connection_control_failed_connections_threshold |
范围 | 全局 |
动态 | 是 |
SET_VAR 提示适用 |
否 |
类型 | 整数 |
默认值 | 3 |
最小值 | 0 |
最大值 | 2147483647 |
- 在服务器在向帐户添加延迟以进行后续连接尝试之前允许的连续失败连接尝试次数:
- 如果变量具有非零值*
N
,则服务器从连续失败尝试N
*+1 开始添加延迟。如果帐户已达到连接响应被延迟的点,则下一个成功连接也会延迟。 - 将此变量设置为零会禁用失败连接计数。在这种情况下,服务器永远不会添加延迟。
- 有关
connection_control_failed_connections_threshold
与其他连接控制系统和状态变量的交互信息,请参见第 8.4.2.1 节,“连接控制插件安装”。 connection_control_max_connection_delay
命令行格式 | --connection-control-max-connection-delay=# |
系统变量 | connection_control_max_connection_delay |
范围 | 全局 |
动态 | 是 |
SET_VAR 提示适用 |
否 |
类型 | 整数 |
默认值 | 2147483647 |
最小值 | 1000 |
最大值 | 2147483647 |
单位 | 毫秒 |
- 如果
connection_control_failed_connections_threshold
大于零,则服务器响应失败连接尝试的最大延迟(以毫秒为单位)。
有关connection_control_max_connection_delay
如何与其他连接控制系统和状态变量交互的信息,请参见第 8.4.2.1 节,“连接控制插件安装”。 connection_control_min_connection_delay
命令行格式 | --connection-control-min-connection-delay=# |
系统变量 | connection_control_min_connection_delay |
范围 | 全局 |
动态 | 是 |
SET_VAR 提示适用 |
否 |
类型 | 整数 |
默认值 | 1000 |
最小值 | 1000 |
最大值 | 2147483647 |
单位 | 毫秒 |
- 服务器响应失败连接尝试的最小延迟(以毫秒为单位),如果
connection_control_failed_connections_threshold
大于零。
有关connection_control_min_connection_delay
如何与其他连接控制系统和状态变量交互的信息,请参见第 8.4.2.1 节,“连接控制插件安装”。
连接控制状态变量
如果安装了CONNECTION_CONTROL
插件,则会公开此状态变量:
Connection_control_delay_generated
服务器在响应失败连接尝试时添加延迟的次数。这不包括在达到由connection_control_failed_connections_threshold
系统变量定义的阈值之前发生的尝试。
这个变量提供了一个简单的计数器。要获取更详细的连接控制监控信息,请查看INFORMATION_SCHEMA
CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS
表;参见 Section 28.6.2, “The INFORMATION_SCHEMA CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS Table”。
在运行时为connection_control_failed_connections_threshold
赋值会将Connection_control_delay_generated
重置为零。
8.4.3 密码验证组件
8.4.3.1 密码验证组件的安装和卸载
8.4.3.2 密码验证选项和变量
8.4.3.3 过渡到密码验证组件
validate_password
组件通过要求帐户密码并启用潜在密码的强度测试来提高安全性。该组件公开了系统变量,使您能够配置密码策略,并公开了用于组件监视的状态变量。
注意
在 MySQL 8.0 中,validate_password
插件被重新实现为 validate_password
组件。(有关组件的一般信息,请参见 第 7.5 节,“MySQL 组件”。)以下说明描述了如何使用组件,而不是插件。有关使用 validate_password
插件形式的说明,请参见 密码验证插件,在 MySQL 5.7 参考手册 中。
validate_password
插件形式仍然可用,但已被弃用;预计将在将来的 MySQL 版本中删除。使用插件的 MySQL 安装应该过渡到使用组件。请参见 第 8.4.3.3 节,“过渡到密码验证组件”。
validate_password
组件实现了以下功能:
- 对于将明文值作为密码分配的 SQL 语句,
validate_password
会根据当前密码策略检查密码,并在密码弱时拒绝密码(该语句返回一个ER_NOT_VALID_PASSWORD
错误)。这适用于ALTER USER
、CREATE USER
和SET PASSWORD
语句。 - 对于
CREATE USER
语句,validate_password
要求提供密码,并且该密码必须符合密码策略。即使帐户最初被锁定,解锁帐户后也需要满足策略要求的密码,否则稍后访问该帐户将不需要密码。 validate_password
实现了一个VALIDATE_PASSWORD_STRENGTH()
SQL 函数,用于评估潜在密码的强度。该函数接受一个密码参数,并返回一个从 0(弱)到 100(强)的整数。
注意
对于分配或修改帐户密码的语句(ALTER USER
,CREATE USER
和SET PASSWORD
),这里描述的validate_password
功能仅适用于使用将凭据内部存储到 MySQL 的身份验证插件的帐户。对于使用针对 MySQL 外部凭据系统执行身份验证的插件的帐户,密码管理也必须在该系统外部处理。有关内部凭据存储的更多信息,请参阅 Section 8.2.15, “Password Management”。
前面的限制不适用于使用VALIDATE_PASSWORD_STRENGTH()
函数,因为它不直接影响帐户。
例子:
validate_password
在以下语句中检查明文密码。根据要求密码至少为 8 个字符长的默认密码策略,密码较弱,该语句将产生错误:
mysql> ALTER USER USER() IDENTIFIED BY 'abc'; ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
- 由于原始密码值不可用进行检查,指定为散列值的密码不会被检查:
mysql> ALTER USER 'jeffrey'@'localhost' IDENTIFIED WITH mysql_native_password AS '*0D3CED9BEC10A777AEC23CCC353A8C08A633045E'; Query OK, 0 rows affected (0.01 sec)
- 即使帐户最初被锁定,由于没有包含符合当前密码策略的密码,此帐户创建语句将失败:
mysql> CREATE USER 'juanita'@'localhost' ACCOUNT LOCK; ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
- 要检查密码,请使用
VALIDATE_PASSWORD_STRENGTH()
函数:
mysql> SELECT VALIDATE_PASSWORD_STRENGTH('weak'); +------------------------------------+ | VALIDATE_PASSWORD_STRENGTH('weak') | +------------------------------------+ | 25 | +------------------------------------+ mysql> SELECT VALIDATE_PASSWORD_STRENGTH('lessweak$_@123'); +----------------------------------------------+ | VALIDATE_PASSWORD_STRENGTH('lessweak$_@123') | +----------------------------------------------+ | 50 | +----------------------------------------------+ mysql> SELECT VALIDATE_PASSWORD_STRENGTH('N0Tweak$_@123!'); +----------------------------------------------+ | VALIDATE_PASSWORD_STRENGTH('N0Tweak$_@123!') | +----------------------------------------------+ | 100 | +----------------------------------------------+
要配置密码检查,请修改名称形式为validate_password.*
xxx*
的系统变量;这些是控制密码策略的参数。请参阅 Section 8.4.3.2, “Password Validation Options and Variables”。
如果未安装validate_password
,则validate_password.*
xxx*
系统变量不可用,语句中的密码不会被检查,VALIDATE_PASSWORD_STRENGTH()
函数始终返回 0。例如,如果没有安装插件,帐户可以被分配少于 8 个字符的密码,甚至可以没有密码。
假设已安装validate_password
,它实现了三个级别的密码检查:LOW
,MEDIUM
和STRONG
。默认为MEDIUM
;要更改此设置,请修改validate_password.policy
的值。这些策略实施越来越严格的密码测试。以下描述是针对默认参数值的,可以通过更改相应的系统变量来修改这些值。
LOW
策略仅测试密码长度。密码必须至少为 8 个字符长。要更改此长度,请修改validate_password.length
。MEDIUM
策略添加了密码必须包含至少 1 个数字字符、1 个小写字符、1 个大写字符和 1 个特殊(非字母数字)字符的条件。要更改这些值,请修改validate_password.number_count
、validate_password.mixed_case_count
和validate_password.special_char_count
。STRONG
策略添加了一个条件,即长度为 4 或更长的密码子串不得与字典文件中的单词匹配(如果已指定)。要指定字典文件,请修改validate_password.dictionary_file
。
此外,validate_password
支持拒绝与当前会话的有效用户帐户的用户名部分匹配的密码,无论是正向还是反向。为了控制这种能力,validate_password
暴露了一个validate_password.check_user_name
系统变量,默认情况下已启用。
原文:
dev.mysql.com/doc/refman/8.0/en/validate-password-installation.html
8.4.3.1 密码验证组件的安装和卸载
本节描述了如何安装和卸载 validate_password
密码验证组件。有关安装和卸载组件的一般信息,请参阅第 7.5 节,“MySQL 组件”。
注意
如果使用MySQL Yum 仓库、MySQL SLES 仓库或由 Oracle 提供的 RPM 软件包安装 MySQL 8.0,则在首次启动 MySQL 服务器后,默认启用 validate_password
组件。
从使用 Yum 或 RPM 软件包升级到 MySQL 8.0 时,validate_password
插件会保留在原位。要从 validate_password
插件过渡到 validate_password
组件,请参阅第 8.4.3.3 节,“过渡到密码验证组件”。
要使组件库文件可被服务器使用,必须将其放置在 MySQL 插件目录中(由plugin_dir
系统变量命名的目录)。如有必要,在服务器启动时通过设置plugin_dir
的值来配置插件目录位置。
要安装 validate_password
组件,请使用以下语句:
INSTALL COMPONENT 'file://component_validate_password';
组件安装是一次性操作,不需要每次服务器启动都执行。INSTALL COMPONENT
加载组件,并在 mysql.component
系统表中注册它,以便在随后的服务器启动期间加载它。
要卸载 validate_password
组件,请使用以下语句:
UNINSTALL COMPONENT 'file://component_validate_password';
UNINSTALL COMPONENT
卸载组件,并从 mysql.component
系统表中注销它,以使其在随后的服务器启动期间不加载。
原文:
dev.mysql.com/doc/refman/8.0/en/validate-password-options-variables.html
MySQL8 中文参考(二十八)(5)https://developer.aliyun.com/article/1566116