4.17可插入身份验证

当客户端连接到MySQL服务器时,服务器使用客户端和客户端主机提供的用户名从mysql.user系统表。然后,服务器对客户端进行身份验证,从帐户行确定哪个身份验证插件适用于客户端:

  • 如果服务器找不到插件,就会出现错误,连接尝试被拒绝。

  • 否则,服务器将调用该插件来验证用户,插件将向服务器返回一个状态,表明用户是否提供了正确的密码,是否允许连接。

可插拔身份验证支持以下重要功能:

  • 选择身份验证方法。可插入式身份验证使dba可以轻松地选择和更改用于个人MySQL帐户的身份验证方法。

  • 外部认证。可插式身份验证使客户端能够使用与身份验证方法(将证书存储在其他地方而不是数据库中)相适应的证书连接到MySQL服务器mysql.user系统表。例如,可以创建插件来使用外部身份验证方法,例如PAM、Windows登录id、LDAP或Kerberos。

  • 代理用户:如果允许用户连接,认证插件可以返回给服务器一个不同于正在连接用户的用户名,以表明正在连接的用户是另一个用户(被代理用户)的代理。当连接持续时,为了访问控制的目的,代理用户被视为具有代理用户的特权。实际上,一个用户模拟另一个用户。有关更多信息,请参见第4.18节,“代理用户”

请注意

如果使用——skip-grant-tables选项,即使加载了身份验证插件,也不会使用,因为服务器不执行客户端身份验证,并允许任何客户端连接。因为这是不安全的,如果服务器以——skip-grant-tables选项,它还通过启用来禁用远程连接skip_networking

提供身份验证插件

MySQL 8.0提供了以下认证插件:

请注意

有关使用可插入身份验证的当前限制(包括哪些连接器支持哪些插件)的信息,请参见可插拔认证限制

第三方连接器开发人员应该阅读该部分,以确定连接器可以在多大程度上利用可插入的身份验证功能,以及采取哪些步骤来变得更加兼容。

如果您对编写自己的身份验证插件感兴趣,请参见写作身份验证插件

默认的认证插件

创建用户而且改变用户语句具有指定如何验证帐户的语法。这种语法的某些形式并不显式地命名身份验证插件。例如:

创建用户jeffrey @ localhost IDENTIFIED BY密码”;

在这种情况下,服务器将默认的身份验证插件分配给该帐户。的值为默认值default_authentication_plugin系统变量。

身份验证插件的使用

本节提供安装和使用身份验证插件的一般说明。有关特定于某个插件的说明,请参阅下面描述该插件的部分第6.1节,“认证插件”

通常,可插入身份验证在服务器端和客户端使用一对相应的插件,所以你使用这样一个给定的身份验证方法:

  • 如果需要,安装插件库或包含适当插件的库。在服务器主机上,安装包含服务器端插件的库,以便服务器可以使用它对客户机连接进行身份验证。类似地,在每个客户端主机上,安装包含客户端插件的库,供客户端程序使用。不需要安装内置的身份验证插件。

  • 对于您创建的每个MySQL帐户,指定用于身份验证的适当的服务器端插件。如果帐户要使用默认的认证插件,account-creation语句不需要显式指定插件。服务器分配默认的身份验证插件,如默认的认证插件

  • 当客户端连接时,服务器端插件告诉客户端程序使用哪个客户端插件进行身份验证。

如果帐户使用了服务器和客户端程序默认的认证方法,则服务器不需要与使用的客户端插件的客户端通信,从而避免了客户端和服务器之间的双向协商。

对于标准的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中引入的插件。(这个问题在MySQL 5.7中解决,5.7.23,当caching_sha2_password客户端支持添加到MySQL客户端库和客户端程序。)

  • 使用MySQL 5.7客户端连接到认证为mysql_old_password.这种做法失败的原因有很多。首先,这种联系需要——secure-auth = 0,这不再是一个受支持的选项。即使它被支持,5.7客户端也不能识别这个插件,因为它在MySQL 5.7中被删除了。

  • 使用MySQL 5.7客户端从Community分发版连接到MySQL 5.7企业服务器帐户,该帐户使用企业专用LDAP认证插件之一进行认证。这将失败,因为Community客户端无法访问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

  • 客户端加载服务器指定插件的唯一时间是在更改插件请求时,但在这种情况下,它可以是任何插件,取决于用户帐户。在这种情况下,客户端必须尝试加载插件,如果插件不可用,则错误是不可选的。

可插拔认证限制

本节的第一部分描述了关于可插入身份验证框架适用性的一般限制第4.17节,“可插入身份验证”.第二部分描述了第三方连接器开发人员如何确定连接器可以在多大程度上利用可插入身份验证功能,以及采取哪些步骤使其更加兼容。

这个词本地身份验证方法中存储的密码用于身份验证mysql.user系统表。在实现可插入身份验证之前,这与旧MySQL服务器提供的身份验证方法相同。Windows本地身份验证指使用已经登录到Windows的用户的凭证进行身份验证,由Windows原生身份验证插件(窗口插件短)。

通用可插拔身份验证限制

  • 连接器/ c++:使用此连接器的客户端只能通过使用本机身份验证的帐户连接到服务器。

    例外:如果构建连接器是要链接的,则连接器支持可插入身份验证libmysqlclient动态地(而不是静态地)加载当前版本的libmysqlclient如果安装了该版本,或者连接器从源代码重新编译为针对当前链接libmysqlclient

    有关编写连接器来处理来自服务器的关于默认服务器端身份验证插件的信息的信息,请参见身份验证插件编写连接器的注意事项

  • 连接器/网:使用Connector/NET的客户端可以通过使用本机身份验证或Windows本机身份验证的帐户连接到服务器。

  • 连接器/ PHP:使用此连接器的客户端只能通过使用本机身份验证的帐户连接到服务器,当使用MySQL本机驱动程序编译PHP (mysqlnd).

  • Windows本地身份验证:通过使用Windows插件的帐户连接需要安装Windows Domain。如果没有它,则使用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客户端程序,如mysql而且mysqladmin实现一个——plugin-dir选择。另请参阅C API客户端插件接口

  • 如本节前面所述,连接器对代理用户的支持取决于它支持的身份验证方法是否允许代理用户。