Documentation Home

6.2.11 可插拔认证

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

  • 如果服务器找不到插件,则会发生错误并拒绝连接尝试。否则,如果帐户行指定了一个插件,服务器将调用它来验证用户。

  • 如果帐户行未指定插件名称,则服务器使用 mysql_native_passwordmysql_old_password插件对帐户进行身份验证,具体取决于 Password列中的密码哈希值是使用本机哈希还是旧的 4.1 之前的哈希方法。客户必须匹配Password帐户行列中的密码。

该插件向服务器返回一个状态,指示用户是否提供了正确的密码并被允许连接。

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

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

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

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

笔记

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

可用的身份验证插件

MySQL 5.6 提供了这些身份验证插件:

笔记

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

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

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

身份验证插件使用

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

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

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

  • 对于您创建的每个 MySQL 帐户,指定适当的服务器端插件以用于身份验证。如果帐户要使用默认的身份验证插件,则帐户创建语句不需要明确指定插件。该 --default-authentication-plugin 选项配置默认身份验证插件。

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

如果帐户使用服务器和客户端程序默认的身份验证方法,则服务器无需与客户端通信使用哪个客户端插件,并且可以在客户端/服务器协商中进行往返避免了。这适用于使用本机 MySQL 身份验证的帐户。

对于标准的 MySQL 客户端,如mysqlmysqladmin, 可以在命令行上指定选项作为程序可以使用哪个客户端插件的提示,尽管如果服务器端插件与用户关联,服务器会覆盖它帐户需要不同的客户端插件。 --default-auth=plugin_name

如果客户端程序没有找到客户端插件库文件,则指定一个 选项来指示插件库目录位置。 --plugin-dir=dir_name

可插入身份验证的限制

本节的第一部分描述了第 6.2.11 节“可插入身份验证”中描述的可插入身份验证框架的适用性的一般限制。第二部分描述了第三方连接器开发人员如何确定连接器可以在多大程度上利用可插入的身份验证功能以及采取哪些步骤来变得更加合规。

此处使用的术语本机身份验证是指针对存储在 系统表Password列中的 密码进行身份验证。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 5.6.4 之前,副本只能通过使用本机身份验证的源帐户连接到源服务器。从 5.6.4 开始,如果所需的客户端插件可用,副本也可以通过使用非本地身份验证的源帐户进行连接。如果插件内置于 libmysqlclient中,则默认可用。否则,插件必须安装在副本 plugin_dir系统变量命名的目录中的副本端。

  • FEDERATED tables:FEDERATED 只能通过远程服务器上使用本机身份验证的帐户访问远程表。

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

第三方连接器开发人员可以使用以下准则来确定连接器是否准备好利用可插入身份验证功能以及采取哪些步骤来变得更加合规:

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

    例外:如果连接器 libmysqlclient动态(而不是静态)链接到并加载当前版本( libmysqlclient如果安装了该版本),则连接器可能无需任何更改即可使用可插入身份验证。

  • 要利用可插入的身份验证功能,libmysqlclient基于 libmysqlclient. 这使连接器能够支持通过现在内置的需要客户端插件的帐​​户进行连接 libmysqlclient(例如 PAM 身份验证所需的明文插件和 Windows 本机身份验证所需的 Windows 插件)。与当前链接libmysqlclient还使连接器能够访问安装在默认 MySQL 插件目录中的客户端插件(通常是本地服务器的默认值命名的目录) plugin_dir系统变量)。

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

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

  • 如果连接器应该能够从与默认插件目录不同的目录加载客户端插件,则它必须实现一些方法让客户端用户指定目录。这可能包括命令行选项或环境变量,连接器可以从中获取目录名称。mysqlmysqladmin等标准 MySQL 客户端程序实现了一个 --plugin-dir选项。另请参阅 C API 客户端插件接口

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