MySQL8 中文参考(二十七)(3)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: MySQL8 中文参考(二十七)

MySQL8 中文参考(二十七)(2)https://developer.aliyun.com/article/1566139


8.4.1.7 LDAP 可插拔身份验证

注意

LDAP 可插拔身份验证是 MySQL 企业版中包含的扩展,是一种商业产品。要了解更多关于商业产品的信息,请参见www.mysql.com/products/

MySQL 企业版支持一种身份验证方法,使 MySQL 服务器能够使用 LDAP(轻量级目录访问协议)通过访问目录服务(如 X.500)对 MySQL 用户进行身份验证。MySQL 使用 LDAP 获取用户、凭据和组信息。

LDAP 可插拔身份验证提供以下功能:

  • 外部身份验证:LDAP 身份验证使 MySQL 服务器能够接受来自 LDAP 目录中定义的用户的连接,而不是在 MySQL 授权表中定义的用户。
  • 代理用户支持:LDAP 身份验证可以根据外部用户所属的 LDAP 组返回一个与客户端程序传递的外部用户名不同的 MySQL 用户名给 MySQL,这意味着 LDAP 插件可以返回定义外部 LDAP 身份验证用户应具有的特权的 MySQL 用户。例如,名为joe的 LDAP 用户可以连接并具有名为developer的 MySQL 用户的特权,如果joe的 LDAP 组是developer
  • 安全性:使用 TLS,连接到 LDAP 服务器可以是安全的。

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

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

表 8.22 简单 LDAP 身份验证的插件和库名称

插件或文件 插件或文件名称
服务器端插件名称 authentication_ldap_simple
客户端插件名称 mysql_clear_password
库文件名称 authentication_ldap_simple.so

表 8.23 基于 SASL 的 LDAP 身份验证的插件和库名称

插件或文件 插件或文件名称
服务器端插件名称 authentication_ldap_sasl
客户端插件名称 authentication_ldap_sasl_client
库文件名称 authentication_ldap_sasl.soauthentication_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 企业版中。它们不包含在 MySQL 社区发行版中。客户端端的 SASL LDAP 插件包含在所有发行版中,包括社区发行版,并且如前所述,客户端的mysql_clear_password插件内置于libmysqlclient客户端库中,该库也包含在所有发行版中。这使得来自任何发行版的客户端都可以连接到加载了适当服务器端插件的服务器。

以下各节提供了特定于 LDAP 可插拔认证的安装和使用信息:

  • LDAP 可插拔认证的先决条件
  • MySQL 用户的 LDAP 认证工作原理
  • 安装 LDAP 可插拔认证
  • 卸载 LDAP 可插拔认证
  • LDAP 可插拔认证和 ldap.conf
  • 使用 LDAP 可插拔认证
  • 简单 LDAP 认证
  • 基于 SASL 的 LDAP 认证
  • 代理 LDAP 认证
  • LDAP 认证组偏好和映射规范
  • LDAP 认证用户 DN 后缀
  • LDAP 认证方法
  • GSSAPI/Kerberos 认证方法
  • LDAP 搜索引荐

有关 MySQL 中可插拔认证的一般信息,请参见第 8.2.17 节,“可插拔认证”。有关mysql_clear_password插件的信息,请参见第 8.4.1.4 节,“客户端明文可插拔认证”。有关代理用户信息,请参见第 8.2.19 节,“代理用户”。

注意

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

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 如何共同工作以对 MySQL 用户进行认证。有关如何设置 MySQL 账户以使用特定 LDAP 认证插件的示例,请参见使用 LDAP 可插拔认证。有关 LDAP 插件可用的认证方法的信息,请参见 LDAP 认证方法。

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

  • 对于简单的 LDAP 认证,客户端和服务器端插件以明文形式传输密码。建议在 MySQL 客户端和服务器之间建立安全连接,以防止密码泄露。
  • 对于基于  SASL 的 LDAP 认证,客户端和服务器端插件避免在 MySQL 客户端和服务器之间发送明文密码。例如,插件可能使用 SASL 消息来在  LDAP 协议内安全传输凭据。对于 GSSAPI 认证方法,客户端和服务器端插件使用 Kerberos 进行安全通信,而不直接使用 LDAP  消息。

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

如果存在匹配的 MySQL 账户,则进行 LDAP 认证。LDAP 服务器查找与用户匹配的条目,并根据 LDAP 密码对该条目进行认证:

  • 如果 MySQL 账户指定了 LDAP 用户的区分名称(DN),则 LDAP 认证将使用该值和客户端提供的 LDAP 密码。(要将 LDAP 用户 DN 与 MySQL 账户关联,包括在创建账户的CREATE USER语句中指定认证字符串的BY子句。)
  • 如果  MySQL 账户名称不是 LDAP 用户 DN,则 LDAP 认证使用客户端提供的用户名和 LDAP 密码。在这种情况下,认证插件首先使用根  DN 和密码作为凭据绑定到 LDAP 服务器,以根据客户端用户名找到用户 DN,然后根据 LDAP 密码对该用户 DN  进行认证。如果根凭据的绑定失败,说明根 DN 和密码设置为不正确的值,或为空(未设置),且 LDAP 服务器不允许匿名连接。

如果 LDAP 服务器找不到匹配项或找到多个匹配项,则认证失败,客户端连接将被拒绝。

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

  • 如果 LDAP 条目具有组属性(默认为cn属性),插件将其值作为经过认证的用户名返回。
  • 如果 LDAP 条目没有组属性,认证插件将返回客户端用户名作为经过认证的用户名。

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

  • 如果名称相同,则不会发生代理:将用于权限检查的与客户端用户名匹配的 MySQL 帐户。
  • 如果名称不同,将发生代理:MySQL 将寻找与经过认证的用户名匹配的帐户。该帐户将成为代理用户,用于权限检查。与客户端用户名匹配的 MySQL 帐户将被视为外部代理用户。
安装 LDAP 可插入认证

本节描述了如何安装服务器端 LDAP 认证插件。有关安装插件的一般信息,请参见第 7.6.1 节,“安装和卸载插件”。

要被服务器使用,插件库文件必须位于 MySQL 插件目录中(由plugin_dir系统变量命名的目录)。如有必要,通过在服务器启动时设置plugin_dir的值来配置插件目录位置。

服务器端插件库文件的基本名称为authentication_ldap_simpleauthentication_ldap_sasl。文件名后缀因平台而异(例如,对于 Unix 和类 Unix 系统,为.so,对于 Windows 为.dll)。

注意

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

要在服务器启动时加载插件,使用--plugin-load-add选项命名包含插件的库文件。使用此插件加载方法,选项必须在每次服务器启动时给出。还要为您希望配置的任何插件提供的系统变量指定值。

每个服务器端 LDAP 插件都公开一组系统变量,以使其操作可以配置。设置大多数这些变量是可选的,但您必须设置指定 LDAP  服务器主机(以便插件知道在哪里连接)和 LDAP 绑定操作的基本区分名称(以限制搜索范围并获得更快的搜索)的变量。有关所有 LDAP  系统变量的详细信息,请参见第 8.4.1.13 节,“可插入认证系统变量”。

要加载插件并设置 LDAP 服务器主机和 LDAP 绑定操作的基本区分名称,需要在您的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。参见 Section 15.7.6.1, “SET Syntax for Variable Assignment”。

要验证插件安装,请检查信息模式PLUGINS表或使用SHOW PLUGINS语句(参见 Section 7.6.2, “Obtaining Server Plugin Information”)。例如:

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 插件关联,请参阅使用 LDAP 可插拔认证。

SELinux 的附加说明

在运行 EL6 或启用 SELinux 的 EL 系统上,需要更改 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;
  1. 将安全策略模块编译为二进制表示:
checkmodule -M -m mysqlldap.te -o mysqlldap.mod
  1. 创建一个 SELinux 策略模块包:
semodule_package -m mysqlldap.mod  -o mysqlldap.pp
  1. 安装模块包:
semodule -i mysqlldap.pp
  1. 当 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 插件可以覆盖 ldap.conf 中的参数,如:

  • TLS 配置:系统变量可用于启用 TLS 并控制 CA 配置,例如 authentication_ldap_simple_tlsauthentication_ldap_simple_ca_path 用于简单 LDAP 认证,以及 authentication_ldap_sasl_tlsauthentication_ldap_sasl_ca_path 用于 SASL LDAP 认证。
  • LDAP 引荐。请参阅 LDAP 搜索引荐。

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

使用 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 目录条目。
  • 必须有一个 MySQL 用户帐户,指定一个服务器端 LDAP 身份验证插件,并可选择命名相关的 LDAP 用户专有名称(DN)。 (要将 LDAP 用户 DN 与 MySQL 帐户关联,包括在创建帐户的CREATE USER语句中包含一个BY子句。)如果帐户未命名任何 LDAP 字符串,则 LDAP 身份验证将使用客户端指定的用户名查找 LDAP 条目。
  • 客户端程序使用适用于 MySQL 帐户使用的服务器端身份验证插件的连接方法进行连接。 对于 LDAP 身份验证,连接需要 MySQL 用户名和 LDAP 密码。 此外,对于使用服务器端authentication_ldap_simple插件的帐户,使用--enable-cleartext-plugin选项调用客户端程序以启用客户端端mysql_clear_password插件。

此处的说明假定以下场景:

  • MySQL 用户betsyboris分别对betsy_ldapboris_ldap的 LDAP 条目进行身份验证。(MySQL 和 LDAP 用户名不必不同。 在本讨论中使用不同名称有助于澄清操作上下文是 MySQL 还是 LDAP。)
  • LDAP 条目使用uid属性来指定用户名。 这可能会根据 LDAP 服务器而变化。 一些 LDAP 服务器使用cn属性而不是uid来表示用户名。 要更改属性,请适当修改authentication_ldap_simple_user_search_attrauthentication_ldap_sasl_user_search_attr系统变量。
  • 这些 LDAP 条目可在 LDAP 服务器管理的目录中找到,以提供唯一标识每个用户的专有名称值:
uid=betsy_ldap,ou=People,dc=example,dc=com
uid=boris_ldap,ou=People,dc=example,dc=com
  • CREATE USER 语句创建 MySQL 账户时,在 BY 子句中指定 LDAP 用户,以指示 MySQL 账户进行身份验证的 LDAP 条目。

使用 LDAP 认证设置帐户的说明取决于使用的服务器端 LDAP 插件。 以下各节描述了几种使用场景。

简单 LDAP 认证

要为简单 LDAP 认证配置 MySQL 账户,CREATE USER 语句指定 authentication_ldap_simple 插件,并可选择命名 LDAP 用户的区分名称(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 用户名和 LDAP 密码连接到 MySQL 服务器,并启用客户端端 mysql_clear_password 插件:

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

注意

客户端端 mysql_clear_password 认证插件不会更改密码,因此客户端程序将其作为明文发送到 MySQL 服务器。 这使得密码可以原样传递到 LDAP 服务器。 在没有 SASL 的情况下使用服务器端 LDAP 库需要明文密码,但在某些配置中可能存在安全问题。 这些措施最小化了风险:

  • 为了减少意外使用 mysql_clear_password 插件的可能性,MySQL 客户端必须显式启用它(例如,使用 --enable-cleartext-plugin 选项)。 请参见 Section 8.4.1.4, “Client-Side Cleartext Pluggable Authentication”。
  • 为了避免启用 mysql_clear_password 插件时密码暴露,MySQL 客户端应该使用加密连接连接到 MySQL 服务器。 请参见 Section 8.3.1, “Configuring MySQL to Use Encrypted Connections”。

认证过程如下进行:

  1. 客户端插件将 betsybetsy_password 作为客户端用户名和 LDAP 密码发送到 MySQL 服务器。
  2. 连接尝试匹配 'betsy'@'localhost' 账户。 服务器端 LDAP 插件发现该账户具有一个认证字符串 'uid=betsy_ldap,ou=People,dc=example,dc=com' 用于命名 LDAP 用户 DN。 该插件将此字符串和 LDAP 密码发送到 LDAP 服务器。
  3. LDAP 服务器找到了 betsy_ldap 的 LDAP 条目,并且密码匹配,因此 LDAP 认证成功。
  4. LDAP 条目没有组属性,因此服务器端插件将客户端用户名(betsy)作为经过身份验证的用户返回。这与客户端提供的相同用户名,因此不会发生代理,并且客户端会话使用'betsy'@'localhost'账户进行权限检查。

如果匹配的 LDAP 条目包含组属性,该属性值将成为经过身份验证的用户名,并且如果该值与betsy不同,则将发生代理。有关使用组属性的示例,请参阅具有代理功能的 LDAP 认证。

如果CREATE USER语句中没有包含BY子句来指定betsy_ldap LDAP 专有名称,认证尝试将使用客户端提供的用户名(在本例中为betsy)。在没有betsy的 LDAP 条目的情况下,认证将失败。

基于 SASL 的 LDAP 认证

要为 SASL LDAP 认证配置 MySQL 账户,CREATE USER 语句指定authentication_ldap_sasl插件,并可选择命名 LDAP 用户的专有名称(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 用户名和 LDAP 密码连接到 MySQL 服务器:

$> 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 认证

LDAP 认证插件支持代理,使用户可以以一个用户连接到 MySQL 服务器,但假定另一个用户的权限。本节描述了基本的 LDAP 插件代理支持。LDAP 插件还支持指定组偏好和代理用户映射;请参阅 LDAP 认证组偏好和映射规范。

此处描述的代理实现基于使用 LDAP 组属性值将通过 LDAP 进行身份验证的连接 MySQL 用户映射到定义不同权限集的其他 MySQL  账户。用户不会直接通过定义权限的账户连接。相反,他们通过使用 LDAP 进行身份验证的默认代理账户连接,以便将所有外部登录映射到持有权限的代理  MySQL 账户。通过代理账户连接的任何用户都将映射到其中一个代理 MySQL 账户,其权限确定了允许外部用户执行的数据库操作。

此处的说明假定以下场景:

  • LDAP 条目使用uidcn属性分别指定用户名和组值。要使用不同的用户和组属性名称,请设置适当的插件特定系统变量:
  • 对于authentication_ldap_simple插件:设置authentication_ldap_simple_user_search_attrauthentication_ldap_simple_group_search_attr
  • 对于authentication_ldap_sasl插件:设置authentication_ldap_sasl_user_search_attrauthentication_ldap_sasl_group_search_attr
  • 这些 LDAP 条目可在由 LDAP 服务器管理的目录中找到,以提供唯一标识每个用户的可区分名称值:
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 账户的组属性。

注意

如果您的 MySQL 安装中存在匿名用户,则可能会与默认代理用户发生冲突。有关此问题的更多信息以及处理方法,请参阅默认代理用户和匿名用户冲突。

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

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插件。有关说明,请参见  Section 8.4.1.9, “No-Login Pluggable  Authentication”。)有关保护代理帐户免受直接使用的替代方法,请参见 Preventing Direct Login to  Proxied Accounts。


MySQL8 中文参考(二十七)(4)https://developer.aliyun.com/article/1566141

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
关系型数据库 MySQL Unix
MySQL8 中文参考(二十三)(3)
MySQL8 中文参考(二十三)
33 4
|
2月前
|
存储 缓存 关系型数据库
MySQL8 中文参考(二十一)(5)
MySQL8 中文参考(二十一)
53 3
|
2月前
|
存储 监控 Java
MySQL8 中文参考(二十一)(4)
MySQL8 中文参考(二十一)
65 3
|
2月前
|
存储 安全 关系型数据库
MySQL8 中文参考(二十一)(1)
MySQL8 中文参考(二十一)
33 3
|
2月前
|
存储 关系型数据库 MySQL
MySQL8 中文参考(二十一)(3)
MySQL8 中文参考(二十一)
41 2
|
2月前
|
关系型数据库 MySQL Unix
MySQL8 中文参考(二十一)(2)
MySQL8 中文参考(二十一)
31 2
|
2月前
|
关系型数据库 MySQL 数据安全/隐私保护
MySQL8 中文参考(二十五)(5)
MySQL8 中文参考(二十五)
27 2
|
2月前
|
存储 关系型数据库 MySQL
MySQL8 中文参考(二十四)(1)
MySQL8 中文参考(二十四)
25 2
|
2月前
|
NoSQL 关系型数据库 MySQL
MySQL8 中文参考(二十三)(2)
MySQL8 中文参考(二十三)
32 2
|
2月前
|
存储 关系型数据库 MySQL
MySQL8 中文参考(二十三)(1)
MySQL8 中文参考(二十三)
22 2

热门文章

最新文章