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.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 企业版中。它们不包含在 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_sasl
或authentication_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_simple
和authentication_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 服务通信:
- 创建一个包含以下内容的文件
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;
- 将安全策略模块编译为二进制表示:
checkmodule -M -m mysqlldap.te -o mysqlldap.mod
- 创建一个 SELinux 策略模块包:
semodule_package -m mysqlldap.mod -o mysqlldap.pp
- 安装模块包:
semodule -i mysqlldap.pp
- 当 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_tls
和authentication_ldap_simple_ca_path
用于简单 LDAP 认证,以及authentication_ldap_sasl_tls
和authentication_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 用户
betsy
和boris
分别对betsy_ldap
和boris_ldap
的 LDAP 条目进行身份验证。(MySQL 和 LDAP 用户名不必不同。 在本讨论中使用不同名称有助于澄清操作上下文是 MySQL 还是 LDAP。) - LDAP 条目使用
uid
属性来指定用户名。 这可能会根据 LDAP 服务器而变化。 一些 LDAP 服务器使用cn
属性而不是uid
来表示用户名。 要更改属性,请适当修改authentication_ldap_simple_user_search_attr
或authentication_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”。
认证过程如下进行:
- 客户端插件将
betsy
和betsy_password
作为客户端用户名和 LDAP 密码发送到 MySQL 服务器。 - 连接尝试匹配
'betsy'@'localhost'
账户。 服务器端 LDAP 插件发现该账户具有一个认证字符串'uid=betsy_ldap,ou=People,dc=example,dc=com'
用于命名 LDAP 用户 DN。 该插件将此字符串和 LDAP 密码发送到 LDAP 服务器。 - LDAP 服务器找到了
betsy_ldap
的 LDAP 条目,并且密码匹配,因此 LDAP 认证成功。 - 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 条目使用
uid
和cn
属性分别指定用户名和组值。要使用不同的用户和组属性名称,请设置适当的插件特定系统变量:
- 对于
authentication_ldap_simple
插件:设置authentication_ldap_simple_user_search_attr
和authentication_ldap_simple_group_search_attr
。 - 对于
authentication_ldap_sasl
插件:设置authentication_ldap_sasl_user_search_attr
和authentication_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
- 在连接时,组属性值成为经过身份验证的用户名称,因此它们命名了
accounting
和front_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