当客户端连接到MySQL服务器时,服务器使用客户端和客户端主机提供的用户名来从数据库中选择适当的帐户行mysql.user
系统表。然后,服务器对客户端进行身份验证,从帐户行中确定哪个身份验证插件适用于客户端:
如果服务器无法找到该插件,则会发生错误并拒绝连接尝试。
否则,服务器调用该插件对用户进行身份验证,插件将一个状态返回给服务器,指示用户是否提供了正确的密码并被允许连接。
可插拔身份验证支持以下重要功能:
身份验证方法的选择。可插入身份验证使得dba可以轻松地选择和更改用于单个MySQL帐户的身份验证方法。
外部认证。可插入身份验证使得客户端可以使用适合于身份验证方法的凭据连接到MySQL服务器,这些方法将凭据存储在数据库以外的其他地方
mysql.user
系统表。例如,可以创建使用外部身份验证方法(如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.2,“缓存SHA-2可插拔身份验证”,章节6.4.1.3,“SHA-256可插拔认证”.
一个客户端插件,它将密码发送到服务器而不进行散列或加密。这个插件与需要访问客户端用户所提供的密码的服务器端插件一起使用。看到第6.4.1.4节,“客户端明文可插拔身份验证”.
一个使用PAM (Pluggable authentication Modules)执行外部身份验证的插件,允许MySQL服务器使用PAM对MySQL用户进行身份验证。这个插件也支持代理用户。看到章节6.4.1.5,“PAM可插式身份验证”.
一个在Windows上执行外部身份验证的插件,允许MySQL服务器使用本地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节,“测试可插拔身份验证”.
有关使用可插入身份验证的当前限制(包括哪些连接器支持哪些插件)的信息,请参见可插拔认证限制.
第三方连接器开发人员应该阅读这一部分,以确定连接器可以在多大程度上利用可插拔身份验证功能,以及采取哪些步骤来变得更加兼容。
如果您对编写自己的身份验证插件感兴趣,请参见编写认证插件.
本节提供安装和使用认证插件的一般说明。有关特定插件的说明,请参阅下面描述该插件的部分章节6.4.1,“认证插件”.
一般来说,可插认证在服务器端和客户端使用一对对应的插件,因此您可以使用如下所示的认证方法:
如果有必要,安装插件库或包含适当插件的库。在服务器主机上,安装包含服务器端插件的库,以便服务器可以使用它来验证客户端连接。类似地,在每个客户端主机上安装包含客户端插件的库,以供客户端程序使用。无需安装内置的身份验证插件。
对于您创建的每个MySQL帐户,指定用于身份验证的适当服务器端插件。如果帐户使用默认的身份验证插件,帐户创建语句不需要显式地指定插件。的
default_authentication_plugin
系统变量配置默认的认证插件。当客户端连接时,服务器端插件告诉客户端程序使用哪个客户端插件进行身份验证。
在帐户使用服务器和客户端程序默认的身份验证方法的情况下,服务器不需要与客户端通信使用哪个客户端插件,并且可以避免客户端/服务器协商中的往返。
对于标准的MySQL客户端,例如mysql和mysqladmin,——default-auth =
Option可以在命令行上指定,作为程序期望使用哪个客户端插件的提示,尽管如果与用户帐户关联的服务器端插件需要不同的客户端插件,服务器将覆盖该选项。plugin_name
如果客户端程序找不到客户端插件库文件,则指定——plugin-dir =
选项,指示插件库目录位置。dir_name
可插入身份验证为MySQL帐户选择身份验证方法提供了灵活性,但在某些情况下,由于客户端和服务器之间的身份验证插件不兼容,客户端连接无法建立。
客户端要成功连接到给定服务器上的给定帐户,一般的兼容性原则是客户端和服务器都必须支持身份验证方法账户要求。由于身份验证方法是由身份验证插件实现的,因此客户端和服务器都必须支持身份验证插件账户要求。
身份验证插件不兼容可能以多种方式出现。例子:
使用MySQL 5.7客户端从5.7.22或更低版本连接到MySQL 8.0服务器帐户进行身份验证
caching_sha2_password
.这是因为5.7客户端无法识别在MySQL 8.0中引入的插件。(此问题已在MySQL 5.7 5.7.23中解决,当caching_sha2_password
客户端支持被添加到MySQL客户端库和客户端程序中。使用MySQL 5.7客户端连接到5.7版本之前的服务器帐户
mysql_old_password
.这种做法失败有多种原因。首先,这种联系需要——secure-auth = 0
,该选项不再受支持。即使它被支持,5.7客户端也不能识别这个插件,因为它在MySQL 5.7中被删除了。使用MySQL 5.7客户端从社区发行版连接到MySQL 5.7企业服务器帐户,该帐户使用企业专用LDAP身份验证插件之一进行身份验证。这将失败,因为Community客户端无法访问Enterprise插件。
一般来说,当客户端和服务器从同一个MySQL发行版建立连接时,不会出现这些兼容性问题。当在不同MySQL系列的客户机和服务器之间建立连接时,可能会出现问题。这些问题是MySQL在开发过程中引入新的认证插件或删除旧的认证插件时所固有的。为了最大限度地减少潜在的不兼容,应定期及时升级服务器、客户机和连接器。
MySQL客户端/服务器协议有多种实现。的libmysqlclient
C 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
.客户端加载服务器指定的插件的唯一时间是change-plugin请求,但在这种情况下,它可以是任何插件,这取决于用户帐户。在这种情况下,客户端必须尝试加载插件,如果该插件不可用,则错误是不可选的。
本节的第一部分描述了关于可插入身份验证框架适用性的一般限制第6.2.17节“可插拔身份验证”.第二部分描述了第三方连接器开发人员如何确定连接器可以在多大程度上利用可插拔身份验证功能,以及采取哪些步骤来提高兼容性。
这个词”本地身份验证”对象中存储的密码进行身份验证mysql.user
系统表。在实现可插入身份验证之前,这与旧的MySQL服务器提供的身份验证方法相同。”Windows本地认证”指使用已登录Windows的用户的凭据进行身份验证,由Windows Native authentication插件(”窗口插件”短)。
通用可插式身份验证限制
连接器/ c++:使用此连接器的客户机只能通过使用本机身份验证的帐户连接到服务器。
例外:如果构建连接器是为了链接到,则支持可插入身份验证
libmysqlclient
动态地(而不是静态地)加载的当前版本libmysqlclient
如果安装了该版本,或者根据当前的链接从源代码重新编译连接器libmysqlclient
.有关编写连接器以处理来自服务器的关于默认服务器端身份验证插件的信息的信息,请参见身份验证插件连接器编写注意事项.
连接器/网:使用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身份验证所需的cleartext插件和Windows本机身份验证所需的Windows插件)。电流连接libmysqlclient
还允许连接器访问安装在默认MySQL插件目录中的客户端插件(通常是由本地服务器的默认值命名的目录)plugin_dir
系统变量)。如果连接器连接到
libmysqlclient
动态地,必须确保更新的版本libmysqlclient
安装在客户端主机上,并且连接器在运行时加载它。连接器支持给定身份验证方法的另一种方法是直接在客户机/服务器协议中实现它。Connector/NET使用这种方法提供对Windows本机身份验证的支持。
如果连接器应该能够从不同于默认插件目录的目录中加载客户端插件,那么它必须为客户端用户实现一些指定目录的方法。可能的方法包括命令行选项或环境变量,连接器可以从中获取目录名。标准MySQL客户端程序,如mysql和mysqladmin实现一个
——plugin-dir
选择。另请参阅C API客户端插件接口.如本节前面所述,连接器对代理用户的支持取决于它支持的身份验证方法是否允许代理用户。