可插拔身份验证
当客户端连接到MySQL服务器时,服务器使用客户端提供的用户名和客户端主机从mysql.user 系统表中选择适当的帐户行。然后,服务器对客户端进行身份验证,从帐户行中确定哪个身份验证插件适用于客户端:
如果服务器找不到插件,则会发生错误并且连接尝试将被拒绝。
否则,服务器将调用该插件以对用户进行身份验证,并且该插件会向服务器返回一个状态,指示用户是否提供了正确的密码并被允许连接。
可插拔身份验证启用以下重要功能:
选择身份验证方法。 可插入身份验证使DBA可以轻松选择和更改用于单个MySQL帐户的身份验证方法。
外部认证。 可插拔身份验证使客户端可以使用适合于将凭据存储在mysql.user系统表以外的位置的身份验证方法的凭据连接到MySQL服务器。例如,可以创建插件以使用外部身份验证方法,例如PAM,Windows登录ID,LDAP或Kerberos。
代理用户: 如果允许用户连接,身份验证插件可以向服务器返回与连接用户名称不同的用户名,以指示连接用户是另一个用户(代理用户)的代理。在连接持续的同时,出于访问控制的目的,将代理用户视为具有代理用户的特权。实际上,一个用户冒充了另一个用户。有关更多信息,请参见第6.2.18节“代理用户”。
注意
如果使用该--skip-grant-tables选项启动服务器,则 即使加载了身份验证插件也不会使用,因为服务器不执行任何客户端身份验证并且允许任何客户端连接。因为这是不安全的,所以如果使用该--skip-grant-tables 选项启动服务器,它也会通过启用来禁用远程连接 skip_networking。
可用的身份验证插件
MySQL 8.0提供了以下身份验证插件:
执行本地身份验证的插件;也就是说,基于在MySQL中引入可插入身份验证之前使用的基于密码哈希方法的身份验证。该mysql_native_password插件基于此本地密码哈希方法实现身份验证。请参见 第6.4.1.1节“本地可插入身份验证”。
使用SHA-256密码哈希执行身份验证的插件。与本地身份验证相比,这是更强大的加密。请参见 第6.4.1.3节“ SHA-256可插拔身份验证”和 第6.4.1.2节“缓存SHA-2可插拔身份验证”。
一个客户端插件,无需哈希或加密即可将密码发送到服务器。该插件与服务器端插件结合使用,服务器端插件需要完全按照客户端用户提供的密码进行访问。请参见 第6.4.1.4节“客户端明文可插入身份验证”。
一个使用PAM(可插入身份验证模块)执行外部身份验证的插件,使MySQL Server能够使用PAM对MySQL用户进行身份验证。该插件也支持代理用户。请参见 第6.4.1.5节“ PAM可插拔身份验证”。
一个在Windows上执行外部身份验证的插件,使MySQL Server可以使用本机Windows服务来身份验证客户端连接。登录到Windows的用户可以根据环境中的信息从MySQL客户端程序连接到服务器,而无需指定其他密码。该插件也支持代理用户。请参见 第6.4.1.6节“ Windows可插入身份验证”。
使用LDAP(轻型目录访问协议)执行身份验证的插件通过访问目录服务(例如X.500)来对MySQL用户进行身份验证。这些插件也支持代理用户。请参见 第6.4.1.7节“ LDAP可插拔身份验证”。
一个阻止所有客户端连接到使用它的任何帐户的插件。此插件的用例包括:代理帐户,这些帐户决不允许直接登录,而只能通过代理帐户访问;必须具有代理权限的帐户,以及必须能够以提升的特权执行存储程序和视图的帐户,而这些特权不会暴露给普通用户。请参见 第6.4.1.8节“无登录可插入身份验证”。
一个插件,用于验证通过Unix套接字文件从本地主机连接的客户端。请参见 第6.4.1.9节“套接字对等证书可插入认证”。
一个测试插件,用于检查帐户凭据并将成功或失败记录到服务器错误日志中。此插件旨在用于测试和开发目的,并作为如何编写身份验证插件的示例。请参见 第6.4.1.10节“测试可插入身份验证”。
注意
有关当前使用可插入身份验证的限制的信息,包括哪些连接器支持哪些插件,请参阅 《可插入身份验证的限制》。
第三方连接器开发人员应阅读该部分,以确定连接器可以利用可插拔身份验证功能的程度,以及采取哪些步骤使其更具兼容性。
如果您有兴趣编写自己的身份验证插件,请参见第29.2.4.9节“编写身份验证插件”。
身份验证插件用法
本节提供有关安装和使用身份验证插件的一般说明。有关特定插件的说明,请参见第6.4.1节“身份验证插件”下描述该插件的 部分。
通常,可插入身份验证在服务器端和客户端使用一对相应的插件,因此您使用如下给定的身份验证方法:
如有必要,安装一个或多个包含适当插件的库。在服务器主机上,安装包含服务器端插件的库,以便服务器可以使用它来验证客户端连接。同样,在每个客户端主机上,安装包含客户端插件的库,供客户端程序使用。内置的身份验证插件无需安装。
对于您创建的每个MySQL帐户,指定用于身份验证的适当的服务器端插件。如果帐户要使用默认身份验证插件,则account-creation语句无需显式指定插件。该 default_authentication_plugin 系统变量配置默认的身份验证插件。
当客户端连接时,服务器端插件告诉客户端程序哪个客户端插件用于身份验证。
如果帐户使用服务器和客户端程序默认的身份验证方法,则服务器无需与客户端进行通信,以使用哪个客户端插件,客户端/服务器协商中的往返行程可以是避免。
对于标准MySQL客户端(例如mysql和 mysqladmin), 可以在命令行上指定该 选项,以提示程序可以使用哪个客户端插件,尽管如果服务器端插件与该插件相关联,则服务器将覆盖此选项。用户帐户需要其他客户端插件。 --default-auth=plugin_name
如果客户端程序找不到客户端插件库文件,请指定一个 选项以指示插件库目录位置。 --plugin-dir=dir_name
身份验证插件客户端/服务器兼容性
可插拔身份验证可以灵活地选择MySQL帐户的身份验证方法,但是在某些情况下,由于客户端和服务器之间的身份验证插件不兼容,无法建立客户端连接。
成功地将客户端连接到给定服务器上给定帐户的通用兼容性原则是,客户端和服务器都必须支持该帐户所需的身份验证 方法。由于身份验证方法是通过身份验证插件实现的,因此客户端和服务器都必须支持帐户所需的身份验证插件。
身份验证插件不兼容可能以多种方式出现。例子:
使用5.7.22或更低版本的MySQL 5.7客户端连接到通过进行身份验证的MySQL 8.0服务器帐户 caching_sha2_password。失败是因为5.7客户端无法识别MySQL 8.0中引入的插件。(当将caching_sha2_password客户端支持添加到MySQL客户端库和客户端程序时,从5.7.23版开始,此问题在MySQL 5.7中得到解决 。)
使用MySQL 5.5客户端连接到通过身份验证的MySQL 5.6服务器帐户 sha256_password。失败是因为5.5客户端无法识别MySQL 5.6中引入的插件。
使用MySQL 5.7客户端连接到进行身份验证的5.7之前的服务器帐户 mysql_old_password。失败有多种原因。首先,这样的连接需要 --secure-auth=0,不再是受支持的选项。即使受支持,5.7客户端也无法识别该插件,因为它已在MySQL 5.7中删除。
使用MySQL 5.7客户端从社区分发连接到使用仅企业LDAP身份验证插件之一进行身份验证的MySQL 5.7 Enterprise服务器帐户。由于社区客户端无权访问企业插件,因此失败。
通常,当使用相同的MySQL发行版在客户端和服务器之间建立连接时,不会出现这些兼容性问题。在不同MySQL系列的客户端和服务器之间建立连接时,可能会出现问题。当MySQL引入新的身份验证插件或删除旧的身份验证插件时,这些问题是开发过程中固有的。为了最大程度地减少不兼容的可能性,请定期定期升级服务器,客户端和连接器。
身份验证插件连接器-写注意事项
存在MySQL客户端/服务器协议的各种实现。在libmysqlclientC API客户端库是一个实现。一些MySQL连接器(通常不是用C编写的)提供了自己的实现。但是,并非所有协议实现都以相同的方式处理插件身份验证。本节介绍协议实施者应考虑的身份验证问题。
在客户端/服务器协议中,服务器告诉连接的客户端它认为哪个身份验证插件是默认的。如果客户端使用的协议实现尝试加载默认插件,而该插件在客户端不存在,则加载操作将失败。如果默认插件不是客户端尝试连接的帐户实际所需的插件,则这是不必要的失败。
如果客户端/服务器协议实现没有自己的默认身份验证插件概念,并且始终尝试加载服务器指定的默认插件,则如果该插件不可用,它将失败并显示错误。
为避免此问题,客户端使用的协议实现应具有其自己的默认插件,并应将其用作首选(或者,如果无法加载服务器指定的默认插件,则退回到该默认插件)。 。例:
在MySQL 5.7中,libmysqlclient使用mysql_native_password或通过MYSQL_DEFAULT_AUTH 选项指定的插件作为其默认 选项mysql_options()。
当5.7客户端尝试连接到8.0服务器时,服务器caching_sha2_password会将其指定为默认身份验证插件,但客户端仍会通过mysql_native_password或指定的任何内容发送凭据详细信息 MYSQL_DEFAULT_AUTH。
客户端唯一加载服务器指定的插件是针对更改插件请求,但是在这种情况下,取决于用户帐户,它可以是任何插件。在这种情况下,客户端必须尝试加载插件,并且如果该插件不可用,则错误不是可选的。
可插拔身份验证的限制
本节的第一部分描述了对第6.2.17节“可插入身份验证”中所述的可插入身份验证框架的适用性的一般限制。第二部分描述了第三方连接器开发人员如何确定连接器可以利用可插拔身份验证功能的程度,以及采取哪些步骤使其更加合规。
此处使用 的术语“ 本机认证 ”是指针对mysql.user系统表中存储的密码进行的认证 。在实现可插入身份验证之前,这与旧版MySQL服务器提供的身份验证方法相同。“ Windows本机身份验证 ”是指使用已经登录Windows的用户的凭据进行的身份验证,这由Windows本机身份验证插件(简称“ Windows插件 ”)实现。
一般可插拔身份验证限制
可插拔身份验证和第三方连接器
一般可插拔身份验证限制
连接器/ C ++:使用此连接器的客户端只能通过使用本机身份验证的帐户连接到服务器。
例外:如果连接器是为libmysqlclient 动态链接(而不是静态链接)而构建的,并且它加载了当前版本(libmysqlclient如果已安装该版本),或者如果该连接器从源重新编译为针对当前链接 进行链接,则它支持可插拔身份验证libmysqlclient。
有关编写连接器以处理来自服务器的有关默认服务器端身份验证插件的信息的信息,请参阅 身份验证插件连接器书写注意事项。
连接器/ NET:使用连接器/ NET的客户端可以通过使用本机身份验证或Windows本机身份验证的帐户连接到服务器。
连接器/ PHP:使用此连接器的客户端在使用 PHP的MySQL本机驱动程序进行编译时,只能通过使用本机身份验证的帐户连接到服务器mysqlnd。
Windows本机身份验证:通过使用Windows插件的帐户进行连接需要Windows域设置。没有它,将使用NTLM身份验证,然后只能进行本地连接。也就是说,客户端和服务器必须在同一台计算机上运行。
代理用户:代理用户支持在以下范围内可用:客户端可以通过使用实现代理用户功能的插件(即,可以返回与连接用户不同的用户名的插件)进行身份验证的帐户进行连接。例如,PAM和Windows插件支持代理用户。该mysql_native_password和 sha256_password认证插件默认情况下不支持代理的用户,但可以被配置成这样; 请参阅 服务器支持代理用户映射。
复制:复制从属不仅可以使用本地身份验证来使用主帐户,而且还可以通过使用非本地身份验证的主帐户进行连接(如果所需的客户端插件可用)。如果插件内置于中 libmysqlclient,则默认情况下可用。否则,必须将插件安装在由从属plugin_dir系统变量命名的目录中的从属端 。
FEDERATED 表:一个FEDERATED 表只能通过使用本地身份验证的远程服务器上的账户访问远程表。
可插拔身份验证和第三方连接器
第三方连接器开发人员可以使用以下准则来确定连接器的就绪状态,以利用可插入的身份验证功能以及应采取哪些步骤变得更加合规:
没有进行任何更改的现有连接器使用本机身份验证,使用该连接器的客户端只能通过使用本机身份验证的帐户连接到服务器。但是,您应该针对服务器的最新版本测试连接器,以验证此类连接仍然可以正常工作。
例外:如果连接器libmysqlclient动态链接(而不是静态链接)并且libmysqlclient如果安装了该版本的当前版本,则它 可以与可插拔身份验证一起使用而无需进行任何更改 。
要利用可插拔身份验证功能,libmysqlclient应将基于连接器的当前版本重新链接 libmysqlclient。这样,连接器就可以通过需要内置客户端插件的帐户来支持连接 libmysqlclient(例如,PAM身份验证所需的明文插件和Windows本机身份验证所需的Windows插件)。与电流链接libmysqlclient还使连接器能够访问默认MySQL插件目录(通常由本地服务器的默认值命名的目录)中安装的客户端插件。 plugin_dir 系统变量)。
如果连接器libmysqlclient 动态链接,则必须确保libmysqlclient在客户端主机上安装了新版本 的连接器,并确保连接器在运行时加载它。
连接器支持给定身份验证方法的另一种方法是直接在客户端/服务器协议中实现它。连接器/ NET使用这种方法来提供对Windows本机身份验证的支持。
如果连接器应该能够从不同于默认插件目录的目录中加载客户端插件,则它必须为客户端用户提供一些方法来指定目录。这样做的可能性包括命令行选项或环境变量,连接器可从中获取目录名称。标准MySQL客户端程序(例如mysql和 mysqladmin)实现一个 --plugin-dir选项。另请参见 第28.6.16节“ C API客户端插件功能”。
如本节前面所述,连接器对代理用户的支持取决于它所支持的身份验证方法是否允许代理用户。