当客户端连接到 MySQL 服务器时,服务器使用客户端提供的用户名和客户端主机从mysql.user
系统表中选择合适的帐户行。服务器然后对客户端进行身份验证,从帐户行确定哪个身份验证插件适用于客户端:
如果服务器找不到插件,则会发生错误并拒绝连接尝试。
否则,服务器调用该插件来验证用户,插件向服务器返回一个状态,指示用户是否提供了正确的密码并被允许连接。
可插入身份验证支持以下重要功能:
身份验证方法的选择。 可插入身份验证使 DBA 可以轻松选择和更改用于单个 MySQL 帐户的身份验证方法。
外部认证。 可插入身份验证使客户端可以使用适用于将凭据存储在
mysql.user
系统表以外的其他位置的身份验证方法的凭据连接到 MySQL 服务器。例如,可以创建插件以使用外部身份验证方法,如 PAM、Windows 登录 ID、LDAP 或 Kerberos。代理用户: 如果允许用户连接,身份验证插件可以向服务器返回一个与连接用户名称不同的用户名,以指示连接用户是另一个用户(被代理用户)的代理。当连接持续时,出于访问控制的目的,代理用户被视为具有被代理用户的特权。实际上,一个用户冒充另一个用户。有关详细信息,请参阅第 6.2.14 节,“代理用户”。
如果使用该
--skip-grant-tables
选项启动服务器,即使加载了身份验证插件也不会使用,因为服务器不执行客户端身份验证并允许任何客户端连接。因为这是不安全的,您可能希望
--skip-grant-tables
与启用
skip_networking
系统变量结合使用以防止远程客户端连接。
MySQL 5.7 提供了这些身份验证插件:
执行本机身份验证的插件;也就是说,身份验证基于在 MySQL 中引入可插入身份验证之前使用的密码哈希方法。该
mysql_native_password
插件基于本机密码哈希方法实现身份验证。该mysql_old_password
插件基于较旧的(4.1 之前的)密码哈希方法(在 MySQL 5.7.5 中已弃用和删除)实现本机身份验证。请参阅 第 6.4.1.1 节,“本机可插入身份验证”和 第 6.4.1.2 节,“旧的本机可插入身份验证”。使用 SHA-256 密码哈希执行身份验证的插件。这是比本机身份验证可用的加密更强的加密。请参阅 第 6.4.1.5 节,“SHA-256 可插入身份验证”和 第 6.4.1.4 节,“缓存 SHA-2 可插入身份验证”。
一种客户端插件,无需散列或加密即可将密码发送到服务器。此插件与服务器端插件结合使用,这些插件需要访问与客户端用户提供的密码完全相同的密码。请参阅 第 6.4.1.6 节,“客户端明文可插入身份验证”。
一个使用PAM(Pluggable Authentication Modules)进行外部认证的插件,使MySQL Server可以使用PAM对MySQL用户进行认证。该插件也支持代理用户。请参阅 第 6.4.1.7 节,“PAM 可插入身份验证”。
在 Windows 上执行外部身份验证的插件,使 MySQL Server 能够使用本机 Windows 服务来验证客户端连接。登录到Windows的用户可以根据他们环境中的信息从MySQL客户端程序连接到服务器,而无需指定额外的密码。该插件也支持代理用户。请参阅 第 6.4.1.8 节,“Windows 可插入身份验证”。
使用 LDAP(轻量级目录访问协议)执行身份验证的插件,通过访问 X.500 等目录服务来对 MySQL 用户进行身份验证。这些插件也支持代理用户。请参阅 第 6.4.1.9 节,“LDAP 可插入身份验证”。
一个阻止所有客户端连接到使用它的任何帐户的插件。此插件的用例包括永远不允许直接登录但只能通过代理帐户访问的代理帐户,以及必须能够以提升的权限执行存储的程序和视图的帐户,而不会将这些权限暴露给普通用户。请参阅 第 6.4.1.10 节,“无登录可插入身份验证”。
一个插件,用于验证通过 Unix 套接字文件从本地主机连接的客户端。请参阅 第 6.4.1.11 节,“Socket Peer-Credential Pluggable Authentication”。
检查帐户凭据并将成功或失败记录到服务器错误日志的测试插件。此插件用于测试和开发目的,并作为如何编写身份验证插件的示例。请参阅 第 6.4.1.12 节,“测试可插入身份验证”。
有关使用可插入身份验证的当前限制的信息,包括哪些连接器支持哪些插件,请参阅 可插入身份验证的限制。
第三方连接器开发人员应阅读该部分以确定连接器可以在多大程度上利用可插入身份验证功能以及采取哪些步骤来变得更加合规。
如果您有兴趣编写自己的身份验证插件,请参阅编写身份验证插件。
本节提供安装和使用身份验证插件的一般说明。有关特定于给定插件的说明,请参阅 第 6.4.1 节“身份验证插件”下描述该插件的部分。
通常,可插入身份验证在服务器端和客户端使用一对相应的插件,因此您可以像这样使用给定的身份验证方法:
如有必要,安装插件库或包含适当插件的库。在服务器主机上,安装包含服务器端插件的库,以便服务器可以使用它来验证客户端连接。同样,在每个客户端主机上,安装包含客户端插件的库以供客户端程序使用。无需安装内置的身份验证插件。
对于您创建的每个 MySQL 帐户,指定适当的服务器端插件以用于身份验证。如果帐户要使用默认的身份验证插件,则帐户创建语句不需要明确指定插件。系统
default_authentication_plugin
变量配置默认身份验证插件。当客户端连接时,服务器端插件会告诉客户端程序使用哪个客户端插件进行身份验证。
如果帐户使用服务器和客户端程序默认的身份验证方法,则服务器无需与客户端通信使用哪个客户端插件,并且可以在客户端/服务器协商中进行往返避免了。这适用于使用本机 MySQL 身份验证的帐户。
对于标准的 MySQL 客户端,如mysql和
mysqladmin,
可以在命令行上指定选项作为程序可以使用哪个客户端插件的提示,尽管如果服务器端插件与用户关联,服务器会覆盖它帐户需要不同的客户端插件。
--default-auth=
plugin_name
如果客户端程序没有找到客户端插件库文件,则指定一个
选项来指示插件库目录位置。
--plugin-dir=
dir_name
本节的第一部分描述了第 6.2.13 节“可插入身份验证”中描述的可插入身份验证框架的适用性的一般限制。第二部分描述了第三方连接器开发人员如何确定连接器可以在多大程度上利用可插入的身份验证功能以及采取哪些步骤来变得更加合规。
这里使用的术语“本机身份验证”是指针对存储在
mysql.user
系统表中的密码进行身份验证。在实现可插入身份验证之前,这与旧版 MySQL 服务器提供的身份验证方法相同。“ Windows native authentication ”是指使用已经登录Windows的用户的凭据进行身份验证,由Windows Native Authentication plugin(简称“ Windows plugin ”)实现。
一般可插入身份验证限制
连接器/C++:使用此连接器的客户端只能通过使用本机身份验证的帐户连接到服务器。
例外:如果连接器被构建为
libmysqlclient
动态链接(而不是静态)并且它加载当前版本(libmysqlclient
如果安装了该版本),或者如果连接器从源代码重新编译以链接到当前libmysqlclient
.Connector/NET:使用 Connector/NET 的客户端可以通过使用本机身份验证或 Windows 本机身份验证的帐户连接到服务器。
连接器/PHP:使用此连接器的客户端只能通过使用本地身份验证的帐户连接到服务器,当使用 PHP 的 MySQL 本机驱动程序编译时 (
mysqlnd
)。Windows 本机身份验证:通过使用 Windows 插件的帐户连接需要 Windows 域设置。没有它,将使用 NTLM 身份验证,然后只能进行本地连接;也就是说,客户端和服务器必须运行在同一台计算机上。
代理用户:代理用户支持在客户端可以通过使用实现代理用户功能的插件(即可以返回与连接用户不同的用户名的插件)进行身份验证的帐户进行连接的范围内可用。例如,PAM 和 Windows 插件支持代理用户。和认证插件默认不支持代理用户,但可以配置支持
mysql_native_password
;sha256_password
请参阅 代理用户映射的服务器支持。复制:副本不仅可以使用使用本机身份验证的源帐户,而且如果所需的客户端插件可用,也可以通过使用非本机身份验证的源帐户进行连接。如果插件内置于
libmysqlclient
中,则默认可用。否则,插件必须安装在副本plugin_dir
系统变量命名的目录中的副本端。
可插拔身份验证和第三方连接器
第三方连接器开发人员可以使用以下准则来确定连接器是否准备好利用可插入身份验证功能以及采取哪些步骤来变得更加合规:
未进行任何更改的现有连接器使用本机身份验证,使用该连接器的客户端只能通过使用本机身份验证的帐户连接到服务器。但是,您应该针对最新版本的服务器测试连接器,以验证此类连接是否仍然可以正常工作。
例外:如果连接器
libmysqlclient
动态(而不是静态)链接到并加载当前版本(libmysqlclient
如果安装了该版本),则连接器可能无需任何更改即可使用可插入身份验证。要利用可插入的身份验证功能,
libmysqlclient
基于libmysqlclient
. 这使连接器能够支持通过现在内置的需要客户端插件的帐户进行连接libmysqlclient
(例如 PAM 身份验证所需的明文插件和 Windows 本机身份验证所需的 Windows 插件)。与当前链接libmysqlclient
还使连接器能够访问安装在默认 MySQL 插件目录中的客户端插件(通常是本地服务器的默认值命名的目录)plugin_dir
系统变量)。如果连接器
libmysqlclient
动态链接,则必须确保libmysqlclient
客户端主机上安装了较新版本,并且连接器在运行时加载它。连接器支持给定身份验证方法的另一种方法是直接在客户端/服务器协议中实现它。Connector/NET 使用这种方法来提供对 Windows 本机身份验证的支持。
如果连接器应该能够从与默认插件目录不同的目录加载客户端插件,则它必须实现一些方法让客户端用户指定目录。这可能包括命令行选项或环境变量,连接器可以从中获取目录名称。mysql和 mysqladmin等标准 MySQL 客户端程序实现了一个
--plugin-dir
选项。另请参阅 C API 客户端插件接口。如本节前面所述,连接器对代理用户的支持取决于它支持的身份验证方法是否允许代理用户。