Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  ...  /  LDAP Pluggable Authentication

8.4.1.7 LDAP 插件式认证

Note

LDAP插件式认证是MySQL Enterprise Edition的一种扩展,一个商业产品。要了解更多关于商业产品,请见https://www.mysql.com/products/

MySQL Enterprise Edition支持一种认证方法,使得MySQL Server可以使用LDAP(轻量级目录访问协议)来验证MySQL用户,通过访问X.500目录服务。MySQL使用LDAP来获取用户、凭证和组信息。

LDAP插件式认证提供以下功能:

  • 外部身份验证:LDAP身份验证使得MySQL Server可以接受来自LDAP目录中的用户定义的连接请求。

  • 代理用户支持:LDAP身份验证可以根据LDAP组返回到MySQL一个不同的用户名,而不是客户端程序传递的外部用户名,这意味着LDAP插件可以返回MySQL用户,该用户定义了外部LDAP认证用户应该拥有的权限。例如,LDAP用户joe可以连接,并拥有名为developer的MySQL用户的权限,如果joe的LDAP组是developer

  • 安全性:使用TLS,可以使得对LDAP服务器的连接变得安全。

提供了简单和SASL-基于LDAP身份验证的服务器和客户端插件。在Microsoft Windows上,SASL-基于LDAP身份验证的服务器插件不受支持,但客户端插件是可用的。

以下表格显示了简单和SASL-Based LDAP身份验证的插件和库文件名称。文件名后缀可能在您的系统上不同。这些文件必须位于由plugin_系统变量指定的目录中。

表8.21:简单LDAP身份验证插件和库名称

Plugin or File Plugin or File Name
服务器端插件名称 authentication_ldap_simple
客户端插件名称 mysql_clear_password
库文件名称 authentication_ldap_simple.so

表8.22:SASL-Based LDAP身份验证插件和库名称

Plugin or File Plugin or File Name
服务器端插件名称 authentication_ldap_sasl
客户端插件名称 authentication_ldap_sasl_client
库文件名称 authentication_ldap_sasl.so, authentication_ldap_sasl_client.so

库文件只包含authentication_ldap_XXX身份验证插件。客户端插件mysql_clear_password是libmysqlclient客户端库的一部分。

每个服务器端LDAP插件都与特定的客户端插件一起工作:

  • 服务器端authentication_ldap_simple插件执行简单LDAP身份验证。对于使用该插件的账户,客户端程序使用客户端mysql_clear_password插件,该插件将密码发送到服务器作为明文。没有使用密码哈希或加密,因此建议在MySQL客户端和服务器之间建立安全连接以防止密码泄露。

  • 服务器端authentication_ldap_sasl插件执行基于SASL的LDAP身份验证。对于使用该插件的账户,客户端程序使用客户端authentication_ldap_sasl_client插件。客户端和服务器端SASL LDAP插件使用SASL消息在LDAP协议中安全地传输凭证,以避免在MySQL客户端和服务器之间发送明文密码。

    在Microsoft Windows平台上,支持了基于SASL的LDAP身份验证的服务器插件和客户端插件。

服务器端LDAP身份验证插件仅在MySQL Enterprise Edition中包含,不包括MySQL社区发行版。客户端SASL LDAP插件在所有发行版中包含,并且,如前所述,客户端mysql_clear_password插件是libmysqlclient客户端库的一部分,该库也在所有发行版中包含。这使得来自任何分布的客户端可以连接到具有相应服务器插件加载的服务器。

以下节提供了LDAP可插拔身份验证的安装和使用信息:

关于 MySQL 可插拔身份验证的总体信息,请参阅第8.2.17节,“可插拔身份验证”。关于mysql_清除密码插件,请参阅第8.4.1.4节,“客户端明文可插拔身份验证”。关于代理用户信息,请参阅第8.2.19节,“代理用户”

Note

如果您的系统支持PAM并允许LDAP作为PAM身份验证方法,另一种使用LDAP进行MySQL用户身份验证的方式是使用服务器端authentication_pam插件。请参阅第8.4.1.5节,“PAM Pluggable Authentication”

LDAP插件式认证的前提条件

要使用MySQL的LDAP插件式认证,必须满足以下前提条件:

  • LDAP服务器必须可用,以便LDAP身份验证插件与其通信。

  • 将要由MySQL认证的LDAP用户必须存在于LDAP服务器所管理的目录中。

  • 在使用服务器端authentication_ldap_saslauthentication_ldap_simple插件的系统上,必须可用LDAP客户端库。当前支持的库包括Windows本机LDAP库和非Windows系统上的OpenLDAP库。

  • 要使用基于SASL的LDAP身份验证:

    • LDAP服务器必须配置为与SASL服务器通信。

    • 在使用客户端authentication_ldap_sasl_client插件的系统上,必须可用SASL客户端库。当前唯一支持的库是Cyrus SASL库。

    • 要使用特定的SASL身份验证方法,需要该方法所需的其他服务。例如,要使用GSSAPI/Kerberos,需要GSSAPI库和Kerberos服务可用。

本节提供了 MySQL 和 LDAP 之间如何协同身份验证的概述。有关设置 MySQL 账户以使用特定 LDAP 身份验证插件的示例,请见使用 LDAP 可插拔身份验证。有关 LDAP 插件可用的身份验证方法,请见LDAP 身份验证方法

客户端连接到 MySQL 服务器,提供 MySQL 客户端用户名和密码:

  • 对于简单的 LDAP 身份验证,客户端和服务器插件将密码作为明文传输。建议在 MySQL 客户端和服务器之间建立安全连接,以防止密码泄露。

  • 对于基于 SASL 的 LDAP 身份验证,客户端和服务器插件避免在 MySQL 客户端和服务器之间发送明文密码。例如,插件可能使用 SASL 消息来安全地传输凭证,以便在 LDAP 协议中进行身份验证。对于 GSSAPI 身份验证方法,客户端和服务器插件使用 Kerberos 进行安全通信,而不直接使用 LDAP 消息。

如果客户端用户名和主机名与 MySQL 账户无匹配项,则连接将被拒绝。

如果存在匹配的 MySQL 账户,身份验证将对 LDAP 进行。LDAP 服务器将查找匹配用户并对其进行身份验证,以便使用 LDAP 密码:

  • 如果MySQL账户指定了LDAP用户 distinguished name(DN),LDAP身份验证将使用该值和客户端提供的LDAP密码。 (要将LDAP用户 DN与MySQL账户关联,包括在CREATE USER语句中指定认证字符串的BY子句,以创建该账户。)

  • 如果MySQL账户没有指定LDAP用户 DN,LDAP身份验证将使用客户端提供的用户名和LDAP密码。在这种情况下,身份验证插件首先使用root DN和密码作为凭据连接到LDAP服务器,然后根据客户端用户名找到用户 DN,并对该用户 DN进行LDAP密码认证。如果root DN和密码设置错误或为空(未设置),并且LDAP服务器不允许匿名连接,则绑定操作失败。

如果LDAP服务器找不到匹配或多个匹配,身份验证失败,客户端连接被拒绝。

如果LDAP服务器找到单个匹配,LDAP身份验证成功(假设密码正确),LDAP服务器返回LDAP条目,身份验证插件根据该条目确定已认证用户的名称:

  • 如果LDAP条目具有组属性(默认情况下是cn属性),插件将其值作为已认证用户名返回。

  • 如果LDAP条目没有组属性,身份验证插件将客户端用户名作为已认证用户名返回。

MySQL服务器将客户端用户名与已认证用户名进行比较,以确定是否对客户端会话进行代理:

  • 如果名称相同,无需代理:使用匹配客户端用户名的MySQL账户进行权限检查。

  • 如果用户名不同,代理将发生:MySQL 将查找匹配已验证用户名称的账户。该账户将成为代理用户,用于权限检查。 MySQL 匹配客户端用户名的账户被视为外部代理用户。

安装 LDAP 插件式认证

本节描述了如何安装服务器端 LDAP 认证插件。关于安装插件的总体信息,请见第7.6.1节,“Installing and Uninstalling Plugins”

为了使插件库文件可供服务器使用,插件库文件必须位于 MySQL 插件目录(由plugin_ dir系统变量指定的目录)中。如果必要,可以在服务器启动时设置插件目录位置,通过将plugin_ dir的值设置为所需的路径。

服务器端插件库文件的基本名称是authentication_ldap_simpleauthentication_ldap_sasl。文件名后缀根据平台不同(例如,Unix 和 Unix 类似系统中为.so,Windows 中为.dll)。

Note

在 Microsoft Windows 上,SASL 基于 LDAP 认证的服务器插件不受支持,但客户端插件受支持。在其他平台上,both 服务器和客户端插件都受支持。

在服务器启动时加载插件,使用--plugin-load-add选项指定包含它们的库文件。使用此插件加载方法,每次启动服务器都需要给出这些选项。此外,还需指定任何插件提供的系统变量的值。

每个 LDAP 插件 expose 一组系统变量,用于配置其操作。设置大多数这些变量是可选的,但您必须设置指定 LDAP 服务器主机(使插件知道连接目标)和 LDAP 绑定操作的基础 distinguished name(限制搜索范围并获得更快的搜索)的变量。有关所有 LDAP 系统变量的详细信息,请见第8.4.1.13节,“可插拔身份验证系统变量”

要加载插件并设置 LDAP 服务器主机和 LDAP 绑定操作的基础 distinguished name,请将类似于这些行添加到您的my.cnf文件中,根据平台调整.so后缀为必要:

[mysqld]
plugin-load-add=authentication_ldap_simple.so
authentication_ldap_simple_server_host=127.0.0.1
authentication_ldap_simple_bind_base_dn="dc=example,dc=com"
plugin-load-add=authentication_ldap_sasl.so
authentication_ldap_sasl_server_host=127.0.0.1
authentication_ldap_sasl_bind_base_dn="dc=example,dc=com"

修改完毕my.cnf文件后,重新启动服务器以使新的设置生效。

或者,在运行时加载插件,可以使用这些语句,根据平台调整.so后缀为必要:

INSTALL PLUGIN authentication_ldap_simple
  SONAME 'authentication_ldap_simple.so';
INSTALL PLUGIN authentication_ldap_sasl
  SONAME 'authentication_ldap_sasl.so';

INSTALL PLUGIN 将插件立即加载,并将其注册到 mysql.plugins 系统表中,以便在每次正常启动时不需要使用--plugin-load-add

在运行时安装插件后,这些插件暴露的系统变量将可用,您可以将其添加到您的 my.cnf 文件中,以便在下次重启时配置插件。例如:

[mysqld]
authentication_ldap_simple_server_host=127.0.0.1
authentication_ldap_simple_bind_base_dn="dc=example,dc=com"
authentication_ldap_sasl_server_host=127.0.0.1
authentication_ldap_sasl_bind_base_dn="dc=example,dc=com"

修改完毕 my. cnf 后,重新启动服务器以使新设置生效。

要在运行时而不是在启动时设置和持久每个值,请使用以下语句:

SET PERSIST authentication_ldap_simple_server_host='127.0.0.1';
SET PERSIST authentication_ldap_simple_bind_base_dn='dc=example,dc=com';
SET PERSIST authentication_ldap_sasl_server_host='127.0.0.1';
SET PERSIST authentication_ldap_sasl_bind_base_dn='dc=example,dc=com';

SET PERSIST 将值设置为当前 MySQL 实例。它还将保存该值,使其在下次重启时继续生效。要更改当前 MySQL 实例的值而不使其在下次重启时继续生效,请使用 GLOBAL 关键字,而不是 PERSIST。请参阅第15.7.6.1节,“SET 语法用于变量赋值”

验证插件安装,查看信息_schema中的PLUGINS表或使用SHOW PLUGINS语句(见第7.6.2节,“获取服务器插件信息”)。例如:

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
       FROM INFORMATION_SCHEMA.PLUGINS
       WHERE PLUGIN_NAME LIKE '%ldap%';
+----------------------------+---------------+
| PLUGIN_NAME                | PLUGIN_STATUS |
+----------------------------+---------------+
| authentication_ldap_sasl   | ACTIVE        |
| authentication_ldap_simple | ACTIVE        |
+----------------------------+---------------+

如果插件无法初始化,请检查服务器错误日志以获取诊断消息。

要将 MySQL 账户与 LDAP 插件关联,请见Using LDAP Pluggable Authentication

Additional Notes for SELinux

在运行 EL6 或 EL 的系统上,如果 SELinux 已启用,需要更改 SELinux 策略以使 MySQL LDAP 插件能够与 LDAP 服务通信:

  1. 创建文件mysqlldap.te,内容如下:

    module mysqlldap 1.0;
    
    require {
            type ldap_port_t;
            type mysqld_t;
            class tcp_socket name_connect;
    }
    
    #============= mysqld_t ==============
    
    allow mysqld_t ldap_port_t:tcp_socket name_connect;
  2. 将安全策略模块编译成二进制表示形式:

    checkmodule -M -m mysqlldap.te -o mysqlldap.mod
  3. 创建 SELinux 策略模块包:

    semodule_package -m mysqlldap.mod  -o mysqlldap.pp
  4. 安装模块包:

    semodule -i mysqlldap.pp
  5. 在更改 SELinux 策略后,重新启动 MySQL 服务器:

    service mysqld restart
卸载 LDAP 插件式认证

卸载 LDAP 认证插件的方法取决于您如何安装它们:

  • 如果使用--plugin-load-add选项在服务器启动时安装插件,请重新启动服务器而不使用这些选项。

  • 如果使用INSTALL PLUGIN在运行时安装插件,他们将在服务器重启后保持安装状态。要卸载它们,请使用UNINSTALL PLUGIN

    UNINSTALL PLUGIN authentication_ldap_simple;
    UNINSTALL PLUGIN authentication_ldap_sasl;

此外,在您的my. cnf文件中删除任何设置LDAP插件相关系统变量的启动选项。如果您使用SET PERSIST来持久化LDAP系统变量,请使用RESET PERSIST来删除设置。

LDAP 插件式认证和ldap.conf

对于使用OpenLDAP的安装,ldap.conf文件提供了LDAP客户端的全局默认值。可以在这个文件中设置选项,以影响LDAP客户端,包括LDAP身份验证插件。OpenLDAP使用以下顺序来确定配置选项的优先级:

  • 由LDAP客户端指定的配置。

  • ldap.conf文件中指定的配置。如果要禁用这个文件,请设置环境变量LDAPNOINIT

  • OpenLDAP库中的默认值。

如果库默认值或ldap.conf值不能产生合适的选项值,LDAP身份验证插件可能可以设置相关变量,以直接影响LDAP配置。例如,LDAP插件可以override ldap.conf以设置以下参数:

关于ldap.conf的更多信息,请参阅ldap.conf(5)手册页。

设置 LDAP 插件式认证超时

为了 MySQL 账户使用 LDAP 插件式认证连接到 MySQL 服务器,LDAP 服务器必须可用和操作正常。MySQL 服务器与 LDAP 服务器之间的交互涉及两个步骤。首先,MySQL 服务器通过 TCP 建立对 LDAP 服务器的连接。然后,MySQL 服务器将 LDAP 绑定请求发送到 LDAP 服务器,并等待回复后 authenticate 账户。如果任何一步失败,MySQL 账户就不能连接到 MySQL 服务器。

短暂超时时间将默认应用于连接和响应步骤,超时时间将在所有情况下超时后通知账户用户无法连接到MySQL。如果需要更多信息,可以在客户端和服务器端进行日志记录。在客户端-side,可以通过设置环境变量来提高详细级别,然后重新启动MySQL客户端:

AUTHENTICATION_LDAP_CLIENT_LOG=5
export AUTHENTICATION_LDAP_CLIENT_LOG

以下系统变量支持Linux平台上的SASL-基于和简单LDAP身份验证的默认超时时间。

表8.23:SASL-基于和简单LDAP身份验证系统变量


LDAP身份验证的超时时间可以在服务器启动和运行时进行调整。如果使用这些变量将超时时间设置为零,您实际上是将其停用,MySQL服务器将重新使用主机系统的默认超时时间。

Note

在以下组合条件下,实际等待时间将因为(内部)服务器必须两次调用TCP连接而翻倍:

  • LDAP 服务器离线。

  • authentication_ldap_sasl_connect_timeout 的值大于零。

  • 使用连接池(特别是authentication_ldap_sasl_max_pool_size系统变量的值大于零,启用了池化)。

使用 LDAP 插件式认证

本节描述了如何使 MySQL 账户使用 LDAP 插件式认证连接到 MySQL 服务器。假设服务器正在运行适当的服务器端插件,正如安装 LDAP 插件式认证中所述,并且客户端主机上有适当的客户端插件可用。

本节不描述 LDAP 配置或管理。您被假设熟悉这些主题。

两个服务器端 LDAP 插件各自与特定的客户端插件工作:

  • 服务器端authentication_ldap_simple插件执行简单LDAP身份验证。对于使用该插件的账户,客户端程序使用客户端mysql_clear_password插件,该插件将密码发送到服务器作为明文。没有使用密码哈希或加密,因此建议在MySQL客户端和服务器之间建立安全连接以防止密码泄露。

  • 服务器端authentication_ldap_sasl插件执行基于SASL的LDAP身份验证。对于使用该插件的账户,客户端程序使用客户端authentication_ldap_sasl_client插件。客户端和服务器端SASL LDAP插件使用SASL消息在LDAP协议中安全地传输凭证,以避免在MySQL客户端和服务器之间发送明文密码。

MySQL用户LDAP身份验证的总体要求:

  • 对于每个要被身份验证的用户,必须存在一个LDAP目录条目。

  • 对于每个账户,必须存在一个指定服务器端LDAP身份验证插件且可选地指定关联LDAP用户 distinguished name(DN)的MySQL用户账户。 (为将LDAP用户 DN 关联到 MySQL 账户,请在CREATE USER语句中创建账户时包括一个BY子句。如果账户未指定 LDAP 字符串,LDAP 身份验证将使用客户端指定的用户名来查找 LDAP 条目。)

  • 客户端程序使用适合服务器端身份验证插件的连接方法连接。对于LDAP身份验证,连接需要MySQL用户名和LDAP密码。此外,对于使用服务器端authentication_ldap_simple插件的账户,可以使用--enable-cleartext-plugin选项来启用客户端mysql_clear_password插件。

以下假设场景:

  • MySQL用户betsyboris使用LDAP条目betsy_ldapboris_ldap进行身份验证。 (不需要MySQL和LDAP用户名不同。在讨论中使用不同的名称帮助clarify是否操作上下文是MySQL或LDAP。)

  • LDAP条目使用uid属性指定用户名。这可能取决于LDAP服务器。一些LDAP服务器使用cn属性而不是uid。要更改属性,请修改authentication_ldap_simple_user_search_attrauthentication_ldap_sasl_user_search_attr系统变量。

  • 这些LDAP条目在LDAP服务器管理的目录中可用,提供了每个用户的 distinguished name 值,这些值唯一标识每个用户:

    uid=betsy_ldap,ou=People,dc=example,dc=com
    uid=boris_ldap,ou=People,dc=example,dc=com
  • CREATE USER 语句创建 MySQL 账户,使用 LDAP 用户在 BY 子句中指定,表示 MySQL 账户对 LDAP 入口进行身份验证。

设置使用 LDAP 认证的账户需要根据服务器端 LDAP 插件的不同情况。以下几节描述了多种使用场景。

为简单 LDAP 认证配置 MySQL 账户,CREATE USER 语句指定 authentication_ldap_simple 插件,并可选地指定 LDAP 用户 distinguished name(DN):

CREATE USER user
  IDENTIFIED WITH authentication_ldap_simple
  [BY 'LDAP user DN'];

假设 MySQL 用户 betsy 在 LDAP 目录中有以下条目:

uid=betsy_ldap,ou=People,dc=example,dc=com

然后,创建 betsy 的 MySQL 账户语句如下:

CREATE USER 'betsy'@'localhost'
  IDENTIFIED WITH authentication_ldap_simple
  AS 'uid=betsy_ldap,ou=People,dc=example,dc=com';

BY 子句中指定的认证字符串不包括 LDAP 密码。客户端用户必须在连接时提供该密码。

客户端连接到 MySQL 服务器,提供 MySQL 用户名和 LDAP 密码,并启用客户端 mysql_clear_password 插件:

$> mysql --user=betsy --password --enable-cleartext-plugin
Enter password: betsy_password (betsy_ldap LDAP password)
Note

客户端 mysql_clear_password 认证插件将密码保持不变,因此客户端程序将其发送到 MySQL 服务器作为明文。这样可以将密码传递给 LDAP 服务器。这在某些配置中可能是一个安全问题,但这些措施可以减少风险:

身份验证过程如下:

  1. 客户端插件将betsybetsy_密码发送到 MySQL 服务器作为客户端用户名和 LDAP 密码。

  2. 连接尝试匹配账户''betsy'@'localhost'。服务器插件找到该账户具有身份验证字符串'uid=betsy_ldap,ou=People,dc=example,dc=com'以命名 LDAP 用户 DN。插件将该字符串和 LDAP 密码发送到 LDAP 服务器。

  3. LDAP 服务器找到 LDAP 条目betsy_ldap,密码匹配,所以 LDAP 身份验证成功。

  4. LDAP 条目没有组属性,所以服务器插件将客户端用户名betsy返回为已身份验证的用户。这与客户端提供的用户名相同,因此不发生代理操作,客户会话使用账户''betsy'@'localhost''进行权限检查。

如果LDAP条目包含组属性,那么该属性值将是认证用户名称,如果该值与betsy不同,代理将发生。有关使用组属性的示例,请参阅LDAP身份验证与代理

如果CREATE USER语句中没有指定BY子句来指定 LDAP distinguished name,认证尝试将使用客户端提供的用户名(在本例中是 betsy)。如果LDAP条目不存在于 betsy中,认证将失败。

要为SASL LDAP身份验证配置MySQL账户,CREATE USER语句指定authentication_ldap_sasl插件,并可选地命名LDAP用户 distinguished name(DN):

CREATE USER user
  IDENTIFIED WITH authentication_ldap_sasl
  [BY 'LDAP user DN'];

假设MySQL用户boris在LDAP目录中有以下条目:

uid=boris_ldap,ou=People,dc=example,dc=com

然后,创建boris的MySQL账户语句如下:

CREATE USER 'boris'@'localhost'
  IDENTIFIED WITH authentication_ldap_sasl
  AS 'uid=boris_ldap,ou=People,dc=example,dc=com';

认证字符串指定在BY子句中不包括LDAP密码。客户端用户必须在连接时提供该密码。

客户端连接到MySQL服务器,提供MySQL用户名和LDAP密码:

$> mysql --user=boris --password
Enter password: boris_password (boris_ldap LDAP password)

为服务器端authentication_ldap_sasl插件,客户端使用客户端authentication_ldap_sasl_client插件。如果客户端程序找不到客户端插件,请指定一个--plugin-dir选项,该选项命名了插件库文件安装目录。

boris的身份验证过程类似于之前对betsy的简单LDAP身份验证,除了客户端和服务器端SASL LDAP插件使用SASL消息在LDAP协议中安全地传输凭证,以避免在MySQL客户端和服务器之间发送明文密码。

LDAP身份验证插件支持代理,允许用户连接到MySQL服务器作为一个用户,但假设另一个用户的权限。这部分描述了基本的LDAP插件代理支持。LDAP插件还支持组首选项和代理用户映射;请参阅LDAP身份验证组首选项和映射规范

以下描述的代理实现基于使用LDAP组属性值将通过LDAP身份验证连接到MySQL的用户映射到其他MySQL账户,这些账户定义不同的权限集。用户不直接连接到定义权限的账户,而是通过默认代理账户 authenticated with LDAP,以便所有外部登录都映射到持有权限的代理MySQL账户。任何使用代理账户连接的用户都会被映射到其中一个代理MySQL账户,该账户的权限确定对外部用户的数据库操作。

以下指令假设以下场景:

  • LDAP条目使用uidcn属性指定用户名和组值,分别。要使用不同的用户和组属性名称,请设置相应的插件特定系统变量:

  • 这些LDAP条目在LDAP服务器管理的目录中可用,以提供每个用户的 distinguished name 值,这些值唯一标识每个用户:

    uid=basha,ou=People,dc=example,dc=com,cn=accounting
    uid=basil,ou=People,dc=example,dc=com,cn=front_office

    连接时,组属性值变为认证用户名称,因此命名了accountingfront_office代理账户。

  • 示例假设使用SASL LDAP身份验证。对于简单LDAP身份验证,请进行相应的调整。

创建默认代理MySQL账户:

CREATE USER ''@'%'
  IDENTIFIED WITH authentication_ldap_sasl;

代理账户定义中没有AS 'auth_string'子句,以命名LDAP用户DN。因此:

  • 当客户端连接时,客户端用户名变为搜索的LDAP用户名。

  • 期望的LDAP条目包括一个组属性,命名了代理MySQL账户,该账户定义了客户端应该拥有的权限。

Note

如果您的MySQL安装中有匿名用户,他们可能与默认代理用户冲突。关于这个问题和解决方法,请见Default Proxy User and Anonymous User Conflicts

创建代理账户并授予每个账户应有的权限:

CREATE USER 'accounting'@'localhost'
  IDENTIFIED WITH mysql_no_login;
CREATE USER 'front_office'@'localhost'
  IDENTIFIED WITH mysql_no_login;

GRANT ALL PRIVILEGES
  ON accountingdb.*
  TO 'accounting'@'localhost';
GRANT ALL PRIVILEGES
  ON frontdb.*
  TO 'front_office'@'localhost';

代理账户使用mysql_no_login身份验证插件来防止客户端直接使用账户登录到 MySQL 服务器。相反,使用 LDAP 进行身份验证的用户需要使用默认的'@'%'代理账户。 (假设mysql_no_login插件已经安装。有关详细信息,请参阅第 8.4.1.9 节,“无登录可插拔身份验证”。) 对于保护代理账户的直接使用的 alternative 方法,请参阅防止代理账户直接登录

PROXY特权授予每个代理账户:

GRANT PROXY
  ON 'accounting'@'localhost'
  TO ''@'%';
GRANT PROXY
  ON 'front_office'@'localhost'
  TO ''@'%';

使用mysql命令行客户端连接到 MySQL 服务器作为basha

$> mysql --user=basha --password
Enter password: basha_password (basha LDAP password)

身份验证过程如下:

  1. 服务器使用默认的'@'%'代理账户对连接进行身份验证,为客户端用户basha

  2. LDAP 条目匹配为:

    uid=basha,ou=People,dc=example,dc=com,cn=accounting
  3. LDAP 条目具有组属性cn=accountingaccounting成为身份验证后的代理用户。

  4. 认证用户与客户端用户名basha不同,结果是basha被视为accounting的代理,并且basha继承了代理accounting账户的权限。以下查询返回显示结果:

    mysql> SELECT USER(), CURRENT_USER(), @@proxy_user;
    +-----------------+----------------------+--------------+
    | USER()          | CURRENT_USER()       | @@proxy_user |
    +-----------------+----------------------+--------------+
    | basha@localhost | accounting@localhost | ''@'%'       |
    +-----------------+----------------------+--------------+

这表明basha使用了授予代理accounting MySQL 账户的权限,并且代理是通过默认代理用户账户进行的。

现在连接为basil

$> mysql --user=basil --password
Enter password: basil_password (basil LDAP password)

basil的身份验证过程类似于之前描述的对basha的身份验证过程:

  1. 服务器使用默认''@'%'代理账户来验证连接,为客户端用户basil

  2. 匹配 LDAP 条目是:

    uid=basil,ou=People,dc=example,dc=com,cn=front_office
  3. 匹配的 LDAP 条目具有组属性cn=front_officefront_office成为认证代理用户。

  4. 认证用户与客户端用户名basil不同,结果是basil被视为front_office的代理,并且basil继承了代理front_office账户的权限。以下查询返回显示结果:

    mysql> SELECT USER(), CURRENT_USER(), @@proxy_user;
    +-----------------+------------------------+--------------+
    | USER()          | CURRENT_USER()         | @@proxy_user |
    +-----------------+------------------------+--------------+
    | basil@localhost | front_office@localhost | ''@'%'       |
    +-----------------+------------------------+--------------+

这表明basil使用了授予代理front_office MySQL 账户的权限,并且代理是通过默认代理用户账户进行的。

LDAP身份验证与代理中所述,基本的LDAP身份验证代理工作原理是插件使用LDAP服务器返回的第一个组名作为MySQL代理用户账户名称。这是一个简单的能力,不支持指定LDAP服务器返回多个组名时选择哪个组名,也不支持将组名以外的名称作为代理用户名称。

对于使用LDAP身份验证的MySQL账户,可以在身份验证字符串中指定以下信息以启用更高级别的代理灵活性:

  • 一个优先顺序列表,以便插件使用LDAP服务器返回的第一个组名在列表中的名称。

  • 从组名到代理用户名称的映射,以便当匹配组名时可以提供指定的名称作为代理用户。这为使用组名作为代理用户提供了替代方案。

请考虑以下MySQL代理账户定义:

CREATE USER ''@'%'
  IDENTIFIED WITH authentication_ldap_sasl
  AS '+ou=People,dc=example,dc=com#grp1=usera,grp2,grp3=userc';

身份验证字符串中有一个DN后缀ou=People,dc=example,dc=com,以+字符前缀。因此,如LDAP身份验证DN后缀中所述,完整的用户DN是从指定的用户DN后缀构建的,plus客户端用户名作为uid属性。

身份验证字符串的剩余部分从#开始,这标志着组首选项和映射信息的开始。这部分身份验证字符串按顺序列出组名,如grp1grp2grp3。LDAP插件将该列表与LDAP服务器返回的组名集进行比较,按照列表顺序查找匹配项。如果找到匹配项,插件使用第一个匹配项;否则身份验证失败。

假设LDAP服务器返回组grp3grp2grp7。LDAP插件使用grp2,因为它是身份验证字符串中第一个匹配的组,即使不是LDAP服务器返回的第一个组。如果LDAP服务器返回grp4grp2grp1,插件使用grp1,即使grp2也匹配。因为grp1在身份验证字符串中排列顺序更高于grp2

假设插件找到组名匹配项,它将对该组名进行映射,以获取MySQL代理用户名称,如果存在。对于示例代理账户,映射如下:

  • 如果匹配的组名是grp1grp3,这些组名在身份验证字符串中与用户名userauserc相关联。插件将使用相应的关联用户名作为代理用户名称。

  • 如果匹配的组名是grp2grp2作为代理用户名。

如果LDAP服务器返回一个以DN格式表示的组,LDAP插件将解析组DN以提取组名。

要指定LDAP组优先级和映射信息,这些原则适用:

  • 在身份验证字符串中使用#前缀字符开始组优先级和映射部分。

  • 组优先级和映射指定是一个由逗号分隔的项目列表,每个项目都有形式group_名=user_名group_名。项目应该按组名优先顺序列出。在LDAP服务器返回的组名集中由插件选择的组名上,两种语法在效果方面有所不同:

    • 对于指定为group_名=user_名(带用户名)的项目,组名映射到用户名,该用户名将用作MySQL代理用户名。

    • 对于指定为group_名(无用户名)的项目,组名将用作MySQL代理用户名。

  • 如果组或用户名包含特殊字符,如空格,可以使用双引号(")字符括起来。例如,如果一个项目的组和用户名分别是my group namemy user name,那么它必须以引号写入在组映射中:

    "my group name"="my user name"

    如果项目的组名和用户名为my_ group_namemy_user_name(不包含特殊字符),那么它可能但不一定需要使用引号。以下任何一种都是有效的:

    my_group_name=my_user_name
    my_group_name="my_user_name"
    "my_group_name"=my_user_name
    "my_group_name"="my_user_name"
  • 要转义一个字符,precede 它以反斜杠(\)。这对包括实际双引号或反斜杠特别有用,因为否则它们不会被包含字面。

  • 用户DN不需要在身份验证字符串中出现,但如果出现,它必须在组首选项和映射部分之前。用户DN可以作为完整的用户DN,或者以+前缀字符为用户DN后缀。(见LDAP身份验证用户DN后缀。)

LDAP身份验证插件允许身份验证字符串提供用户DN信息开始以+前缀字符:

  • 在缺少+字符的情况下,身份验证字符串值将被视为是没有修改的。

  • 如果认证字符串以+开头,插件将从客户端发送的用户名和认证字符串指定的DN中构建完整的用户DN值(去掉+)。在构建的DN中,客户端用户名变为指定LDAP用户名的属性值。这默认是uid;要更改属性,请修改相应系统变量(authentication_ldap_simple_user_search_attrauthentication_ldap_sasl_user_search_attr)。认证字符串将在mysql.user系统表中存储,完整的用户DN在认证前动态构建。

这个账户认证字符串没有+开头,所以它被视为完整的用户DN:

CREATE USER 'baldwin'
  IDENTIFIED WITH authentication_ldap_simple
  AS 'uid=admin,ou=People,dc=example,dc=com';

客户端使用指定在账户中的用户名(baldwin)连接。在这种情况下,这个名称不被使用,因为认证字符串没有前缀,因此完全指定了用户DN。

这个账户认证字符串有+开头,所以它被视为用户DN的一部分:

CREATE USER 'accounting'
  IDENTIFIED WITH authentication_ldap_simple
  AS '+ou=People,dc=example,dc=com';

客户端使用指定在账户中的用户名(accounting),在这种情况下,这个名称被用作uid属性, zusammen mit dem Authentifizierungsstring um den Benutzer-DN zu konstruieren:uid=accounting,ou=People,dc=example,dc=com

前面的示例中,账户都有非空的用户名,因此客户端总是使用在账户定义中指定的名称连接到 MySQL 服务器。如果账户有空的用户名,如 LDAP 插件中描述的默认匿名''@'%'代理账户,客户端可能会以不同的用户名连接到 MySQL 服务器。但是原则是一致的:如果认证字符串以+开头,插件将使用客户端发送的用户名和认证字符串来构建用户 DN。

LDAP 认证插件使用可配置的认证方法。适当的系统变量和可用方法选择是插件特定的:

查看系统变量描述以获取每种允许方法的信息。此外,根据方法,可能需要额外的配置,如下节所述。

Generic Security Service Application Program Interface(GSSAPI)是一种安全抽象接口。Kerberos 是一种特定的安全协议的实例,可以通过该抽象接口使用。使用 GSSAPI,应用程序将身份验证到 Kerberos,以获取服务凭证,然后使用这些凭证来启用对其他服务的安全访问。

一种这样的服务是LDAP,它由客户端和服务器端SASL LDAP身份验证插件使用。当authentication_ldap_sasl_auth_method_name系统变量设置为GSSAPI时,这些插件使用GSSAPI/Kerberos身份验证方法。在这种情况下,插件使用Kerberos安全地通信,而不直接使用LDAP消息。服务器端插件然后与LDAP服务器通信,以解释LDAP身份验证消息和检索LDAP组。

GSSAPI/Kerberos在Linux上支持MySQL服务器和客户端的LDAP身份验证方法。在Linux环境中,应用程序可以通过Microsoft Active Directory访问LDAP,该环境默认启用Kerberos。

以下讨论提供了使用GSSAPI方法的配置要求信息。假设对Kerberos概念和操作有所了解。以下列表简要定义了一些常见的Kerberos术语。你可能还会找到RFC 4120中的Glossary部分有帮助。

  • 主体:一个命名实体,如用户或服务器。

  • 密钥分配中心:密钥分配中心,包括AS和TGS:

    • 身份验证服务器:身份验证服务器;提供初始票据授予票needed以获取更多票据。

    • TGS: 票证授予服务器;为拥有有效TGT的Kerberos客户端提供额外的票证。

  • TGT: 票证授予票证;用于向TGS获取服务票证以访问服务。

使用Kerberos的LDAP身份验证需要同时存在KDC服务器和LDAP服务器。这可以通过以下方式满足:

  • 活动目录包括两个服务器,Kerberos身份验证默认在活动目录LDAP服务器中启用。

  • OpenLDAP提供了LDAP服务器,但可能需要单独的KDC服务器,并且需要额外的Kerberos设置。

Kerberos还需要在客户端主机上可用。客户端使用密码与AS联系以获取TGT,然后使用TGT从TGS获取对其他服务(如LDAP)的访问权限。

以下部分讨论了使用GSSAPI/Kerberos进行SASL LDAP身份验证的MySQL配置步骤:

Verify Kerberos and LDAP Availability

以下示例演示了如何测试 Active Directory 中 Kerberos 的可用性。该示例假设:

  • Active Directory 在名为 ldap_auth.example.com 的主机上运行,IP 地址为 198.51.100.10

  • MySQL 相关的 Kerberos 认证和 LDAP 查询使用域 MYSQL.LOCAL

  • 注册了名为 bredon@MYSQL.LOCAL 的主体。 (在后续讨论中,这个主体名称也将与使用 GSSAPI/Kerberos 认证到 MySQL 服务器的 MySQL 账户相关联。)

满足这些假设后,请按照以下步骤进行:

  1. 验证 Kerberos 库是否安装和配置正确在操作系统中。例如,在配置 MYSQL.LOCAL 域用于 MySQL 认证时,Kerberos 配置文件 /etc/krb5.conf 应该包含类似以下内容:

    [realms]
      MYSQL.LOCAL = {
        kdc = ldap_auth.example.com
        admin_server = ldap_auth.example.com
        default_domain = MYSQL.LOCAL
      }
  2. 您可能需要将服务器主机添加到 /etc/hosts 文件中:

    198.51.100.10 ldap_auth ldap_auth.example.com
  3. 检查 Kerberos 认证是否正确工作:

    1. 使用 kinit 命令来认证到 Kerberos:

      $> kinit bredon@MYSQL.LOCAL
      Password for bredon@MYSQL.LOCAL: (enter password here)

      该命令对名为bredon@MYSQL.LOCAL的Kerberos主体进行身份验证。在命令提示时,输入主体的密码。KDC返回一个TGT,该TGT将在客户端缓存中用于其他Kerberos-aware应用程序使用。

    2. 使用klist命令检查是否正确获取了TGT。输出应类似于以下内容:

      $> klist
      Ticket cache: FILE:/tmp/krb5cc_244306
      Default principal: bredon@MYSQL.LOCAL
      
      Valid starting       Expires              Service principal
      03/23/2021 08:18:33  03/23/2021 18:18:33  krbtgt/MYSQL.LOCAL@MYSQL.LOCAL
  4. 检查使用以下命令是否可以使用Kerberos TGT来搜索MYSQL.LOCAL域中的用户:ldapsearch

    ldapsearch -h 198.51.100.10 -Y GSSAPI -b "dc=MYSQL,dc=LOCAL"
Configure the Server-Side SASL LDAP Authentication Plugin for GSSAPI/Kerberos

假设LDAP服务器通过Kerberos访问,如前所述,配置服务器端SASL LDAP身份验证插件以使用GSSAPI/Kerberos身份验证方法。 (有关一般LDAP插件安装信息,请参阅Installing LDAP Pluggable Authentication。)以下是服务器my.cnf文件可能包含的插件相关设置:

[mysqld]
plugin-load-add=authentication_ldap_sasl.so
authentication_ldap_sasl_auth_method_name="GSSAPI"
authentication_ldap_sasl_server_host=198.51.100.10
authentication_ldap_sasl_server_port=389
authentication_ldap_sasl_bind_root_dn="cn=admin,cn=users,dc=MYSQL,dc=LOCAL"
authentication_ldap_sasl_bind_root_pwd="password"
authentication_ldap_sasl_bind_base_dn="cn=users,dc=MYSQL,dc=LOCAL"
authentication_ldap_sasl_user_search_attr="sAMAccountName"

这些选项文件设置将SASL LDAP插件配置如下:

Create a MySQL Account That Uses GSSAPI/Kerberos for LDAP Authentication

使用 SASL LDAP 认证插件和 GSSAPI/Kerberos 方法的 MySQL 认证基于一个 Kerberos 主要身份。以下讨论使用主主要身份 bredon@MYSQL.LOCAL 作为用户,这个用户必须在多个地方注册:

  • Kerberos 管理员应该将用户名注册为 Kerberos 主要身份。这名包括域名。客户端使用主要身份和密码与 Kerberos 进行身份验证,并获取 TGT。

  • LDAP 管理员应该将用户名在 LDAP 条目中注册。例如:

    uid=bredon,dc=MYSQL,dc=LOCAL
    Note

    在使用 Kerberos 作为默认身份验证方法的 Active Directory 中,创建用户同时创建了 Kerberos 主要身份和 LDAP 条目。

  • MySQL DBA 应该创建一个账户,该账户用户名是 Kerberos 主要身份,并使用 SASL LDAP 插件进行身份验证。

假设Kerberos主体和LDAP条目已经由相应的服务管理员注册,并且,正如在安装LDAP可插拔身份验证为GSSAPI/Kerberos配置服务器端SASL LDAP身份验证插件中描述的那样,MySQL服务器已经以适当的配置设置启动了服务器端SASL LDAP插件。然后,MySQL DBA创建一个对应Kerberos主体名称(包括域名)的MySQL账户。

Note

SASL LDAP插件使用固定的用户DN进行Kerberos身份验证,并忽略来自MySQL的任何用户DN配置,这会产生某些影响:

  • 对于使用GSSAPI/Kerberos身份验证的任何MySQL账户,在CREATE USERALTER USER语句中,身份验证字符串不应该包含用户DN,因为它没有效果。

  • 由于身份验证字符串不包含用户DN,因此它应该包含组映射信息,以便将用户处理为代理用户,该代理用户将被映射到所需的代理用户。关于使用LDAP身份验证插件进行代理的信息,请见LDAP身份验证与代理

以下语句创建一个名为 bredon@MYSQL.LOCAL 的代理用户,该用户继承了被代理用户 proxied_krb_usr 的权限。其他 GSSAPI/Kerberos 用户可以类似地作为同一被代理用户的代理用户创建。

-- create proxy account
CREATE USER 'bredon@MYSQL.LOCAL'
  IDENTIFIED WITH authentication_ldap_sasl
  BY '#krb_grp=proxied_krb_user';

-- create proxied account and grant its privileges;
-- use mysql_no_login plugin to prevent direct login
CREATE USER 'proxied_krb_user'
  IDENTIFIED WITH mysql_no_login;
GRANT ALL
  ON krb_user_db.*
  TO 'proxied_krb_user';

-- grant to proxy account the
-- PROXY privilege for proxied account
GRANT PROXY
  ON 'proxied_krb_user'
  TO 'bredon@MYSQL.LOCAL';

请注意在第一个CREATE USER语句和GRANT PROXY语句中的代理账户名称引号:

  • 对于大多数 MySQL 账户,用户和主机是账户名称的两个独立部分,因此分别被引号为 'user_名'@'host_名'

  • 对于 LDAP Kerberos 认证,账户名称中的用户部分包括主体域,因此 'bredon@MYSQL.LOCAL' 被引号为一个单值。因为没有提供主机部分,所以完整的 MySQL 账户名称使用默认的 '%' 作为主机部分:'bredon@MYSQL.LOCAL'@'%'

Note

使用 GSSAPI/Kerberos 身份验证方法和authentication_ldap_sasl SASL LDAP身份验证插件创建账户时,CREATE USER 语句将realm作为用户名的一部分。与使用authentication_kerberos Kerberos插件创建账户不同,后者不包括realm在用户名中,而是将realm指定为BY子句中的身份验证字符串。请参阅使用 Kerberos 身份验证创建 MySQL 账户

代理账户使用mysql_no_login身份验证插件来防止客户端直接使用账户登录到 MySQL 服务器。相反,期望使用 LDAP 进行身份验证的用户使用bredon@MYSQL.LOCAL代理账户。(假设mysql_no_login插件已安装。请参阅第 8.4.1.9 节,“无登录可插拔身份验证”。)为了保护代理账户免受直接使用的其他方法,请参阅防止代理账户直接登录

Use the MySQL Account to Connect to the MySQL Server

在设置了使用GSSAPI/Kerberos身份验证的MySQL账户后,客户端可以使用它连接到MySQL服务器。Kerberos身份验证可以在MySQL客户端程序调用前或同时进行:

  • 在调用MySQL客户端程序前,客户端用户可以独立于MySQL从KDC获取TGT。例如,客户端用户可以使用kinit命令通过提供Kerberos主体名称和主体密码来身份验证到Kerberos:

    $> kinit bredon@MYSQL.LOCAL
    Password for bredon@MYSQL.LOCAL: (enter password here)

    生成的TGT将被缓存,并可供其他Kerberos-aware应用程序使用,例如使用客户端-SASL LDAP身份验证插件的程序。在这种情况下,MySQL客户端程序使用TGT身份验证到MySQL服务器,因此可以不指定用户名或密码地调用客户端:

    mysql --default-auth=authentication_ldap_sasl_client

    正如前所述,当TGT被缓存时,不需要在客户端命令中指定用户名和密码。如果命令仍然包含它们,它们将被处理如下:

    • 如果命令包含用户名,身份验证将失败,如果该名称不匹配TGT中的主体名称。

    • 如果命令包含密码,客户端插件将忽略它。因为身份验证基于TGT,因此即使用户提供的密码错误也可以成功。因此,插件在找到有效的TGT时会产生警告,因为它导致了密码被忽略。

  • 如果Kerberos缓存中没有TGT,客户端-SASL LDAP身份验证插件本身可以从KDC获取TGT。使用与MySQL账户关联的Kerberos主体名称和密码的选项调用客户端(在单行输入命令,然后输入主体密码时):

    mysql --default-auth=authentication_ldap_sasl_client
      --user=bredon@MYSQL.LOCAL
      --password
  • 如果Kerberos缓存中没有TGT,并且客户端命令未指定principal名称作为用户名,身份验证将失败。

如果您不确定是否存在TGT,可以使用klist来检查。

身份验证过程如下:

  1. 客户端使用TGT通过Kerberos进行身份验证。

  2. 服务器找到principal的LDAP条目,并使用它来身份验证连接到MySQL代理账户bredon@MYSQL.LOCAL

  3. 代理账户身份验证字符串中的组映射信息('#krb_grp=proxied_krb_user')表明,已身份验证的代理用户应该是proxied_krb_user

  4. bredon@MYSQL.LOCAL被视为对proxied_krb_user的代理,并且以下查询返回输出结果:

    mysql> SELECT USER(), CURRENT_USER(), @@proxy_user;
    +------------------------------+--------------------+--------------------------+
    | USER()                       | CURRENT_USER()     | @@proxy_user             |
    +------------------------------+--------------------+--------------------------+
    | bredon@MYSQL.LOCAL@localhost | proxied_krb_user@% | 'bredon@MYSQL.LOCAL'@'%' |
    +------------------------------+--------------------+--------------------------+

    USER() 的值表示用于客户端命令的用户名 (bredon@MYSQL.LOCAL) 以及客户端连接的主机 (localhost)。

    CURRENT_USER() 的值是代理用户帐户的全名,它由 proxied_krb_user 用户部分和 % 主机部分组成。

    @@proxy_user 的值表示用于连接到 MySQL 服务器的帐户的全名,它由 bredon@MYSQL.LOCAL 用户部分和 % 主机部分组成。

    这表明,代理是通过bredon@MYSQL.LOCAL代理用户账户进行的,并且bredon@MYSQL.LOCAL将继承被代理的proxied_krb_user代理用户账户授予的权限。

一旦获得TGT,它将在客户端上缓存,并且可以在不需要再次指定密码的情况下使用,直到它过期。无论如何获得TGT,客户端插件都将其用来获取服务票据并与服务器端插件通信。

Note

当客户端身份验证插件本身获得TGT时,客户用户可能不想重复使用TGT。如LDAP身份验证客户端配置参数中所述,local/etc/krb5.conf文件可以用来使客户端插件在使用完毕后销毁TGT。

服务器端插件没有访问TGT本身或用于获得其的Kerberos密码的权限。

LDAP身份验证插件对缓存机制(在本地文件中、内存等)没有控制权,但Kerberos工具,如kswitch,可能可用于此目的。

Client Configuration Parameters for LDAP Authentication

客户端SASL LDAP插件authentication_ldap_sasl_client读取local/etc/krb5.conf文件。如果该文件不存在或不可访问,错误将发生。假设该文件可访问,它可以包含一个可选的[appdefaults]部分,以提供插件使用的信息。在该部分中,信息应该在mysql部分内。例如:

[appdefaults]
  mysql = {
    ldap_server_host = "ldap_host.example.com"
    ldap_destroy_tgt = true
  }

客户端插件在 mysql 部分中识别这些参数:

  • ldap_server_host 值指定 LDAP 服务器主机,可以在 KDC 服务器主机(在 [realms] 部分指定)与之不同。默认情况下,插件使用 KDC 服务器主机作为 LDAP 服务器主机。

  • ldap_destroy_tgt 值指示客户端插件是否在获取和使用 TGT 后销毁它。默认情况下,ldap_destroy_tgt 设置为 false,但可以设置为 true以避免 TGT 重用。(这只适用于客户端插件创建的 TGT,而不是其他插件或外部到 MySQL 的 TGT。)

LDAP 服务器可以配置委派 LDAP 搜索到另一个 LDAP 服务器,这种功能称为 LDAP 引用。假设服务器 a.example.com 持有 "dc=example,dc=com" 根 DN,并想委派搜索到另一个服务器 b.example.com。要启用此功能,a.example.com 将被配置为具有以下属性的命名引用对象:

dn: dc=subtree,dc=example,dc=com
objectClass: referral
objectClass: extensibleObject
dc: subtree
ref: ldap://b.example.com/dc=subtree,dc=example,dc=com

启用LDAP引用时,搜索可能会因LDAP操作错误而失败,当搜索基础DN是根DN且引用对象未设置。MySQL DBA可能想避免LDAP引用错误,以便在LDAP身份验证插件中使用LDAP身份验证,即使LDAP引用已经在ldap.conf配置文件中全局设置。要根据插件来配置LDAP服务器是否在与每个插件通信时使用LDAP引用,可以设置authentication_ldap_simple_referralauthentication_ldap_sasl_referral系统变量。将任何一个变量设置为ONOFF,使对应的LDAP身份验证插件告诉LDAP服务器是否在MySQL身份验证中使用引用。每个变量都有插件特定的效果,不会影响其他与LDAP服务器通信的应用程序。两个变量默认为OFF