原文:
docs.oracle.com/javase/tutorial/reallybigindex.html
原文:
dev.mysql.com/doc/refman/8.0/en/no-login-pluggable-authentication.html
8.4.1.9 无登录可插拔认证
mysql_no_login
服务器端认证插件阻止所有使用它的账户的客户端连接。此插件的用例包括:
- 必须能够执行存储过程和视图并具有提升权限,而不会将这些权限暴露给普通用户的账户。
- 代理账户永远不应允许直接登录,而是仅通过代理账户访问的账户。
以下表显示了插件和库文件名。文件名后缀可能因您的系统而异。该文件必须位于由 plugin_dir
系统变量命名的目录中。
表 8.25 无登录认证的插件和库名称
插件或文件 | 插件或文件名 |
---|---|
服务器端插件 | mysql_no_login |
客户端插件 | 无 |
库文件 | mysql_no_login.so |
以下各节提供了特定于无登录可插拔认证的安装和使用信息:
- 安装无登录可插拔认证
- 卸载无登录可插拔认证
- 使用无登录可插拔认证
有关 MySQL 中可插拔认证的一般信息,请参阅第 8.2.17 节,“可插拔认证”。有关代理用户信息,请参阅第 8.2.19 节,“代理用户”。
安装无登录可插拔认证
本节描述了如何安装无登录认证插件。有关安装插件的一般信息,请参阅第 7.6.1 节,“安装和卸载插件”。
要使服务器可用,插件库文件必须位于 MySQL 插件目录中(由 plugin_dir
系统变量命名的目录)。如有必要,请通过在服务器启动时设置 plugin_dir
的值来配置插件目录位置。
插件库文件基本名称为 mysql_no_login
。文件名后缀因平台而异(例如,对于 Unix 和类 Unix 系统,为 .so
,对于 Windows 为 .dll
)。
要在服务器启动时加载插件,请使用--plugin-load-add
选项命名包含插件的库文件。使用此插件加载方法,选项必须在每次服务器启动时给出。例如,将这些行放入服务器的my.cnf
文件中,根据需要调整您平台的.so
后缀:
[mysqld]
plugin-load-add=mysql_no_login.so
修改my.cnf
后,请重新启动服务器以使新设置生效。
或者,要在运行时加载插件,请使用此语句,根据需要调整您平台的.so
后缀:
INSTALL PLUGIN mysql_no_login SONAME 'mysql_no_login.so';
INSTALL PLUGIN
立即加载插件,并在mysql.plugins
系统表中注册它,以使服务器在每次后续正常启动时加载它,而无需--plugin-load-add
。
要验证插件安装,请检查信息模式PLUGINS
表或使用SHOW PLUGINS
语句(参见 Section 7.6.2, “Obtaining Server Plugin Information”)。例如:
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
FROM INFORMATION_SCHEMA.PLUGINS
WHERE PLUGIN_NAME LIKE '%login%';
---------------- ---------------
| PLUGIN_NAME | PLUGIN_STATUS |
---------------- ---------------
| mysql_no_login | ACTIVE |
---------------- ---------------
如果插件初始化失败,请检查服务器错误日志以获取诊断消息。
要将 MySQL 帐户与无登录插件关联,请参阅使用无登录可插拔认证。
卸载无登录可插拔认证
卸载无登录认证插件的方法取决于您安装它的方式:
如果您在服务器启动时使用--plugin-load-add
选项安装了插件,请在不带该选项的情况下重新启动服务器。
如果您在运行时使用INSTALL PLUGIN
语句安装了插件,则在服务器重新启动时仍然保留安装。要卸载它,请使用UNINSTALL PLUGIN
:
UNINSTALL PLUGIN mysql_no_login;
使用无登录可插拔认证
本节描述如何使用无登录认证插件防止帐户被用于从 MySQL 客户端程序连接到服务器。假定服务器正在运行,并启用了无登录插件,如安装无登录可插拔认证中所述。
在CREATE USER
语句的IDENTIFIED WITH
子句中引用无登录认证插件时,请使用名称mysql_no_login
。
使用mysql_no_login
进行身份验证的账户可用作存储过程和视图对象的DEFINER
。如果此类对象定义还包括SQL SECURITY DEFINER
,则将以该账户的权限执行。数据库管理员可以利用此行为提供仅通过受控接口公开的机密或敏感数据的访问。
以下示例说明了这些原则。它定义了一个不允许客户端连接的账户,并将其与一个仅公开mysql.user
系统表的某些列的视图关联起来:
CREATE DATABASE nologindb;
CREATE USER 'nologin'@'localhost'
IDENTIFIED WITH mysql_no_login;
GRANT ALL ON nologindb.*
TO 'nologin'@'localhost';
GRANT SELECT ON mysql.user
TO 'nologin'@'localhost';
CREATE DEFINER = 'nologin'@'localhost'
SQL SECURITY DEFINER
VIEW nologindb.myview
AS SELECT User, Host FROM mysql.user;
要为普通用户提供对视图的受保护访问,请执行以下操作:
代码语言:javascript复制GRANT SELECT ON nologindb.myview
TO 'ordinaryuser'@'localhost';
现在普通用户可以使用视图访问它呈现的有限信息:
代码语言:javascript复制SELECT * FROM nologindb.myview;
用户尝试访问视图中未公开的列或未被授权访问的用户尝试从视图中选择将导致错误。
注意
由于nologin
账户不能直接使用,因此必须由具有创建对象和设置DEFINER
值所需特权的root
或类似账户执行设置对象的操作。
mysql_no_login
插件在代理场景中也很有用。(有关代理涉及的概念讨论,请参阅第 8.2.19 节,“代理用户”。)使用mysql_no_login
进行身份验证的账户可用作代理账户的被代理用户:
-- create proxied account
CREATE USER 'proxied_user'@'localhost'
IDENTIFIED WITH mysql_no_login;
-- grant privileges to proxied account
GRANT ...
ON ...
TO 'proxied_user'@'localhost';
-- permit proxy_user to be a proxy account for proxied account
GRANT PROXY
ON 'proxied_user'@'localhost'
TO 'proxy_user'@'localhost';
这使客户端可以通过代理账户(proxy_user
)访问 MySQL,但不能通过直接连接作为被代理用户(proxied_user
)绕过代理机制。使用proxy_user
账户连接的客户端具有proxied_user
账户的权限,但proxied_user
本身不能用于连接。
若要了解有关保护代理账户免受直接使用的替代方法,请参阅防止直接登录到代理账户。
原文:
dev.mysql.com/doc/refman/8.0/en/socket-pluggable-authentication.html
8.4.1.10 套接字对等凭证可插拔认证
服务器端auth_socket
认证插件用于认证通过 Unix 套接字文件从本地主机连接的客户端。该插件使用SO_PEERCRED
套接字选项来获取运行客户端程序的用户信息。因此,该插件只能在支持SO_PEERCRED
选项的系统上使用,例如 Linux。
此插件的源代码可作为一个相对简单的示例,演示如何编写一个可加载的认证插件。
以下表显示了插件和库文件名。文件必须位于由plugin_dir
系统变量命名的目录中。
表 8.26 套接字对等凭证认证的插件和库名称
插件或文件 | 插件或文件名 |
---|---|
服务器端插件 | auth_socket |
客户端插件 | 无,请参阅讨论 |
库文件 | auth_socket.so |
以下各节提供了特定于套接字可插拔认证的安装和使用信息:
- 安装套接字可插拔认证
- 卸载套接字可插拔认证
- 使用套接字可插拔认证
有关 MySQL 中可插拔认证的一般信息,请参阅第 8.2.17 节,“可插拔认证”。
安装套接字可插拔认证
本节描述了如何安装套接字认证插件。有关安装插件的一般信息,请参阅第 7.6.1 节,“安装和卸载插件”。
要使服务器可用,插件库文件必须位于 MySQL 插件目录中(由plugin_dir
系统变量命名的目录)。如有必要,通过在服务器启动时设置plugin_dir
的值来配置插件目录位置。
要在服务器启动时加载插件,请使用--plugin-load-add
选项来命名包含插件的库文件。使用这种插件加载方法,选项必须在每次服务器启动时给出。例如,将以下行放入服务器的my.cnf
文件中:
[mysqld]
plugin-load-add=auth_socket.so
修改my.cnf
后,重新启动服务器以使新设置生效。
或者,要在运行时加载插件,请使用此语句:
代码语言:javascript复制INSTALL PLUGIN auth_socket SONAME 'auth_socket.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 '%socket%';
------------- ---------------
| PLUGIN_NAME | PLUGIN_STATUS |
------------- ---------------
| auth_socket | ACTIVE |
------------- ---------------
如果插件初始化失败,请检查服务器错误日志以获取诊断消息。
要将 MySQL 帐户与套接字插件关联,请参阅使用套接字可插拔认证。
卸载套接字可插拔认证
卸载套接字可插拔认证插件的方法取决于您安装插件的方式:
如果您在服务器启动时使用--plugin-load-add
选项安装了插件,请在不带该选项的情况下重新启动服务器。
如果您在运行时使用INSTALL PLUGIN
语句安装了插件,则在服务器重新启动时仍然安装。要卸载它,请使用UNINSTALL PLUGIN
:
UNINSTALL PLUGIN auth_socket;
使用套接字可插拔认证
套接字插件检查套接字用户名(操作系统用户名)是否与客户端程序指定给服务器的 MySQL 用户名匹配。如果名称不匹配,则插件将检查套接字用户名是否与mysql.user
系统表行的authentication_string
列中指定的名称匹配。如果找到匹配项,则插件允许连接。authentication_string
值可以使用CREATE USER
或ALTER USER
中的IDENTIFIED ...AS
子句指定。
假设为一个名为valerie
的操作系统用户创建了一个用于通过套接字文件从本地主机进行认证的 MySQL 帐户,该用户将通过auth_socket
插件进行认证:
CREATE USER 'valerie'@'localhost' IDENTIFIED WITH auth_socket;
如果本地主机上的用户使用登录名 stefanie
调用 mysql 并使用选项 --user=valerie
通过套接字文件连接,服务器将使用 auth_socket
对客户端进行身份验证。插件确定 --user
选项值 (valerie
) 与客户端用户名 (stephanie
) 不同,因此拒绝连接。如果名为 valerie
的用户尝试同样的操作,插件会发现用户名和 MySQL 用户名都是 valerie
,允许连接。但是,即使是 valerie
,如果使用不同的协议(如 TCP/IP)进行连接,插件也会拒绝连接。
要允许 valerie
和 stephanie
操作系统用户通过使用账户的套接字文件连接访问 MySQL,可以通过两种方式实现:
在创建账户时分别命名这两个用户,一个在 CREATE USER
后面,另一个在认证字符串中:
CREATE USER 'valerie'@'localhost' IDENTIFIED WITH auth_socket AS 'stephanie';
如果您已经使用 CREATE USER
为单个用户创建了账户,可以使用 ALTER USER
来添加第二个用户:
CREATE USER 'valerie'@'localhost' IDENTIFIED WITH auth_socket;
ALTER USER 'valerie'@'localhost' IDENTIFIED WITH auth_socket AS 'stephanie';
要访问账户,valerie
和 stephanie
在连接时都需要指定 --user=valerie
。
原文:
dev.mysql.com/doc/refman/8.0/en/fido-pluggable-authentication.html
8.4.1.11 FIDO 可插拔认证
注意
FIDO 可插拔认证是包含在 MySQL Enterprise Edition 中的扩展,这是一款商业产品。要了解更多关于商业产品的信息,请参见 www.mysql.com/products/
。
MySQL Enterprise Edition 支持一种认证方法,允许用户使用 FIDO 认证对 MySQL 服务器进行认证。从 MySQL 8.0.35 开始,此认证方法已被弃用,并可能在未来的 MySQL 版本中被移除。为了获得类似的功能,请考虑升级到 MySQL 8.2(或更高版本),用户可以使用 WebAuthn 认证 对 MySQL 服务器进行认证。在进行升级之前,您需要了解 MySQL 创新和长期支持(LTS)版本的发布模型。有关更多信息,请参见 Section 3.2, “升级路径”。
FIDO 代表快速身份在线,提供了不需要使用密码的认证标准。
FIDO 可插拔认证提供以下功能:
- FIDO 可以使用智能卡、安全密钥和生物识别读卡器等设备对 MySQL 服务器进行认证。
- 因为认证可以通过除提供密码外的其他方式进行,所以 FIDO 实现了无密码认证。
- 另一方面,设备认证通常与密码认证一起使用,因此 FIDO 认证可用于使用多因素认证的 MySQL 帐户;参见 Section 8.2.18, “多因素认证”。
以下表格显示了插件和库文件的名称。文件名后缀可能因系统而异。Unix 和类 Unix 系统通常使用 .so
,Windows 系统使用 .dll
。文件必须位于由 plugin_dir
系统变量指定的目录中。有关安装信息,请参见 安装 FIDO 可插拔认证。
表 8.27 FIDO 认证的插件和库名称
插件或文件 | 插件或文件名 |
---|---|
服务器端插件 | authentication_fido |
客户端插件 | authentication_fido_client |
库文件 | authentication_fido.so,authentication_fido_client.so |
注意
在使用服务器端或客户端 FIDO 认证插件的系统上必须可用 libfido2
库。如果主机上有多个 FIDO 设备,则 libfido2
库决定用于注册和认证的设备。libfido2
库不提供设备选择功能。
服务器端的 FIDO 身份验证插件仅包含在 MySQL 企业版中。它不包含在 MySQL 社区发行版中。客户端插件包含在所有发行版中,包括社区发行版,这使得来自任何发行版的客户端都可以连接到加载了服务器端插件的服务器。
以下各节提供了特定于 FIDO 可插拔认证的安装和使用信息:
- 安装 FIDO 可插拔认证
- 使用 FIDO 认证
- FIDO 免密码认证
- FIDO 设备注销
- MySQL 用户 FIDO 认证的工作原理
有关 MySQL 中可插拔认证的一般信息,请参见第 8.2.17 节,“可插拔认证”。
安装 FIDO 可插拔认证
本节描述了如何安装服务器端的 FIDO 身份验证插件。有关安装插件的一般信息,请参见第 7.6.1 节,“安装和卸载插件”。
要使服务器可用,插件库文件必须位于 MySQL 插件目录中(由plugin_dir
系统变量命名的目录)。如果需要,通过在服务器启动时设置plugin_dir
的值来配置插件目录位置。
服务器端插件库文件基本名称为authentication_fido
。文件名后缀因平台而异(例如,对于 Unix 和类 Unix 系统,为.so
,对于 Windows 为.dll
)。
要在服务器启动时加载插件,请使用--plugin-load-add
选项命名包含插件的库文件。使用此插件加载方法,选项必须在每次服务器启动时给出。
要加载插件,请在您的my.cnf
文件中添加类似以下行,根据需要调整.so
后缀以适应您的平台:
[mysqld]
plugin-load-add=authentication_fido.so
修改my.cnf
后,重新启动服务器以使新设置生效。
或者,要在运行时加载插件,请使用此语句,根据需要调整.so
后缀以适应您的平台:
INSTALL PLUGIN authentication_fido
SONAME 'authentication_fido.so';
INSTALL PLUGIN
立即加载插件,并在mysql.plugins
系统表中注册它,以使服务器在每次后续正常启动时加载它,而无需--plugin-load-add
。
要验证插件安装,请检查信息模式PLUGINS
表,或使用SHOW PLUGINS
语句(参见 Section 7.6.2,“获取服务器插件信息”)。例如:
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
FROM INFORMATION_SCHEMA.PLUGINS
WHERE PLUGIN_NAME = 'authentication_fido';
--------------------- ---------------
| PLUGIN_NAME | PLUGIN_STATUS |
--------------------- ---------------
| authentication_fido | ACTIVE |
--------------------- ---------------
如果插件初始化失败,请检查服务器错误日志以获取诊断消息。
要将 MySQL 帐户与 FIDO 认证插件关联,请参见使用 FIDO 认证。
使用 FIDO 认证
FIDO 认证通常用于多因素认证的背景下(参见 Section 8.2.18,“多因素认证”)。本节展示了如何将基于 FIDO 设备的认证纳入多因素帐户中,使用authentication_fido
插件。
在以下讨论中假定服务器正在运行,并启用了服务器端 FIDO 认证插件,如安装 FIDO 可插拔认证中所述,并且客户端 FIDO 插件在客户端主机的插件目录中可用。
注意
在 Windows 上,只有当客户端进程以具有管理员权限的用户身份运行时,FIDO 认证才能正常工作。
还假定 FIDO 认证与非 FIDO 认证一起使用(这意味着 2FA 或 3FA 帐户)。FIDO 也可以单独使用,创建以无密码方式进行身份验证的 1FA 帐户。在这种情况下,设置过程略有不同。有关说明,请参见 FIDO 无密码认证。
配置为使用authentication_fido
插件的帐户与 FIDO 设备关联。因此,在进行 FIDO 认证之前需要进行一次设备注册步骤。设备注册过程具有以下特点:
- 与帐户关联的任何 FIDO 设备必须在使用帐户之前注册。
- 注册要求客户端主机上有一个 FIDO 设备,否则注册将失败。
- 用户在注册过程中收到提示时,应执行适当的 FIDO 设备操作(例如,触摸设备或进行生物识别扫描)。
- 要执行设备注册,客户端用户必须调用mysql客户端程序或 MySQL Shell,并指定
--fido-register-factor
选项以指定正在注册设备的因素或因素。例如,如果帐户设置为将 FIDO 用作第二身份验证因素,则用户使用--fido-register-factor=2
选项调用mysql。 - 如果用户帐户配置为将
authentication_fido
插件设置为第二或第三因素,则在注册步骤可以继续之前,所有前面因素的身份验证必须成功。 - 服务器根据用户帐户中的信息知道 FIDO 设备是否需要注册或已经注册。当客户端程序连接时,如果设备必须注册,服务器会将客户端会话置于沙盒模式,以便在执行其他操作之前必须进行注册。用于 FIDO 设备注册的沙盒模式类似于处理过期密码的模式。请参阅第 8.2.16 节,“服务器处理过期密码”。
- 在沙盒模式下,除了
ALTER USER
语句之外,不允许使用其他语句。注册是通过此语句的形式执行的。当使用--fido-register-factor
选项调用时,mysql客户端会生成执行注册所需的ALTER USER
语句。注册完成后,服务器会将会话从沙盒模式切换出来,客户端可以正常进行操作。有关生成的ALTER USER
语句的信息,请参考--fido-register-factor
的描述。 - 当为帐户执行设备注册后,服务器会更新该帐户的
mysql.user
系统表行,以更新设备注册状态并存储公钥和凭证 ID。 - 只能由帐户指定的用户执行注册步骤。如果一个用户尝试为另一个用户执行注册,则会出现错误。
- 用户在注册和身份验证过程中应使用相同的 FIDO 设备。如果在客户端主机上注册了 FIDO 设备后,重置设备或插入不同设备,则身份验证将失败。在这种情况下,必须取消与帐户关联的设备注册,并重新进行注册。
假设您希望一个账户首先使用 caching_sha2_password
插件进行认证,然后再使用 authentication_fido
插件进行认证。可以使用类似以下语句创建多因素账户:
CREATE USER 'u2'@'localhost'
IDENTIFIED WITH caching_sha2_password
BY '*sha2_password*'
AND IDENTIFIED WITH authentication_fido;
要连接,提供因素 1 密码以满足该因素的认证,并将 --fido-register-factor
设置为因素 2 以启动 FIDO 设备的注册。
$> mysql --user=u2 --password1 --fido-register-factor=2
Enter password: *(enter factor 1 password)*
一旦因素 1 密码被接受,客户端会进入沙盒模式,以便为因素 2 进行设备注册。在注册过程中,您将被提示执行适当的 FIDO 设备操作,例如触摸设备或进行生物识别扫描。
当注册过程完成时,连接到服务器是允许的。
注意
在注册后,无论账户的认证链中是否存在额外的认证因素,连接到服务器都是允许的。例如,如果前面的示例中的账户定义了第三个认证因素(使用非 FIDO 认证),则在成功注册后连接将被允许,而无需对第三个因素进行认证。然而,后续的连接将需要对所有三个因素进行认证。
FIDO 无密码认证
本节描述了如何单独使用 FIDO 创建支持无密码认证的 1FA 账户。在这种情况下,“无密码”意味着认证会发生,但使用的是除密码之外的方法,例如安全密钥或生物识别扫描。这并不是指使用密码为空的基于密码的认证插件的账户。那种“无密码”是完全不安全的,不建议使用。
使用 authentication_fido
插件实现无密码认证时,需要满足以下先决条件:
创建无密码认证账户的用户需要PASSWORDLESS_USER_ADMIN
权限,以及CREATE USER
权限。
authentication_policy
值的第一个元素必须是星号(*
),而不是插件名称。例如,默认的 authentication_policy
值支持启用无密码认证,因为第一个元素是星号:
authentication_policy='*,,'
有关配置 authentication_policy
值的信息,请参阅配置多因素认证策略。
要将authentication_fido
用作免密码认证方法,必须将帐户创建为将authentication_fido
作为第一因素认证方法。还必须为第一因素指定INITIAL AUTHENTICATION IDENTIFIED BY
子句(不支持第 2 或第 3 因素)。此子句指定 FIDO 设备注册时将使用随机生成的还是用户指定的密码。设备注册后,服务器会删除密码并修改帐户,使authentication_fido
成为唯一的认证方法(1FA 方法)。
所需的CREATE USER
语法如下:
CREATE USER *user*
IDENTIFIED WITH authentication_fido
INITIAL AUTHENTICATION IDENTIFIED BY {RANDOM PASSWORD | '*auth_string*'};
以下示例使用RANDOM PASSWORD
语法:
mysql> CREATE USER 'u1'@'localhost'
IDENTIFIED WITH authentication_fido
INITIAL AUTHENTICATION IDENTIFIED BY RANDOM PASSWORD;
------ ----------- ---------------------- -------------
| user | host | generated password | auth_factor |
------ ----------- ---------------------- -------------
| u1 | localhost | 9XHK]M{l2rnD;VXyHzeF | 1 |
------ ----------- ---------------------- -------------
要执行注册,用户必须使用与INITIAL AUTHENTICATION IDENTIFIED BY
子句关联的密码对服务器进行身份验证,可以是随机生成的密码,也可以是'*
auth_string*'
值。如果帐户是刚刚创建的,用户执行此命令并在提示处粘贴先前生成的随机密码(9XHK]M{l2rnD;VXyHzeF
):
$> mysql --user=u1 --password --fido-register-factor=2
Enter password:
选项--fido-register-factor=2
用于表示INITIAL AUTHENTICATION IDENTIFIED BY
子句当前充当第一因素认证方法。因此,用户必须使用第二因素提供临时密码。成功注册后,服务器将删除临时密码并修改mysql.user
系统表中的帐户条目,将authentication_fido
列为唯一(1FA)认证方法。
创建无密码认证帐户时,重要的是在CREATE USER
语句中包含INITIAL AUTHENTICATION IDENTIFIED BY
子句。服务器将接受没有子句的语句,但由于没有办法连接到服务器注册设备,因此生成的帐户无法使用。假设您执行了这样的语句:
CREATE USER 'u2'@'localhost'
IDENTIFIED WITH authentication_fido;
后续尝试使用帐户连接将失败,如下所示:
代码语言:javascript复制$> mysql --user=u2 --skip-password
Failed to open FIDO device.
ERROR 1 (HY000): Unknown MySQL error
注意
使用通用第二因素(U2F)协议实现无密码认证,该协议不支持设置要注册的设备的 PIN 等其他安全措施。因此,设备持有者有责任确保设备以安全方式处理。
FIDO 设备注销
可以注销与 MySQL 帐户关联的 FIDO 设备。在多种情况下,这可能是可取或必要的:
- 要用不同设备替换 FIDO 设备。必须注销先前的设备并注册新设备。
在这种情况下,帐户所有者或任何具有
CREATE USER
权限的用户都可以注销设备。帐户所有者可以注册新设备。 - FIDO 设备被重置或丢失。直到当前设备被注销并执行新的注册为止,认证尝试将失败。
在这种情况下,由于账户所有者无法进行身份验证,因此无法注销当前设备,必须联系 DBA(或任何具有
CREATE USER
权限的用户)来执行此操作。然后账户所有者可以重新注册重置的设备或注册新设备。
注销 FIDO 设备可以由账户所有者或任何具有CREATE USER
权限的用户执行。使用以下语法:
ALTER USER *user* {2 | 3} FACTOR UNREGISTER;
要重新注册设备或执行新的注册,请参考使用 FIDO 认证 中的说明。
FIDO 认证 MySQL 用户的工作原理
本节概述了 MySQL 和 FIDO 如何共同工作以对 MySQL 用户进行认证。有关如何设置 MySQL 账户以使用 FIDO 认证插件的示例,请参见使用 FIDO 认证。
使用 FIDO 认证的账户必须在连接到服务器之前执行初始设备注册步骤。设备注册后,认证可以继续进行。FIDO 设备注册过程如下:
- 服务器向客户端发送随机挑战、用户 ID 和依赖方 ID(唯一标识服务器),依赖方 ID 由
authentication_fido_rp_id
系统变量定义。默认值为MySQL
。 - 客户端接收该信息并将其发送给客户端 FIDO 认证插件,后者再将其提供给 FIDO 设备。
- 用户执行适当的设备操作(例如,触摸设备或进行生物识别扫描)后,FIDO 设备生成公钥/私钥对、密钥句柄、X.509 证书和签名,然后返回给服务器。
- 服务器端 FIDO 认证插件验证签名。验证成功后,服务器将凭证 ID 和公钥存储在
mysql.user
系统表中。
注册成功后,FIDO 认证遵循以下流程:
- 服务器向客户端发送随机挑战、用户 ID、依赖方 ID 和凭证。
- 客户端将相同的信息发送给 FIDO 设备。
- FIDO 设备提示用户执行适当的设备操作,根据注册时所做的选择。
- 此操作解锁私钥并签署挑战。
- 签署的挑战返回给服务器。
- 服务器端 FIDO 认证插件使用公钥验证签名,并响应以指示认证成功或失败。
原文:
dev.mysql.com/doc/refman/8.0/en/test-pluggable-authentication.html
8.4.1.12 测试可插拔认证
MySQL 包含一个测试插件,用于检查帐户凭据并将成功或失败记录到服务器错误日志中。这是一个可加载的插件(非内置),必须在使用之前安装。
测试插件源代码与服务器源代码分开,不同于内置的本机插件,因此可以作为一个相对简单的示例来演示如何编写可加载的认证插件。
注意
此插件旨在用于测试和开发目的,不适用于生产环境或暴露在公共网络上的服务器。
以下表格显示了插件和库文件的名称。文件名后缀可能在您的系统上有所不同。文件必须位于由plugin_dir
系统变量命名的目录中。
表 8.28 测试认证的插件和库名称
插件或文件 | 插件或文件名 |
---|---|
服务器端插件 | test_plugin_server |
客户端插件 | auth_test_plugin |
库文件 | auth_test_plugin.so |
以下各节提供了特定于测试可插拔认证的安装和使用信息:
- 安装测试可插拔认证
- 卸载测试可插拔认证
- 使用测试可插拔认证
有关 MySQL 中可插拔认证的一般信息,请参见第 8.2.17 节,“可插拔认证”。
安装测试可插拔认证
本节描述了如何安装服务器端测试认证插件。有关安装插件的一般信息,请参见第 7.6.1 节,“安装和卸载插件”。
要被服务器使用,插件库文件必须位于 MySQL 插件目录中(由plugin_dir
系统变量命名的目录)。如有必要,在服务器启动时通过设置plugin_dir
的值来配置插件目录位置。
要在服务器启动时加载插件,请使用--plugin-load-add
选项命名包含插件的库文件。使用此插件加载方法,每次服务器启动时都必须提供该选项。例如,将这些行放入服务器的my.cnf
文件中,根据需要调整.so
后缀以适应您的平台:
[mysqld]
plugin-load-add=auth_test_plugin.so
修改my.cnf
后,重新启动服务器以使新设置生效。
或者,要在运行时加载插件,请使用此语句,根据需要调整.so
后缀以适应您的平台:
INSTALL PLUGIN test_plugin_server SONAME 'auth_test_plugin.so';
INSTALL PLUGIN
立即加载插件,并在mysql.plugins
系统表中注册它,以使服务器在每次后续正常启动时加载它,而无需--plugin-load-add
。
要验证插件安装,请检查 Information Schema PLUGINS
表或使用SHOW PLUGINS
语句(参见 Section 7.6.2, “Obtaining Server Plugin Information”)。例如:
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
FROM INFORMATION_SCHEMA.PLUGINS
WHERE PLUGIN_NAME LIKE '%test_plugin%';
-------------------- ---------------
| PLUGIN_NAME | PLUGIN_STATUS |
-------------------- ---------------
| test_plugin_server | ACTIVE |
-------------------- ---------------
如果插件初始化失败,请检查服务器错误日志以获取诊断消息。
要将 MySQL 帐户与测试插件关联,请参阅 Using Test Pluggable Authentication。
卸载测试可插拔认证
用于卸载测试认证插件的方法取决于您安装它的方式:
如果您在服务器启动时使用--plugin-load-add
选项安装了插件,请在不带该选项的情况下重新启动服务器。
如果您使用INSTALL PLUGIN
语句在运行时安装插件,则它将在服务器重新启动时保持安装状态。要卸载它,请使用UNINSTALL PLUGIN
:
UNINSTALL PLUGIN test_plugin_server;
使用测试可插拔认证
要使用测试认证插件,请创建一个帐户并在IDENTIFIED WITH
子句中命名该插件:
CREATE USER 'testuser'@'localhost'
IDENTIFIED WITH test_plugin_server
BY '*testpassword*';
测试认证插件还需要创建代理用户,如下所示:
代码语言:javascript复制CREATE USER testpassword@localhost;
GRANT PROXY ON testpassword@localhost TO testuser@localhost;
然后在连接到服务器时为该帐户提供--user
和--password
选项。例如:
$> mysql --user=testuser --password
Enter password: *testpassword*
该插件从客户端接收的密码并将其与存储在mysql.user
系统表中帐户行的authentication_string
列中的值进行比较。如果两个值匹配,插件将authentication_string
值作为新的有效用户 ID 返回。
你可以查看服务器错误日志,查看是否有关于身份验证成功的消息(注意密码被报告为“user”):
代码语言:javascript复制[Note] Plugin test_plugin_server reported:
'successfully authenticated user *testpassword*'
原文:
dev.mysql.com/doc/refman/8.0/en/pluggable-authentication-system-variables.html
8.4.1.13 可插拔认证系统变量
除非安装了适当的服务器端插件,否则这些变量不可用:
-
authentication_ldap_sasl
用于形式为authentication_ldap_sasl_*
xxx*
的系统变量 -
authentication_ldap_simple
用于形式为authentication_ldap_simple_*
xxx*
的系统变量
表 8.29 认证插件系统变量摘要
名称 | 命令行 | 选项文件 | 系统变量 | 状态变量 | 变量范围 | 动态 |
---|---|---|---|---|---|---|
authentication_fido_rp_id | 是 | 是 | 是 | 全局 | 是 | |
authentication_kerberos_service_key_tab | 是 | 是 | 是 | 全局 | 否 | |
authentication_kerberos_service_principal | 是 | 是 | 是 | 全局 | 是 | |
authentication_ldap_sasl_auth_method_name | 是 | 是 | 是 | 全局 | 是 | |
authentication_ldap_sasl_bind_base_dn | 是 | 是 | 是 | 全局 | 是 | |
authentication_ldap_sasl_bind_root_dn | 是 | 是 | 是 | 全局 | 是 | |
authentication_ldap_sasl_bind_root_pwd | 是 | 是 | 是 | 全局 | 是 | |
authentication_ldap_sasl_ca_path | 是 | 是 | 是 | 全局 | 是 | |
authentication_ldap_sasl_group_search_attr | 是 | 是 | 是 | 全局 | 是 | |
authentication_ldap_sasl_group_search_filter | 是 | 是 | 是 | 全局 | 是 | |
authentication_ldap_sasl_init_pool_size | 是 | 是 | 是 | 全局 | 是 | |
authentication_ldap_sasl_log_status | 是 | 是 | 是 | 全局 | 是 | |
authentication_ldap_sasl_max_pool_size | 是 | 是 | 是 | 全局 | 是 | |
authentication_ldap_sasl_referral | 是 | 是 | 是 | 全局 | 是 | |
authentication_ldap_sasl_server_host | 是 | 是 | 是 | 全局 | 是 | |
authentication_ldap_sasl_server_port | 是 | 是 | 是 | 全局 | 是 | |
authentication_ldap_sasl_tls | 是 | 是 | 是 | 全局 | 是 | |
authentication_ldap_sasl_user_search_attr | 是 | 是 | 是 | 全局 | 是 | |
authentication_ldap_simple_auth_method_name | 是 | 是 | 是 | 全局 | 是 | |
authentication_ldap_simple_bind_base_dn | 是 | 是 | 是 | 全局 | 是 | |
authentication_ldap_simple_bind_root_dn | 是 | 是 | 是 | 全局 | 是 | |
authentication_ldap_simple_bind_root_pwd | 是 | 是 | 是 | 全局 | 是 | |
authentication_ldap_simple_ca_path | 是 | 是 | 是 | 全局 | 是 | |
authentication_ldap_simple_group_search_attr | 是 | 是 | 是 | 全局 | 是 | |
authentication_ldap_simple_group_search_filter | 是 | 是 | 是 | 全局 | 是 | |
authentication_ldap_simple_init_pool_size | 是 | 是 | 是 | 全局 | 是 | |
authentication_ldap_simple_log_status | 是 | 是 | 是 | 全局 | 是 | |
authentication_ldap_simple_max_pool_size | 是 | 是 | 是 | 全局 | 是 | |
authentication_ldap_simple_referral | 是 | 是 | 是 | 全局 | 是 | |
authentication_ldap_simple_server_host | 是 | 是 | 是 | 全局 | 是 | |
authentication_ldap_simple_server_port | 是 | 是 | 是 | 全局 | 是 | |
authentication_ldap_simple_tls | 是 | 是 | 是 | 全局 | 是 | |
authentication_ldap_simple_user_search_attr | 是 | 是 | 是 | 全局 | 是 | |
authentication_policy | 是 | 是 | 是 | 全局 | 是 | |
authentication_windows_log_level | 是 | 是 | 是 | 全局 | 否 | |
authentication_windows_use_principal_name | 是 | 是 | 是 | 全局 | 否 | |
名称 | 命令行 | 选项文件 | 系统变量 | 状态变量 | 变量范围 | 动态 |
authentication_fido_rp_id
命令行格式 | --authentication-fido-rp-id=value |
---|---|
引入版本 | 8.0.27 |
弃用 | 8.0.35 |
系统变量 | authentication_fido_rp_id |
范围 | 全局 |
动态 | 是 |
SET_VAR Hint Applies | 否 |
类型 | 字符串 |
默认值 | MySQL |
此变量指定用于 FIDO 设备注册和 FIDO 认证的依赖方 ID。如果尝试进行 FIDO 认证且此值与 FIDO 设备预期的值不符,则设备会认为自己未与正确的服务器通信,从而导致错误。最大值长度为 255 个字符。
注意
截至 MySQL 8.0.35 版本,此插件变量已被弃用,并可能在未来的 MySQL 版本中移除。
authentication_kerberos_service_key_tab
命令行格式 | --authentication-kerberos-service-key-tab=file_name |
---|---|
引入版本 | 8.0.26 |
系统变量 | authentication_kerberos_service_key_tab |
范围 | 全局 |
动态 | 否 |
SET_VAR Hint Applies | 否 |
类型 | 文件名 |
默认值 | datadir/mysql.keytab |
包含用于认证从客户端接收的 MySQL 服务票据的 Kerberos 服务密钥的服务器端密钥表(“keytab”)文件的名称。文件名应给出为绝对路径名。如果未设置此变量,则默认值为数据目录中的 mysql.keytab
。
文件必须存在并包含服务主体名称(SPN)的有效密钥,否则客户端的身份验证将失败。 (SPN 和相同密钥也必须在 Kerberos 服务器中创建。) 该文件可能包含多个服务主体名称及其相应的密钥组合。
文件必须由 Kerberos 服务器管理员生成,并复制到 MySQL 服务器可访问的位置。 可以使用以下命令验证文件是否正确并已正确复制:
代码语言:javascript复制klist -k *file_name*
有关 keytab 文件的信息,请参阅 web.mit.edu/kerberos/krb5-latest/doc/basic/keytab_def.html
。
authentication_kerberos_service_principal
命令行格式 | --authentication-kerberos-service-principal=name |
---|---|
引入 | 8.0.26 |
系统变量 | authentication_kerberos_service_principal |
范围 | 全局 |
动态 | 是 |
SET_VAR 提示适用 | 否 |
类型 | 字符串 |
默认值 | mysql/host_name@realm_name |
MySQL 服务器发送给客户端的 Kerberos 服务主体名称(SPN)。
该值由服务名称(mysql
)、主机名和领域名组成。 默认值为 mysql/*
host_name*@*
realm_name*
。 服务主体名称中的领域使得可以检索到确切的服务密钥。
要使用非默认值,请使用相同格式设置该值。 例如,要使用主机名为 krbauth.example.com
和领域为 MYSQL.LOCAL
,请将 authentication_kerberos_service_principal
设置为 mysql/krbauth.example.com@MYSQL.LOCAL
。
服务主体名称和服务密钥必须已经存在于由 KDC 服务器管理的数据库中。
可能存在仅由领域名称不同的服务主体名称。
authentication_ldap_sasl_auth_method_name
命令行格式 | --authentication-ldap-sasl-auth-method-name=value |
---|---|
系统变量 | authentication_ldap_sasl_auth_method_name |
范围 | 全局 |
动态 | 是 |
SET_VAR 提示适用 | 否 |
类型 | 字符串 |
默认值 | SCRAM-SHA-1 |
有效值(≥ 8.0.23) | SCRAM-SHA-1``SCRAM-SHA-256``GSSAPI |
有效值(≥ 8.0.20, ≤ 8.0.22) | SCRAM-SHA-1``GSSAPI |
有效值(≤ 8.0.19) | SCRAM-SHA-1 |
对于 SASL LDAP 身份验证,这是身份验证方法的名称。身份验证插件与 LDAP 服务器之间的通信根据这种身份验证方法进行,以确保密码安全。
允许这些身份验证方法值:
-
SCRAM-SHA-1
:使用 SASL 挑战-响应机制。 客户端端的authentication_ldap_sasl_client
插件与 SASL 服务器通信,使用密码创建挑战并获取 SASL 请求缓冲区,然后将此缓冲区传递给服务器端的authentication_ldap_sasl
插件。客户端端和服务器端的 SASL LDAP 插件使用 SASL 消息来安全传输凭据,以避免在 MySQL 客户端和服务器之间发送明文密码。 -
SCRAM-SHA-256
:使用 SASL 挑战-响应机制。 这种方法类似于SCRAM-SHA-1
,但更安全。它在 MySQL 8.0.23 及更高版本中可用。它需要使用 Cyrus SASL 2.1.27 或更高版本构建的 OpenLDAP 服务器。 -
GSSAPI
:使用 Kerberos,一种无密码且基于票据的协议。 GSSAPI/Kerberos 是 MySQL 客户端和服务器仅在 Linux 上支持的身份验证方法。在 Linux 环境中,应用程序使用默认启用 Kerberos 的 Microsoft Active Directory 访问 LDAP 时,这是非常有用的。 客户端端的authentication_ldap_sasl_client
插件使用来自 Kerberos 的票据授予票据(TGT)获取服务票据,但不直接使用 LDAP 服务。服务器端的authentication_ldap_sasl
插件在客户端插件和 LDAP 服务器之间路由 Kerberos 消息。然后,服务器端插件使用获取的凭据与 LDAP 服务器通信,解释 LDAP 身份验证消息并检索 LDAP 组。
authentication_ldap_sasl_bind_base_dn
命令行格式 | --authentication-ldap-sasl-bind-base-dn=value |
---|---|
系统变量 | authentication_ldap_sasl_bind_base_dn |
范围 | 全局 |
动态 | 是 |
SET_VAR 提示适用 | 否 |
类型 | 字符串 |
默认值 | NULL |
对于 SASL LDAP 身份验证,基本区分名称(DN)。此变量可用于通过在搜索树中的特定位置(“基本”)锚定它们来限制搜索范围。
假设一组 LDAP 用户条目的成员具有以下形式:
代码语言:javascript复制uid=*user_name*,ou=People,dc=example,dc=com
另一组 LDAP 用户条目的成员具有以下形式:
代码语言:javascript复制uid=*user_name*,ou=Admin,dc=example,dc=com
然后根据不同的基本 DN 值进行搜索:
- 如果基本 DN 是
ou=People,dc=example,dc=com
:搜索仅在第一组中找到用户条目。 - 如果基本 DN 是
ou=Admin,dc=example,dc=com
:搜索仅在第二组中找到用户条目。 - 如果基本 DN 是
ou=dc=example,dc=com
:搜索会在第一组或第二组中找到用户条目。
一般来说,更具体的基本 DN 值会导致更快的搜索,因为它们限制了搜索范围。
authentication_ldap_sasl_bind_root_dn
命令行格式 | --authentication-ldap-sasl-bind-root-dn=value |
---|---|
系统变量 | authentication_ldap_sasl_bind_root_dn |
范围 | 全局 |
动态 | 是 |
SET_VAR 提示适用 | 否 |
类型 | 字符串 |
默认值 | NULL |
对于 SASL LDAP 认证,根区分名称(DN)。此变量与 authentication_ldap_sasl_bind_root_pwd
一起用作用于执行搜索的目的的 LDAP 服务器进行身份验证的凭据。身份验证使用一个或两个 LDAP 绑定操作,具体取决于 MySQL 帐户是否指定了 LDAP 用户 DN:
- 如果帐户没有指定用户 DN:
authentication_ldap_sasl
使用authentication_ldap_sasl_bind_root_dn
和authentication_ldap_sasl_bind_root_pwd
执行初始 LDAP 绑定。(这两个默认为空,所以如果它们没有设置,LDAP 服务器必须允许匿名连接。)生成的绑定 LDAP 句柄用于根据客户端用户名搜索用户 DN。authentication_ldap_sasl
使用用户 DN 和客户端提供的密码执行第二次绑定。 - 如果帐户没有指定用户 DN:在这种情况下,第一个绑定操作是不必要的。
authentication_ldap_sasl
使用用户 DN 和客户端提供的密码执行单个绑定。这比如果 MySQL 帐户没有指定 LDAP 用户 DN 要快。
authentication_ldap_sasl_bind_root_pwd
命令行格式 | --authentication-ldap-sasl-bind-root-pwd=value |
---|---|
系统变量 | authentication_ldap_sasl_bind_root_pwd |
范围 | 全局 |
动态 | 是 |
SET_VAR 提示适用 | 否 |
类型 | 字符串 |
默认值 | NULL |
对于 SASL LDAP 认证,根分隔名的密码。此变量与authentication_ldap_sasl_bind_root_dn
一起使用。请参阅该变量的描述。
authentication_ldap_sasl_ca_path
命令行格式 | --authentication-ldap-sasl-ca-path=value |
---|---|
系统变量 | authentication_ldap_sasl_ca_path |
作用范围 | 全局 |
动态 | 是 |
SET_VAR提示适用 | 否 |
类型 | 字符串 |
默认值 | NULL |
对于 SASL LDAP 认证,证书颁发机构文件的绝对路径。如果希望认证插件执行 LDAP 服务器证书的验证,则指定此文件。
注意
除了将authentication_ldap_sasl_ca_path
变量设置为文件名外,还必须将适当的证书颁发机构证书添加到文件中,并启用authentication_ldap_sasl_tls
系统变量。这些变量可以设置以覆盖默认的 OpenLDAP TLS 配置;请参阅 LDAP Pluggable Authentication and ldap.conf
authentication_ldap_sasl_group_search_attr
命令行格式 | --authentication-ldap-sasl-group-search-attr=value |
---|---|
系统变量 | authentication_ldap_sasl_group_search_attr |
作用范围 | 全局 |
动态 | 是 |
SET_VAR提示适用 | 否 |
类型 | 字符串 |
默认值 | cn |
对于 SASL LDAP 认证,指定 LDAP 目录条目中指定组名的属性名称。如果authentication_ldap_sasl_group_search_attr
具有默认值cn
,则搜索将返回cn
值作为组名。例如,如果具有uid
值为user1
的 LDAP 条目具有cn
属性为mygroup
,则搜索user1
将返回mygroup
作为组名。
如果您不想进行组或代理认证,则此变量应为空字符串。
如果组搜索属性是isMemberOf
,LDAP 认证直接检索用户属性isMemberOf
的值,并将其分配为组信息。如果组搜索属性不是isMemberOf
,LDAP 认证将搜索用户是成员的所有组。(后者是默认行为。)此行为基于 LDAP 组信息可以以两种方式存储:1)组条目可以具有名为memberUid
或member
的属性,其值为用户名;2)用户条目可以具有名为isMemberOf
的属性,其值为组名。
authentication_ldap_sasl_group_search_filter
命令行格式 | --authentication-ldap-sasl-group-search-filter=value |
---|---|
系统变量 | authentication_ldap_sasl_group_search_filter |
范围 | 全局 |
动态 | 是 |
SET_VAR 提示适用 | 否 |
类型 | 字符串 |
默认值 | (|(&(objectClass=posixGroup)(memberUid=%s))(&(objectClass=group)(member=%s))) |
对于 SASL LDAP 认证,自定义组搜索过滤器。
搜索过滤器值可以包含{UA}
和{UD}
符号,分别表示用户名和完整用户 DN。例如,{UA}
会被替换为用户名,比如"admin"
,而{UD}
会被替换为完整 DN,比如"uid=admin,ou=People,dc=example,dc=com"
。以下是默认值,支持 OpenLDAP 和 Active Directory:
(|(&(objectClass=posixGroup)(memberUid={UA}))
(&(objectClass=group)(member={UD})))
在某些情况下,对于用户场景,memberOf
是一个简单的用户属性,不包含任何组信息。为了增加灵活性,可以在组搜索属性前使用可选的{GA}
前缀。任何带有{GA}
前缀的组属性都被视为具有组名的用户属性。例如,对于值{GA}MemberOf
,如果组值是 DN,则从组 DN 中返回第一个属性值作为组名。
authentication_ldap_sasl_init_pool_size
命令行格式 | --authentication-ldap-sasl-init-pool-size=# |
---|---|
系统变量 | authentication_ldap_sasl_init_pool_size |
范围 | 全局 |
动态 | 是 |
SET_VAR 提示适用 | 否 |
类型 | 整数 |
默认值 | 10 |
最小值 | 0 |
最大值 | 32767 |
单位 | 连接 |
对于 SASL LDAP 认证,连接到 LDAP 服务器的连接池的初始大小。根据对 LDAP 服务器的平均并发认证请求数量选择此变量的值。
插件使用authentication_ldap_sasl_init_pool_size
和authentication_ldap_sasl_max_pool_size
一起进行连接池管理:
- 当认证插件初始化时,它会创建
authentication_ldap_sasl_init_pool_size
个连接,除非authentication_ldap_sasl_max_pool_size=0
以禁用连接池。 - 如果插件在当前连接池中没有空闲连接时收到认证请求,插件可以创建一个新连接,最多达到
authentication_ldap_sasl_max_pool_size
所指定的最大连接池大小。 - 如果插件在连接池已经达到最大值且没有空闲连接时收到请求,认证将失败。
- 当插件卸载时,它会关闭所有连接池中的连接。
对插件系统变量设置的更改可能不会对已经在池中的连接产生影响。例如,修改 LDAP 服务器主机、端口或 TLS 设置不会影响现有连接。但是,如果原始变量值无效且连接池无法初始化,则插件会尝试为下一个 LDAP 请求重新初始化池。在这种情况下,新的系统变量值将用于重新初始化尝试。
如果authentication_ldap_sasl_max_pool_size=0
以禁用连接池,插件打开的每个 LDAP 连接都使用那时系统变量的值。
authentication_ldap_sasl_log_status
命令行格式 | --authentication-ldap-sasl-log-status=# |
---|---|
系统变量 | authentication_ldap_sasl_log_status |
范围 | 全局 |
动态 | 是 |
SET_VAR提示适用 | 否 |
类型 | 整数 |
默认值 | 1 |
最小值 | 1 |
最大值(≥ 8.0.18) | 6 |
最大值(≤ 8.0.17) | 5 |
对于 SASL LDAP 认证,写入错误日志的消息的日志级别。以下表显示了允许的级别值及其含义。
表 8.30 authentication_ldap_sasl_log_status 的日志级别
选项值 | 记录的消息类型 |
---|---|
1 | 没有消息 |
2 | 错误消息 |
3 | 错误和警告消息 |
4 | 错误、警告和信息消息 |
5 | 与前一级别相同,加上来自 MySQL 的调试消息 |
6 | 与前一级别相同,加上来自 LDAP 库的调试消息 |
从 MySQL 8.0.18 开始提供日志级别 6。
在客户端端,可以通过设置AUTHENTICATION_LDAP_CLIENT_LOG
环境变量将消息记录到标准输出。允许的默认值与authentication_ldap_sasl_log_status
相同。
AUTHENTICATION_LDAP_CLIENT_LOG
环境变量仅适用于 SASL LDAP 认证。对于简单 LDAP 认证,它不起作用,因为在这种情况下,客户端插件是mysql_clear_password
,它对 LDAP 操作一无所知。
authentication_ldap_sasl_max_pool_size
命令行格式 | --authentication-ldap-sasl-max-pool-size=# |
---|---|
系统变量 | authentication_ldap_sasl_max_pool_size |
作用域 | 全局 |
动态 | 是 |
SET_VAR提示适用 | 否 |
类型 | 整数 |
默认值 | 1000 |
最小值 | 0 |
最大值 | 32767 |
单位 | 连接 |
对于 SASL LDAP 认证,连接到 LDAP 服务器的连接池的最大大小。要禁用连接池,请将此变量设置为 0。
此变量与authentication_ldap_sasl_init_pool_size
一起使用。请参阅该变量的描述。
authentication_ldap_sasl_referral
命令行格式 | --authentication-ldap-sasl-referral[={OFF|ON}] |
---|---|
引入版本 | 8.0.20 |
系统变量 | authentication_ldap_sasl_referral |
作用域 | 全局 |
动态 | 是 |
SET_VAR提示适用 | 否 |
类型 | 布尔值 |
默认值 | OFF |
对于 SASL LDAP 认证,是否启用 LDAP 搜索引荐。请参阅 LDAP 搜索引荐。
此变量可用于覆盖默认的 OpenLDAP 引荐配置;请参阅 LDAP 可插拔认证和 ldap.conf
authentication_ldap_sasl_server_host
命令行格式 | --authentication-ldap-sasl-server-host=host_name |
---|---|
系统变量 | authentication_ldap_sasl_server_host |
范围 | 全局 |
动态 | 是 |
SET_VAR提示适用 | 否 |
类型 | 字符串 |
对于 SASL LDAP 认证,LDAP 服务器主机。此变量的允许值取决于认证方法:
- 对于
authentication_ldap_sasl_auth_method_name=SCRAM-SHA-1
:LDAP 服务器主机可以是主机名或 IP 地址。 - 对于
authentication_ldap_sasl_auth_method_name=SCRAM-SHA-256
:LDAP 服务器主机可以是主机名或 IP 地址。
authentication_ldap_sasl_server_port
命令行格式 | --authentication-ldap-sasl-server-port=port_num |
---|---|
系统变量 | authentication_ldap_sasl_server_port |
范围 | 全局 |
动态 | 是 |
SET_VAR提示适用 | 否 |
类型 | 整数 |
默认值 | 389 |
最小值 | 1 |
最大值 | 32376 |
对于 SASL LDAP 认证,LDAP 服务器的 TCP/IP 端口号。
从 MySQL 8.0.14 开始,如果 LDAP 端口号配置为 636 或 3269,则插件将使用 LDAPS(SSL 上的 LDAP)而不是 LDAP。(LDAPS 与startTLS
不同。)
authentication_ldap_sasl_tls
命令行格式 | --authentication-ldap-sasl-tls[={OFF|ON}] |
---|---|
系统变量 | authentication_ldap_sasl_tls |
范围 | 全局 |
动态 | 是 |
SET_VAR提示适用 | 否 |
类型 | 布尔值 |
默认值 | OFF |
对于 SASL LDAP 认证,插件与 LDAP 服务器的连接是否安全。如果启用此变量,插件将使用 TLS 安全连接到 LDAP 服务器。此变量可用于覆盖默认的 OpenLDAP TLS 配置;请参阅 LDAP 可插拔认证和 ldap.conf。如果您启用此变量,可能还希望设置authentication_ldap_sasl_ca_path
变量。
MySQL LDAP 插件支持 StartTLS 方法,该方法在普通 LDAP 连接的顶部初始化 TLS。
截至 MySQL 8.0.14,可以通过设置authentication_ldap_sasl_server_port
系统变量来使用 LDAPS。
authentication_ldap_sasl_user_search_attr
命令行格式 | --authentication-ldap-sasl-user-search-attr=value |
---|---|
系统变量 | authentication_ldap_sasl_user_search_attr |
范围 | 全局 |
动态 | 是 |
SET_VAR提示适用 | 否 |
类型 | 字符串 |
默认值 | uid |
对于 SASL LDAP 身份验证,指定 LDAP 目录条目中的用户名的属性名称。如果未提供用户可分辨名称,身份验证插件将使用此属性搜索名称。例如,如果authentication_ldap_sasl_user_search_attr
的值为uid
,则搜索用户名称user1
会找到具有uid
值为user1
的条目。
authentication_ldap_simple_auth_method_name
命令行格式 | --authentication-ldap-simple-auth-method-name=value |
---|---|
系统变量 | authentication_ldap_simple_auth_method_name |
范围 | 全局 |
动态 | 是 |
SET_VAR提示适用 | 否 |
类型 | 字符串 |
默认值 | SIMPLE |
有效值 | SIMPLE``AD-FOREST |
对于简单的 LDAP 身份验证,身份验证方法名称。身份验证插件与 LDAP 服务器之间的通信根据此身份验证方法进行。
注意
对于所有简单的 LDAP 身份验证方法,建议还设置 TLS 参数,要求与 LDAP 服务器的通信必须通过安全连接进行。
允许使用这些身份验证方法值:
-
SIMPLE
: 使用简单的 LDAP 身份验证。该方法使用一个或两个 LDAP 绑定操作,具体取决于 MySQL 账户是否命名了 LDAP 用户的可分辨名称。请参阅authentication_ldap_simple_bind_root_dn
的描述。 -
AD-FOREST
: 一种基于SIMPLE
的变体,使得身份验证在 Active Directory forest 中搜索所有域,在每个 Active Directory 域上执行 LDAP 绑定,直到在某个域中找到用户。
authentication_ldap_simple_bind_base_dn
命令行格式 | --authentication-ldap-simple-bind-base-dn=value |
---|---|
系统变量 | authentication_ldap_simple_bind_base_dn |
范围 | 全局 |
动态 | 是 |
SET_VAR提示适用 | 否 |
类型 | 字符串 |
默认值 | NULL |
对于简单的 LDAP 身份验证,基本分明名称(DN)。此变量可用于通过在搜索树中的特定位置(“基本”)锚定它们来限制搜索范围。
假设一组 LDAP 用户条目的成员各自具有以下形式:
代码语言:javascript复制uid=*user_name*,ou=People,dc=example,dc=com
另一组 LDAP 用户条目的成员具有以下形式:
代码语言:javascript复制uid=*user_name*,ou=Admin,dc=example,dc=com
然后,不同基本 DN 值的搜索工作如下:
- 如果基本 DN 为
ou=People,dc=example,dc=com
:搜索仅在第一组中找到用户条目。 - 如果基本 DN 为
ou=Admin,dc=example,dc=com
:搜索仅在第二组中找到用户条目。 - 如果基本 DN 为
ou=dc=example,dc=com
:搜索在第一组或第二组中找到用户条目。
一般来说,更具体的基本 DN 值会导致更快的搜索,因为它们限制了搜索范围。
authentication_ldap_simple_bind_root_dn
命令行格式 | --authentication-ldap-simple-bind-root-dn=value |
---|---|
系统变量 | authentication_ldap_simple_bind_root_dn |
范围 | 全局 |
动态 | 是 |
SET_VAR提示适用 | 否 |
类型 | 字符串 |
默认值 | NULL |
对于简单的 LDAP 身份验证,根分明名称(DN)。此变量与authentication_ldap_simple_bind_root_pwd
一起用作验证到 LDAP 服务器以执行搜索的凭据。身份验证使用一个或两个 LDAP 绑定操作,具体取决于 MySQL 帐户是否命名为 LDAP 用户 DN:
- 如果帐户没有指定用户 DN:
authentication_ldap_simple
使用authentication_ldap_simple_bind_root_dn
和authentication_ldap_simple_bind_root_pwd
执行初始 LDAP 绑定。(这两个变量默认为空,因此如果它们未设置,则 LDAP 服务器必须允许匿名连接。)生成的绑定 LDAP 句柄用于根据客户端用户名搜索用户 DN。authentication_ldap_simple
使用用户 DN 和客户端提供的密码执行第二次绑定。 - 如果帐户没有指定用户 DN:在这种情况下,第一个绑定操作是不必要的。
authentication_ldap_simple
使用用户 DN 和客户端提供的密码执行单个绑定。这比如果 MySQL 帐户没有指定 LDAP 用户 DN 要快。
authentication_ldap_simple_bind_root_pwd
命令行格式 | --authentication-ldap-simple-bind-root-pwd=value |
---|---|
系统变量 | authentication_ldap_simple_bind_root_pwd |
作用域 | 全局 |
动态 | 是 |
SET_VAR 提示适用 | 否 |
类型 | 字符串 |
默认值 | NULL |
对于简单的 LDAP 身份验证,根分隔名称的密码。此变量与authentication_ldap_simple_bind_root_dn
一起使用。请参阅该变量的描述。
authentication_ldap_simple_ca_path
命令行格式 | --authentication-ldap-simple-ca-path=value |
---|---|
系统变量 | authentication_ldap_simple_ca_path |
作用域 | 全局 |
动态 | 是 |
SET_VAR 提示适用 | 否 |
类型 | 字符串 |
默认值 | NULL |
对于简单的 LDAP 身份验证,证书颁发机构文件的绝对路径。如果希望认证插件执行 LDAP 服务器证书的验证,请指定此文件。
注意
除了将authentication_ldap_simple_ca_path
变量设置为文件名之外,还必须将适当的证书颁发机构证书添加到文件中,并启用authentication_ldap_simple_tls
系统变量。这些变量可以设置以覆盖默认的 OpenLDAP TLS 配置;请参阅 LDAP Pluggable Authentication and ldap.conf
authentication_ldap_simple_group_search_attr
命令行格式 | --authentication-ldap-simple-group-search-attr=value |
---|---|
系统变量 | authentication_ldap_simple_group_search_attr |
范围 | 全局 |
动态 | 是 |
SET_VAR 提示适用 | 否 |
类型 | 字符串 |
默认值 | cn |
对于简单的 LDAP 认证,指定 LDAP 目录条目中组名的属性名称。如果authentication_ldap_simple_group_search_attr
具有其默认值cn
,搜索将返回cn
值作为组名。例如,如果具有uid
值为user1
的 LDAP 条目具有cn
属性为mygroup
,则搜索user1
将返回mygroup
作为组名。
如果组搜索属性是isMemberOf
,LDAP 认证直接检索用户属性isMemberOf
的值,并将其分配为组信息。如果组搜索属性不是isMemberOf
,LDAP 认证将搜索用户是成员的所有组。(后者是默认行为。)此行为基于 LDAP 组信息可以以两种方式存储的方式:1)组条目可以具有名为memberUid
或member
的属性,其值为用户名;2)用户条目可以具有名为isMemberOf
的属性,其值为组名。
authentication_ldap_simple_group_search_filter
命令行格式 | --authentication-ldap-simple-group-search-filter=value |
---|---|
系统变量 | authentication_ldap_simple_group_search_filter |
范围 | 全局 |
动态 | 是 |
SET_VAR 提示适用 | 否 |
类型 | 字符串 |
默认值 | (|(&(objectClass=posixGroup)(memberUid=%s))(&(objectClass=group)(member=%s))) |
对于简单的 LDAP 认证,自定义组搜索过滤器。
搜索过滤器值可以包含{UA}
和{UD}
符号,分别表示用户名和完整用户 DN。例如,{UA}
被替换为用户名,如"admin"
,而{UD}
被替换为完整 DN,如"uid=admin,ou=People,dc=example,dc=com"
。以下值是默认值,支持 OpenLDAP 和 Active Directory:
(|(&(objectClass=posixGroup)(memberUid={UA}))
(&(objectClass=group)(member={UD})))
在某些用户场景中,memberOf
是一个简单的用户属性,不包含任何组信息。为了增加灵活性,可以在组搜索属性中使用可选的{GA}
前缀。任何带有{GA}前缀的组属性都被视为具有组名的用户属性。例如,如果值为{GA}MemberOf
,如果组值是 DN,则从组 DN 中返回第一个属性值作为组名。
authentication_ldap_simple_init_pool_size
命令行格式 | --authentication-ldap-simple-init-pool-size=# |
---|---|
系统变量 | authentication_ldap_simple_init_pool_size |
作用域 | 全局 |
动态 | 是 |
SET_VAR提示适用 | 否 |
类型 | 整数 |
默认值 | 10 |
最小值 | 0 |
最大值 | 32767 |
单位 | 连接 |
对于简单的 LDAP 认证,连接到 LDAP 服务器的连接池的初始大小。根据对 LDAP 服务器的平均并发认证请求数量选择此变量的值。
插件同时使用authentication_ldap_simple_init_pool_size
和authentication_ldap_simple_max_pool_size
进行连接池管理:
- 当认证插件初始化时,它会创建
authentication_ldap_simple_init_pool_size
个连接,除非authentication_ldap_simple_max_pool_size=0
以禁用连接池。 - 如果插件在当前连接池中没有空闲连接时收到认证请求,则插件可以创建一个新连接,最多达到
authentication_ldap_simple_max_pool_size
给定的最大连接池大小。 - 如果插件在池大小已达到最大值且没有空闲连接时收到请求,则身份验证失败。
- 当插件卸载时,它会关闭所有连接池中的连接。
对插件系统变量设置的更改可能对已经在池中的连接没有影响。例如,修改 LDAP 服务器主机、端口或 TLS 设置不会影响现有连接。但是,如果原始变量值无效且连接池无法初始化,则插件会尝试为下一个 LDAP 请求重新初始化池。在这种情况下,新的系统变量值将用于重新初始化尝试。
如果authentication_ldap_simple_max_pool_size=0
以禁用连接池,则插件打开的每个 LDAP 连接都使用系统变量在那时的值。
authentication_ldap_simple_log_status
命令行格式 | --authentication-ldap-simple-log-status=# |
---|---|
系统变量 | authentication_ldap_simple_log_status |
作用范围 | 全局 |
动态 | 是 |
SET_VAR提示适用 | 否 |
类型 | 整数 |
默认值 | 1 |
最小值 | 1 |
最大值(≥ 8.0.18) | 6 |
最大值(≤ 8.0.17) | 5 |
对于简单的 LDAP 身份验证,写入错误日志的消息的日志级别。下表显示了允许的级别值及其含义。
表 8.31 authentication_ldap_simple_log_status 的日志级别
选项数值 | 记录的消息类型 |
---|---|
1 | 无消息 |
2 | 错误消息 |
3 | 错误和警告消息 |
4 | 错误、警告和信息消息 |
5 | 与前一级别相同,加上来自 MySQL 的调试消息 |
6 | 与前一级别相同,加上来自 LDAP 库的调试消息 |
MySQL 8.0.18 版本中提供日志级别 6。
authentication_ldap_simple_max_pool_size
命令行格式 | --authentication-ldap-simple-max-pool-size=# |
---|---|
系统变量 | authentication_ldap_simple_max_pool_size |
作用范围 | 全局 |
动态 | 是 |
SET_VAR提示适用 | 否 |
类型 | 整数 |
默认值 | 1000 |
最小值 | 0 |
最大值 | 32767 |
单位 | 连接数 |
对于简单的 LDAP 身份��证,连接到 LDAP 服务器的连接池的最大大小。要禁用连接池,请将此变量设置为 0。
此变量与 authentication_ldap_simple_init_pool_size
结合使用。请参阅该变量的描述。
authentication_ldap_simple_referral
命令行格式 | --authentication-ldap-simple-referral[={OFF|ON}] |
---|---|
引入版本 | 8.0.20 |
系统变量 | authentication_ldap_simple_referral |
范围 | 全局 |
动态 | 是 |
SET_VAR 提示适用 | 否 |
类型 | 布尔值 |
默认值 | OFF |
对于简单的 LDAP 认证,是否启用 LDAP 搜索引荐。请参阅 LDAP 搜索引荐。
authentication_ldap_simple_server_host
命令行格式 | --authentication-ldap-simple-server-host=host_name |
---|---|
系统变量 | authentication_ldap_simple_server_host |
范围 | 全局 |
动态 | 是 |
SET_VAR 提示适用 | 否 |
类型 | 字符串 |
对于简单的 LDAP 认证,LDAP 服务器主机。此变量的允许值取决于认证方法:
对于 authentication_ldap_simple_auth_method_name=SIMPLE
: LDAP 服务器主机可以是主机名或 IP 地址。
对于 authentication_ldap_simple_auth_method_name=AD-FOREST
。LDAP 服务器主机可以是 Active Directory 域名。例如,对于 LDAP 服务器 URL 为 ldap://example.mem.local:389
,域名可以是 mem.local
。
Active Directory 森林设置可以拥有多个域(LDAP 服务器 IP),可以使用 DNS 发现。在 Unix 和类 Unix 系统上,可能需要进行一些额外的设置来配置您的 DNS 服务器,使用指定 Active Directory 域的 LDAP 服务器的 SRV 记录。有关 DNS SRV 的信息,请参阅 RFC 2782。
假设您的配置具有以下属性:
- 提供有关 Active Directory 域信息的名称服务器的 IP 地址为
10.172.166.100
。 - LDAP 服务器的名称为
ldap1.mem.local
到ldap3.mem.local
,IP 地址为10.172.166.101
到10.172.166.103
。
希望能够通过 SRV 搜索发现 LDAP 服务器。例如,在命令行中,类似这样的命令应该列出 LDAP 服务器:
代码语言:javascript复制host -t SRV _ldap._tcp.mem.local
执行以下 DNS 配置:
添加一行到 /etc/resolv.conf
,指定提供有关 Active Directory 域信息的名称服务器:
nameserver 10.172.166.100
针对 LDAP 服务器配置适当的区域文件,包含 LDAP 服务器的 SRV 记录:
代码语言:javascript复制_ldap._tcp.mem.local. 86400 IN SRV 0 100 389 ldap1.mem.local.
_ldap._tcp.mem.local. 86400 IN SRV 0 100 389 ldap2.mem.local.
_ldap._tcp.mem.local. 86400 IN SRV 0 100 389 ldap3.mem.local.
如果服务器主机无法解析,可能还需要在 /etc/hosts
中指定 LDAP 服务器的 IP 地址。例如,向文件中添加如下行:
10.172.166.101 ldap1.mem.local
10.172.166.102 ldap2.mem.local
10.172.166.103 ldap3.mem.local
配置 DNS 如刚才描述的那样,服务器端 LDAP 插件可以发现 LDAP 服务器,并在所有域中尝试进行身份验证,直到身份验证成功或没有更多服务器为止。
Windows 不需要像刚才描述的设置。给定 authentication_ldap_simple_server_host
值中的 LDAP 服务器主机,Windows LDAP 库会搜索所有域并尝试进行身份验证。
authentication_ldap_simple_server_port
命令行格式 | --authentication-ldap-simple-server-port=port_num |
---|---|
系统变量 | authentication_ldap_simple_server_port |
范围 | 全局 |
动态 | 是 |
SET_VAR Hint Applies | 否 |
类型 | 整数 |
默认值 | 389 |
最小值 | 1 |
最大值 | 32376 |
简单 LDAP 身份验证所需的 LDAP 服务器 TCP/IP 端口号。
从 MySQL 8.0.14 开始,如果 LDAP 端口号配置为 636 或 3269,则插件将使用 LDAPS(LDAP over SSL)而不是 LDAP。(LDAPS 与 startTLS
不同。)
authentication_ldap_simple_tls
命令行格式 | --authentication-ldap-simple-tls[={OFF|ON}] |
---|---|
系统变量 | authentication_ldap_simple_tls |
范围 | 全局 |
动态 | 是 |
SET_VAR Hint Applies | 否 |
类型 | 布尔值 |
默认值 | OFF |
对于简单的 LDAP 认证,插件与 LDAP 服务器的连接是否安全。如果启用此变量,插件将使用 TLS 安全连接到 LDAP 服务器。此变量可用于覆盖默认的 OpenLDAP TLS 配置;请参阅 LDAP 可插拔认证和 ldap.conf。如果启用此变量,您可能还希望设置 authentication_ldap_simple_ca_path
变量。
MySQL LDAP 插件支持 StartTLS 方法,该方法在普通 LDAP 连接的基础上初始化 TLS。
从 MySQL 8.0.14 开始,可以通过设置 authentication_ldap_simple_server_port
系统变量来使用 LDAPS。
authentication_ldap_simple_user_search_attr
命令行格式 | --authentication-ldap-simple-user-search-attr=value |
---|---|
系统变量 | authentication_ldap_simple_user_search_attr |
范围 | 全局 |
动态 | 是 |
SET_VAR 提示适用 | 否 |
类型 | 字符串 |
默认值 | uid |
对于简单的 LDAP 认证,指定 LDAP 目录条目中用户名称的属性名称。如果未提供用户的可分辨名称,认证插件将使用此属性搜索名称。例如,如果 authentication_ldap_simple_user_search_attr
的值为 uid
,则搜索用户名称 user1
将找到具有 uid
值为 user1
的条目。
8.4.2 连接控制插件
原文:
dev.mysql.com/doc/refman/8.0/en/connection-control.html
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
要在运行时设置并持久化变量,请使用以下语句:
代码语言:javascript复制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 密码验证组件
原文:
dev.mysql.com/doc/refman/8.0/en/validate-password.html
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
由于原始密码值不可用进行检查,指定为散列值的密码不会被检查:
代码语言:javascript复制mysql> ALTER USER 'jeffrey'@'localhost'
IDENTIFIED WITH mysql_native_password
AS '*0D3CED9BEC10A777AEC23CCC353A8C08A633045E';
Query OK, 0 rows affected (0.01 sec)
即使帐户最初被锁定,由于没有包含符合当前密码策略的密码,此帐户创建语句将失败:
代码语言:javascript复制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
8.4.3.2 密码验证选项和变量
本节描述了validate_password
提供的系统和状态变量,以便配置和监视其操作。
- 密码验证组件系统变量
- 密码验证组件状态变量
- 密码验证插件选项
- 密码验证插件系统变量
- 密码验证插件状态变量
密码验证组件系统变量
如果启用了validate_password
组件,则会公开几个系统变量,以便配置密码检查:
mysql> SHOW VARIABLES LIKE 'validate_password.%';
------------------------------------------------- --------
| Variable_name | Value |
------------------------------------------------- --------
| validate_password.changed_characters_percentage | 0 |
| validate_password.check_user_name | ON |
| validate_password.dictionary_file | |
| validate_password.length | 8 |
| validate_password.mixed_case_count | 1 |
| validate_password.number_count | 1 |
| validate_password.policy | MEDIUM |
| validate_password.special_char_count | 1 |
------------------------------------------------- --------
要更改密码检查的方式,您可以在服务器启动时或运行时设置这些系统变量。以下列表描述了每个变量的含义。
validate_password.changed_characters_percentage
命令行格式 | --validate-password.changed-characters-percentage[=value] |
---|---|
引入版本 | 8.0.34 |
系统变量 | validate_password.changed_characters_percentage |
范围 | 全局 |
动态 | 是 |
SET_VAR 提示适用 | 否 |
类型 | 整数 |
默认值 | 0 |
最小值 | 0 |
最大值 | 100 |
表示用户在更改现有密码时必须更改的密码中的字符数的最小数量,作为所有字符的百分比,以便validate_password
接受用户自己帐户的新密码。这仅适用于更改现有密码时,在设置用户帐户的初始密码时没有影响。
除非安装了validate_password
,否则此变量不可用。
默认情况下,validate_password.changed_characters_percentage
允许在新密码中重复使用当前密码中的所有字符。有效百分比范围为 0 到 100。如果设置为 100%,则拒绝使用当前密码中的所有字符,不考虑大小写。字符 ‘abc
’ 和 ‘ABC
’ 被视为相同字符。如果 validate_password
拒绝新密码,则会报告一个错误,指示必须有多少个字符不同。
如果 ALTER USER
语句未在 REPLACE
子句中提供现有密码,则不会强制执行此变量。是否需要 REPLACE
子句取决于密码验证策略适用于特定帐户。有关策略概述,请参阅 密码验证-必需策略。
validate_password.check_user_name
命令行格式 | --validate-password.check-user-name[={OFF|ON}] |
---|---|
系统变量 | validate_password.check_user_name |
作用范围 | 全局 |
动态 | 是 |
SET_VAR 提示适用 | 否 |
类型 | 布尔值 |
默认值 | ON |
validate_password
是否将密码与当前会话的有效用户帐户的用户名部分进行比较,并在匹配时拒绝密码。此变量仅在安装了 validate_password
时才可用。
默认情况下,validate_password.check_user_name
已启用。该变量控制用户名称匹配,与 validate_password.policy
的值无关。
当启用 validate_password.check_user_name
时,会产生以下影响:
- 检查发生在调用
validate_password
的所有上下文中,包括使用诸如ALTER USER
或SET PASSWORD
来更改当前用户密码的语句,以及调用诸如VALIDATE_PASSWORD_STRENGTH()
的函数。 - 用于比较的用户名取自当前会话的
USER()
和CURRENT_USER()
函数的值。一个含义是,具有足够权限设置另一个用户密码的用户可以将密码设置为该用户的名称,并且不能将该用户的密码设置为执行语句的用户的名称。例如,'root'@'localhost'
可以将'jeffrey'@'localhost'
的密码设置为'jeffrey'
,但不能将密码设置为'root
。 - 仅使用
USER()
和CURRENT_USER()
函数值的用户名部分,而不使用主机名部分。如果用户名为空,则不进行比较。 - 如果密码与用户名相同或其反转,则会发生匹配,密码将被拒绝。
- 用户名匹配区分大小写。密码和用户名值按字节逐字节比较为二进制字符串。
- 如果密码与用户名匹配,
VALIDATE_PASSWORD_STRENGTH()
返回 0,无论如何设置其他validate_password
系统变量。
validate_password.dictionary_file
命令行格式 | --validate-password.dictionary-file=file_name |
---|---|
系统变量 | validate_password.dictionary_file |
范围 | 全局 |
动态 | 是 |
SET_VAR 提示适用 | 否 |
类型 | 文件名 |
字典文件的路径名,validate_password
用于检查密码。除非安装了 validate_password
,否则此变量不可用。
默认情况下,此变量的值为空,不执行字典检查。要执行字典检查,变量值必须非空。如果文件命名为相对路径,则解释为相对于服务器数据目录。文件内容应为小写,每行一个单词。内容被视为具有字符集 utf8mb3
。允许的最大文件大小为 1MB。
为了在检查密码期间使用字典文件,密码策略必须设置为 2 (STRONG
);请参阅 validate_password.policy
系统变量的描述。假设是真的,密码的每个长度为 4 到 100 的子字符串将与字典文件中的单词进行比较。任何匹配都会导致密码被拒绝。比较不区分大小写。
对于VALIDATE_PASSWORD_STRENGTH()
,密码将根据所有策略进行检查,包括STRONG
,因此强度评估将包括字典检查,无论validate_password.policy
的值如何。
validate_password.dictionary_file
可以在运行时设置,分配一个值会导致读取命名文件而无需重新启动服务器。
validate_password.length
命令行格式 | --validate-password.length=# |
---|---|
系统��量 | validate_password.length |
范围 | 全局 |
动态 | 是 |
SET_VAR提示适用 | 否 |
类型 | 整数 |
默认值 | 8 |
最小值 | 0 |
validate_password
要求密码中包含的最小字符数。除非安装了validate_password
,否则此变量不可用。
validate_password.length
的最小值是几个其他相关系统变量的函数。该值不能设置为小于以下表达式的值:
validate_password.number_count
validate_password.special_char_count
(2 * validate_password.mixed_case_count)
如果validate_password
由于前面的约束调整了validate_password.length
的值,则会将消息写入错误日志。
validate_password.mixed_case_count
命令行格式 | --validate-password.mixed-case-count=# |
---|---|
系统变量 | validate_password.mixed_case_count |
范围 | 全局 |
动态 | 是 |
SET_VAR提示适用 | 否 |
类型 | 整数 |
默认值 | 1 |
最小值 | 0 |
如果密码策略为MEDIUM
或更强,validate_password
要求密码中包含的小写和大写字符的最小数量。除非安装了validate_password
,否则此变量不可用。
对于给定的validate_password.mixed_case_count
值,密码必须具有相同数量的小写字符和大写字符。
validate_password.number_count
命令行格式 | --validate-password.number-count=# |
---|---|
系统变量 | validate_password.number_count |
范围 | 全局 |
动态 | 是 |
SET_VAR提示适用 | 否 |
类型 | 整数 |
默认值 | 1 |
最小值 | 0 |
validate_password
要求密码具有的数字(数字)字符的最小数量,如果密码策略为MEDIUM
或更强。除非安装了validate_password
,否则此变量不可用。
validate_password.policy
命令行格式 | --validate-password.policy=value |
---|---|
系统变量 | validate_password.policy |
范围 | 全局 |
动态 | 是 |
SET_VAR提示适用 | 否 |
类型 | 枚举 |
默认值 | 1 |
有效值 | 0``1``2 |
由validate_password
强制执行的密码策略。除非安装了validate_password
,否则此变量不可用。
validate_password.policy
影响validate_password
如何使用其其他设置策略的系统变量,除了检查密码是否与用户名匹配,这是由validate_password.check_user_name
独立控制的。
可以使用数值 0、1、2 或相应的符号值LOW
、MEDIUM
、STRONG
来指定validate_password.policy
的值。以下表格描述了每个策略执行的测试。对于长度测试,所需长度是validate_password.length
系统变量的值。类似地,其他测试的所需值由其他validate_password.*
xxx*
变量给出。
策略 | 执行的测试 |
---|---|
0 或 LOW | 长度 |
1 或 MEDIUM | 长度;数字、小写/大写字母和特殊字符 |
2 或 STRONG | 长度;数字、小写/大写字母和特殊字符;字典文件 |
validate_password.special_char_count
命令行格式 | --validate-password.special-char-count=# |
---|---|
系统变量 | validate_password.special_char_count |
范围 | 全局 |
动态 | 是 |
SET_VAR提示适用 | 否 |
类型 | 整数 |
默认值 | 1 |
最小值 | 0 |
如果密码策略为MEDIUM
或更强时,validate_password
要求密码具有的最小非字母数字字符数。除非安装了validate_password
,否则此变量不可用。
密码验证组件状态变量
如果启用了validate_password
组件,则会公开提供操作信息的状态变量:
mysql> SHOW STATUS LIKE 'validate_password.%';
----------------------------------------------- ---------------------
| Variable_name | Value |
----------------------------------------------- ---------------------
| validate_password.dictionary_file_last_parsed | 2019-10-03 08:33:49 |
| validate_password.dictionary_file_words_count | 1902 |
----------------------------------------------- ---------------------
以下列表描述了每个状态变量的含义。
-
validate_password.dictionary_file_last_parsed
上次解析字典文件的时间。除非安装了validate_password
,否则此变量不可用。 -
validate_password.dictionary_file_words_count
从字典文件中读取的单词数量。除非安装了validate_password
,否则此变量不可用。
密码验证插件选项
注意
在 MySQL 8.0 中,validate_password
插件被重新实现为validate_password
组件。validate_password
插件已被弃用;预计在未来的 MySQL 版本中将其移除。因此,其选项也已被弃用,您应该预期它们也将被移除。使用插件的 MySQL 安装应该过渡到使用组件。参见第 8.4.3.3 节,“过渡到密码验证组件”。
使用此选项来控制validate_password
插件的激活:
- --validate-password[=*value*]
命令行格式
--validate-password[=value]
类型枚举默认值ON
有效数值ON``OFF``FORCE``FORCE_PLUS_PERMANENT
此选项控制服务器在启动时如何加载已弃用的validate_password
插件。该值应为插件加载选项中可用的值之一,如第 7.6.1 节,“安装和卸载插件”中所述。例如,--validate-password=FORCE_PLUS_PERMANENT
告诉服务器在启动时加载插件,并防止在服务器运行时将其移除。 只有在之前使用INSTALL PLUGIN
注册了validate_password
插件或者使用--plugin-load-add
加载了该插件时,此选项才可用。参见第 8.4.3.1 节,“密码验证组件的安装和卸载”。
密码验证插件系统变量
注意
在 MySQL 8.0 中,validate_password
插件被重新实现为validate_password
组件。validate_password
插件已被弃用;预计在 MySQL 的未来版本中将被移除。因此,其系统变量也已被弃用,您应该预期它们也将被移除。改用validate_password
组件的相应系统变量;请参阅密码验证组件系统变量。使用插件的 MySQL 安装应该过渡到使用组件。请参阅第 8.4.3.3 节,“过渡到密码验证组件”。
-
validate_password_check_user_name
命令行格式--validate-password-check-user-name[={OFF|ON}]
系统变量validate_password_check_user_name
范围全局动态是SET_VAR
提示适用否类型布尔默认值ON
此validate_password
插件系统变量已被弃用;预计在 MySQL 的未来版本中将被移除。请改用validate_password
组件的相应validate_password.check_user_name
系统变量。 -
validate_password_dictionary_file
命令行格式--validate-password-dictionary-file=file_name
系统变量validate_password_dictionary_file
范围全局动态是SET_VAR
提示适用否类型文件名此validate_password
插件系统变量已被弃用;预计在 MySQL 的未来版本中将被移除。请改用validate_password
组件的相应validate_password.dictionary_file
系统变量。 -
validate_password_length
命令行格式--validate-password-length=#
系统变量validate_password_length
范围全局动态是SET_VAR
提示适用否类型整数默认值8
最小值0
此validate_password
插件系统变量已被弃用;预计在 MySQL 的未来版本中将被移除。请改用validate_password
组件的相应validate_password.length
系统变量。 -
validate_password_mixed_case_count
命令行格式--validate-password-mixed-case-count=#
系统变量validate_password_mixed_case_count
范围全局动态是SET_VAR
提示适用否类型整数默认值1
最小值0
此validate_password
插件系统变量已被弃用;预计在 MySQL 的未来版本中将被移除。请改用validate_password
组件的相应validate_password.mixed_case_count
系统变量。 -
validate_password_number_count
命令行格式--validate-password-number-count=#
系统变量validate_password_number_count
范围全局动态是SET_VAR
提示适用否类型整数默认值1
最小值0
此validate_password
插件系统变量已被弃用;预计在 MySQL 的未来版本中将被移除。请改用validate_password
组件的相应validate_password.number_count
系统变量。 -
validate_password_policy
命令行格式--validate-password-policy=value
系统变量validate_password_policy
范围全局动态是SET_VAR
提示适用否类型枚举默认值1
有效值0``1``2
此validate_password
插件系统变量已被弃用;预计在 MySQL 的未来版本中将被移除。请改用validate_password
组件的相应validate_password.policy
系统变量。 -
validate_password_special_char_count
命令行格式--validate-password-special-char-count=#
系统变量validate_password_special_char_count
范围全局动态是SET_VAR
提示适用否类型整数默认值1
最小值0
此validate_password
插件系统变量已被弃用;预计将在 MySQL 的未来版本中移除。请改用validate_password
组件的相应validate_password.special_char_count
系统变量。
密码验证插件状态变量
注意
在 MySQL 8.0 中,validate_password
插件被重新实现为validate_password
组件。validate_password
插件已被弃用;预计将在 MySQL 的未来版本中移除。因此,其状态变量也已被弃用;预计将被移除。请使用validate_password
组件的相应状态变量;请参阅密码验证组件状态变量。使用插件的 MySQL 安装应该过渡到使用组件。请参阅第 8.4.3.3 节,“过渡到密码验证组件”。
-
validate_password_dictionary_file_last_parsed
此validate_password
插件状态变量已被弃用;预计将在 MySQL 的未来版本中移除。请改用validate_password
组件的相应validate_password.dictionary_file_last_parsed
状态变量。 -
validate_password_dictionary_file_words_count
此validate_password
插件状态变量已被弃用;预计将在 MySQL 的未来版本中移除。请改用validate_password
组件的相应validate_password.dictionary_file_words_count
状态变量。