6.2.13 可插拔身份验证

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

  • 如果服务器找不到插件,则会发生错误并且连接尝试将被拒绝。

  • 否则,服务器将调用该插件以对用户进行身份验证,并且该插件会向服务器返回一个状态,指示用户是否提供了正确的密码并被允许连接。

可插拔身份验证启用以下重要功能:

  • 选择身份验证方法. 可插拔身份验证使 DBA 可以轻松选择和更改用于单个 MySQL 帐户的身份验证方法。

  • 外部身份验证. 可插入身份验证使 Client 端可以使用适合于身份验证方法的凭据连接到 MySQL 服务器,该身份验证方法将凭据存储在mysql.user系统 table 以外的其他位置。例如,可以创建插件以使用外部身份验证方法,例如 PAM,Windows 登录 ID,LDAP 或 Kerberos。

  • 代理用户: 如果允许用户连接,身份验证插件可以向服务器返回与连接用户名称不同的用户名,以指示连接用户是另一个用户的代理(代理)用户)。在连接持续的同时,出于访问控制的目的,将代理用户视为具有代理用户的特权。实际上,一个用户冒充了另一个用户。有关更多信息,请参见第 6.2.14 节“代理用户”

Note

如果使用--skip-grant-tables选项启动服务器,则即使加载了身份验证插件也不会使用,因为服务器不执行 Client 端身份验证并允许任何 Client 端连接。因为这是不安全的,所以您可能需要结合使用--skip-grant-tables和启用skip_networking系统变量来防止远程 Client 端连接。

可用的身份验证插件

MySQL 5.7 提供了以下身份验证插件:

Note

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

第三方连接器开发人员应阅读该部分,以确定连接器可以在何种程度上利用可插拔身份验证功能,以及应采取哪些步骤使其更加合规。

如果您有兴趣编写自己的身份验证插件,请参阅第 28.2.4.9 节“编写身份验证插件”

身份验证插件的使用

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

通常,可插入身份验证在服务器端和 Client 端使用一对相应的插件,因此您使用如下给定的身份验证方法:

  • 如有必要,安装一个或多个包含适当插件的库。在服务器主机上,安装包含服务器端插件的库,以便服务器可以使用它来验证 Client 端连接。同样,在每个 Client 端主机上,安装包含 Client 端插件的库,供 Client 端程序使用。不需要安装内置的身份验证插件。

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

  • 当 Client 端连接时,服务器端插件告诉 Client 端程序哪个 Client 端插件用于身份验证。

如果帐户使用服务器和 Client 端程序默认的身份验证方法,则服务器无需与 Client 端进行通信,以使用哪个 Client 端插件,Client 端/服务器协商中的往返行程可以是避免。对于使用本机 MySQL 身份验证的帐户而言,这是正确的。

对于标准的 MySQLClient 端(例如mysqlmysqladmin),可以在命令行上指定--default-auth=plugin_name选项,以提示程序可以使用哪个 Client 端插件,尽管如果服务器端插件与之关联,服务器将覆盖此选项。该用户帐户需要使用其他 Client 端插件。

如果 Client 端程序找不到 Client 端插件库文件,请指定--plugin-dir=dir_name选项以指示插件库目录位置。

可插入身份验证的限制

本节的第一部分描述了对在第 6.2.13 节“可插入身份验证”处描述的可插入身份验证框架的适用性的一般限制。第二部分介绍了第三方连接器开发人员如何确定连接器可以利用可插拔身份验证功能的程度,以及采取哪些步骤使其更加合规。

此处使用的术语“本地认证”是指针对mysql.user系统 table 中存储的密码进行认证。在实现可插入身份验证之前,这与旧版 MySQL 服务器提供的身份验证方法相同。 “ Windows 本机身份验证”是指使用已经登录 Windows 的用户的凭据进行的身份验证,这由 Windows 本机身份验证插件(简称“ Windows 插件”)实现。

一般可插拔身份验证限制
  • Connector/C: 使用此连接器的 Client 端只能通过使用本机身份验证的帐户连接到服务器。

exception:如果连接器被构建为可动态(而非静态)链接到libmysqlclient,并且已安装libmysqlclient的当前版本(如果已安装该版本),或者如果将连接器从源重新编译为针对当前libmysqlclient进行链接,则它支持可插入身份验证。

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

  • 连接器/ PHP: 使用针对 PHP(mysqlnd)的 MySQL 本机驱动程序进行编译时,使用此连接器的 Client 端只能通过使用本机身份验证的帐户连接到服务器。

  • Windows 本机身份验证: 通过使用 Windows 插件的帐户进行连接需要 Windows 域设置。没有它,将使用 NTLM 身份验证,然后只能进行本地连接。也就是说,Client 端和服务器必须在同一台计算机上运行。

  • 代理用户: 在 Client 端可以通过使用实现代理用户功能的插件(即,可以返回与连接用户的用户名不同的用户名)的插件进行身份验证的帐户进行连接的范围内,可以使用代理用户支持。例如,PAM 和 Windows 插件支持代理用户。默认情况下,mysql_native_passwordsha256_password身份验证插件不支持代理用户,但可以配置为支持代理用户。参见服务器对代理用户 Map 的支持

  • 复制 :复制从属服务器不仅可以使用本地身份验证来使用主帐户,而且还可以通过使用 nonlocal 身份验证的主帐户进行连接(如果所需的 Client 端插件可用)。如果插件内置于libmysqlclient,则默认情况下可用。否则,必须将插件安装在从属方的从属plugin_dir系统变量命名的目录中。

  • FEDERATEDtable: FEDERATEDtable 只能通过使用本地身份验证的远程服务器上的帐户访问远程 table。

可插拔身份验证和第三方连接器

第三方连接器开发人员可以使用以下准则来确定连接器的就绪状态,以利用可插入的身份验证功能以及应采取哪些步骤使其更加合规:

  • 没有进行任何更改的现有连接器使用本机身份验证,使用该连接器的 Client 端只能通过使用本机身份验证的帐户连接到服务器。 但是,您应该针对服务器的最新版本测试连接器,以验证此类连接仍然可以正常工作.

exception:如果连接器动态(而不是静态)链接到libmysqlclient,并且如果安装了该版本,则它将加载libmysqlclient的当前版本,而该连接器可以与可插入身份验证一起使用,而无需进行任何更改。

  • 要利用可插入身份验证功能,应将基于libmysqlclient的连接器重新链接到当前版本的libmysqlclient。这样,连接器就可以支持需要现在已内置到libmysqlclient的 Client 端插件的帐户(例如,PAM 身份验证所需的明文插件和 Windows 本机身份验证所需的 Windows 插件)的连接。与当前libmysqlclient链接还可以使连接器访问默认 MySQL 插件目录(通常由本地服务器的plugin_dir系统变量的默认值命名的目录)中安装的 Client 端插件。

如果连接器动态链接到libmysqlclient,则必须确保在 Client 端主机上安装了libmysqlclient的较新版本,并确保连接器在运行时加载它。

  • 连接器支持给定身份验证方法的另一种方法是直接在 Client 端/服务器协议中实现它。连接器/ NET 使用这种方法来提供对 Windows 本机身份验证的支持。

  • 如果连接器应该能够从不同于默认插件目录的目录中加载 Client 端插件,则它必须为 Client 端用户提供一些方法来指定目录。这样做的可能性包括命令行选项或环境变量,连接器可从中获取目录名称。标准的 MySQLClient 端程序(例如mysqlmysqladmin)实现--plugin-dir选项。另请参见第 27.7.13 节“ C APIClient 端插件功能”

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