MySQL8 中文参考(二十六)(2)

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

MySQL8 中文参考(二十六)(1)https://developer.aliyun.com/article/1566127


PAM 身份验证访问 Unix 密码存储

在某些系统上,Unix 身份验证使用密码存储,例如/etc/shadow,这是一个通常具有受限访问权限的文件。这可能导致 MySQL 基于 PAM 的身份验证失败。不幸的是,PAM 实现不允许区分“密码无法检查”(例如,由于无法读取/etc/shadow)和“密码不匹配”。如果您正在使用 Unix 密码存储进行 PAM 身份验证,您可以通过以下方法之一启用 MySQL 对其的访问:

  • 假设 MySQL 服务器是从mysql操作系统帐户运行的,请将该帐户放入具有/etc/shadow访问权限的shadow组中:
  1. /etc/group中创建���个shadow组。
  2. mysql操作系统用户添加到/etc/group中的shadow组。
  3. /etc/group分配给shadow组并启用组读权限:
chgrp shadow /etc/shadow
chmod g+r /etc/shadow
  1. 重新启动 MySQL 服务器。
  • 如果您正在使用pam_unix模块和unix_chkpwd实用程序,请按以下方式启用密码存储访问:
chmod u-s /usr/sbin/unix_chkpwd
setcap cap_dac_read_search+ep /usr/sbin/unix_chkpwd
  • 根据您的平台调整unix_chkpwd的路径。
PAM 身份验证调试

PAM 身份验证插件在初始化时检查AUTHENTICATION_PAM_LOG环境值是否已设置。在 MySQL 8.0.35 及更早版本中,该值无关紧要。如果是,则插件将启用将诊断消息记录到标准输出的功能。这些消息可能有助于调试插件执行身份验证时出现的与 PAM 相关的问题。您应该知道,在这些版本中,这些消息中包含密码。

从 MySQL 8.0.36 开始,设置AUTHENTICATION_PAM_LOG=1(或其他任意值)会产生相同的诊断消息,但包含任何密码。如果您希望在这些消息中包含密码,请设置AUTHENTICATION_PAM_LOG=PAM_LOG_WITH_SECRET_INFO

一些消息包含对 PAM 插件源文件和行号的引用,这使得插件操作与其发生的代码位置更紧密地联系在一起。

用于调试连接失败并确定连接尝试期间发生的情况的另一种技术是配置 PAM 认证以允许所有连接,然后检查系统日志文件。这种技术应仅在临时基础上使用,而不是在生产服务器上使用。

使用以下内容配置名为 /etc/pam.d/mysql-any-password 的 PAM 服务文件(在某些系统上格式可能有所不同):

#%PAM-1.0
auth        required    pam_permit.so
account     required    pam_permit.so

创建一个使用 PAM 插件并命名为 mysql-any-password PAM 服务的帐户:

CREATE USER 'testuser'@'localhost'
  IDENTIFIED WITH authentication_pam
  AS 'mysql-any-password';

mysql-any-password 服务文件会导致任何身份验证尝试返回 true,即使密码不正确。如果身份验证尝试失败,这说明配置问题在 MySQL 方面。否则,问题在操作系统/PAM 方面。要查看可能发生的情况,请检查系统日志文件,如 /var/log/secure/var/log/audit.log/var/log/syslog/var/log/messages

确定问题后,删除 mysql-any-password PAM 服务文件以禁用任意密码访问。

原文:dev.mysql.com/doc/refman/8.0/en/windows-pluggable-authentication.html

8.4.1.6 Windows 可插拔认证

注意

Windows 可插拔认证是 MySQL 企业版中包含的扩展,这是一个商业产品。要了解更多关于商业产品的信息,请查看www.mysql.com/products/

Windows 版 MySQL 企业版支持一种在 Windows 上执行外部认证的认证方法,使 MySQL 服务器能够使用本机  Windows 服务对客户端连接进行认证。已登录到 Windows 的用户可以根据其环境中的信息从 MySQL  客户端程序连接到服务器,而无需指定额外的密码。

客户端和服务器在认证握手中交换数据包。由于这种交换,服务器创建一个代表客户端在 Windows OS  中身份的安全上下文对象。这个身份包括客户端账户的名称。Windows  可插拔认证使用客户端的身份来检查它是否是给定账户或组的成员。默认情况下,协商使用 Kerberos 进行认证,如果 Kerberos  不可用,则使用 NTLM。

Windows 可插拔认证提供了以下功能:

  • 外部认证:Windows 认证使 MySQL 服务器能够接受来自在 Windows 登录的 MySQL 授权表之外定义的用户的连接。
  • 代理用户支持:Windows 认证可以将一个与客户端程序传递的外部用户名不同的用户名返回给 MySQL。这意味着插件可以返回定义外部 Windows 认证用户应具有的权限的 MySQL 用户。例如,一个名为joe的 Windows 用户可以连接并具有名为developer的 MySQL 用户的权限。

以下表格显示了插件和库文件的名称。文件必须位于由plugin_dir系统变量命名的目录中。

表 8.21 Windows 认证的插件和库名称

插件或文件 插件或文件名
服务器端插件 authentication_windows
客户端插件 authentication_windows_client
库文件 authentication_windows.dll

库文件仅包含服务器端插件。客户端插件内置于libmysqlclient客户端库中。

服务器端 Windows 认证插件仅包含在 MySQL 企业版中。它不包含在 MySQL 社区发行版中。客户端插件包含在所有发行版中,包括社区发行版。这使得来自任何发行版的客户端都能连接到加载了服务器端插件的服务器。

以下部分提供了特定于 Windows 可插拔认证的安装和使用信息:

  • 安装 Windows 可插拔认证
  • 卸载 Windows 可插拔认证
  • 使用 Windows 可插拔认证

有关 MySQL 中可插拔认证的一般信息,请参阅 Section 8.2.17, “Pluggable Authentication”。有关代理用户信息,请参阅 Section 8.2.19, “Proxy Users”。

安装 Windows 可插拔认证

本节描述了如何安装服务器端 Windows 认证插件。有关安装插件的一般信息,请参阅 Section 7.6.1, “Installing and Uninstalling Plugins”。

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

要在服务器启动时加载插件,请使用--plugin-load-add选项命名包含插件的库文件。使用此插件加载方法,每次服务器启动时都必须提供该选项。例如,将以下行放入服务器my.cnf文件中:

[mysqld]
plugin-load-add=authentication_windows.dll

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

或者,要在运行时加载插件,请使用以下语句:

INSTALL PLUGIN authentication_windows SONAME 'authentication_windows.dll';

INSTALL PLUGIN立即加载插件,并在mysql.plugins系统表中注册它,以使服务器在每次后续正常启动时加载它,而无需--plugin-load-add

要验证插件安装,请检查信息模式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 '%windows%';
+------------------------+---------------+
| PLUGIN_NAME            | PLUGIN_STATUS |
+------------------------+---------------+
| authentication_windows | ACTIVE        |
+------------------------+---------------+

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

要将 MySQL 帐户与 Windows 认证插件关联,请参阅使用 Windows 可插拔认证。 通过authentication_windows_use_principal_nameauthentication_windows_log_level系统变量提供了额外的插件控制。 请参阅第 7.1.8 节,“服务器系统变量”。

卸载 Windows 可插拔认证

卸载 Windows 认证插件的方法取决于您安装它的方式:

  • 如果您在服务器启动时使用--plugin-load-add选项安装插件,请在不带该选项的情况下重新启动服务器。
  • 如果您使用INSTALL PLUGIN语句在运行时安装插件,则插件将在服务器重新启动时保持安装状态。 要卸载它,请使用UNINSTALL PLUGIN
UNINSTALL PLUGIN authentication_windows;

另外,删除任何设置 Windows 插件相关系统变量的启动选项。

使用 Windows 可插拔认证

Windows 认证插件支持使用 MySQL 帐户,使得已登录 Windows 的用户可以连接到 MySQL  服务器,而无需指定额外的密码。 假定服务器正在运行并启用了服务器端插件,如安装 Windows 可插拔认证中所述。 一旦 DBA  启用了服务器端插件并设置了要使用它的帐户,客户端就可以使用这些帐户连接,而无需进行其他设置。

CREATE USER语句的IDENTIFIED WITH子句中引用 Windows 认证插件,请使用名称authentication_windows。 假设 Windows 用户RafalTasha应被允许连接到 MySQL,以及AdministratorsPower Users组中的任何用户。 要设置这一点,请创建一个名为sql_admin的 MySQL 帐户,该帐户使用 Windows 插件进行身份验证:

CREATE USER sql_admin
  IDENTIFIED WITH authentication_windows
  AS 'Rafal, Tasha, Administrators, "Power Users"';

插件名称为authentication_windowsAS关键字后面的字符串是认证字符串。 它指定了名为RafalTasha的 Windows 用户被允许作为 MySQL 用户sql_admin进行服务器身份验证,以及AdministratorsPower Users组中的任何 Windows 用户。 后一个组名包含一个空格,因此必须用双引号括起来。

创建sql_admin账户后,已登录到 Windows 的用户可以尝试使用该账户连接到服务器:

C:\> mysql --user=sql_admin

这里不需要密码。authentication_windows插件使用 Windows 安全 API 来检查连接的是哪个 Windows 用户。如果该用户名为RafalTasha,或者是AdministratorsPower Users组的成员,则服务器授予访问权限,并将客户端验证为sql_admin,并具有授予sql_admin账户的任何权限。否则,服务器将拒绝访问。

Windows 认证插件的认证字符串语法遵循以下规则:

  • 该字符串由一个或多个以逗号分隔的用户映射组成。
  • 每个用户映射将 Windows 用户或组名与 MySQL 用户名称关联起来:
*win_user_or_group_name=mysql_user_name*
*win_user_or_group_name*
  • 对于后一种语法,如果没有给出*mysql_user_name*值,则隐式值是由CREATE USER语句创建的 MySQL 用户。因此,以下语句是等效的:
CREATE USER sql_admin
  IDENTIFIED WITH authentication_windows
  AS 'Rafal, Tasha, Administrators, "Power Users"';
CREATE USER sql_admin
  IDENTIFIED WITH authentication_windows
  AS 'Rafal=sql_admin, Tasha=sql_admin, Administrators=sql_admin,
      "Power Users"=sql_admin';
  • 值中的每个反斜杠字符(\)都必须加倍,因为反斜杠是 MySQL 字符串中的转义字符。
  • 在双引号内部的前导和尾随空格将被忽略。
  • 未引用的*win_user_or_group_namemysql_user_name*值可以包含除等号、逗号或空格之外的任何内容。
  • 如果*win_user_or_group_name和/或mysql_user_name*值用双引号引起来,那么引号之间的所有内容都是值的一部分。例如,如果名称包含空格字符,则这是必要的。双引号内的所有字符都是合法的,除了双引号和反斜杠。要包含这两个字符,需要用反斜杠进行转义。
  • *win_user_or_group_name*值使用 Windows 主体的传统语法,可以是本地的或域中的。示例(注意反斜杠的加倍):
domain\\user
.\\user
domain\\group
.\\group
BUILTIN\\WellKnownGroup

当服务器调用插件来验证客户端时,插件从左到右扫描认证字符串,以查找与 Windows 用户匹配的用户或组。如果有匹配,插件将相应的*mysql_user_name*返回给 MySQL 服务器。如果没有匹配,则认证失败。

用户名称匹配优先于组名称匹配。假设名为win_user的 Windows 用户是win_group的成员,并且认证字符串如下所示:

'win_group = sql_user1, win_user = sql_user2'

win_user连接到 MySQL 服务器时,既与win_group匹配,也与win_user匹配。插件将用户验证为sql_user2,因为更具体的用户匹配优先于组匹配,即使组在认证字符串中首先列出。

Windows 身份验证始终适用于从运行服务器的同一台计算机发起的连接。对于跨计算机连接,两台计算机必须在 Microsoft  Active Directory 中注册。如果它们在同一个 Windows  域中,则无需指定域名。也可以允许来自不同域的连接,就像这个例子中一样:

CREATE USER sql_accounting
  IDENTIFIED WITH authentication_windows
  AS 'SomeDomain\\Accounting';

这里 SomeDomain 是另一个域的名称。反斜杠字符被加倍,因为它是字符串中的 MySQL 转义字符。

MySQL 支持代理用户的概念,即客户端可以使用一个账户连接和认证到 MySQL 服务器,但在连接时具有另一个账户的权限(参见  Section 8.2.19, “Proxy Users”)。假设您希望 Windows 用户使用单个用户名连接,但根据其 Windows  用户和组名称映射到特定的 MySQL 账户,如下所示:

  • local_userMyDomain\domain_user 本地和域 Windows 用户应映射到 local_wlad MySQL 账户。
  • MyDomain\Developers 域组中的用户应映射到 local_dev MySQL 账户。
  • 本地机器管理员应映射到 local_admin MySQL 账户。

要设置这个,为 Windows 用户创建一个代理账户进行连接,并配置此账户,使用户和组映射到适当的 MySQL 账户(local_wladlocal_devlocal_admin)。此外,授予 MySQL 账户执行所需操作的适当权限。以下说明使用 win_proxy 作为代理账户,local_wladlocal_devlocal_admin 作为代理账户。

  1. 创建代理 MySQL 账户:
CREATE USER win_proxy
  IDENTIFIED WITH  authentication_windows
  AS 'local_user = local_wlad,
      MyDomain\\domain_user = local_wlad,
      MyDomain\\Developers = local_dev,
      BUILTIN\\Administrators = local_admin';
  1. 为了使代理工作,代理账户必须存在,因此创建它们:
CREATE USER local_wlad
  IDENTIFIED WITH mysql_no_login;
CREATE USER local_dev
  IDENTIFIED WITH mysql_no_login;
CREATE USER local_admin
  IDENTIFIED WITH mysql_no_login;
  1. 代理账户使用 mysql_no_login 认证插件,以防止客户端直接使用这些账户登录到 MySQL 服务器。相反,使用 Windows 进行身份验证的用户应该使用 win_proxy 代理账户。(这假定插件已安装。有关说明,请参见 Section 8.4.1.9, “No-Login Pluggable  Authentication”。)有关保护代理账户免受直接使用的替代方法,请参见 Preventing Direct Login to  Proxied Accounts。
    您还应该执行 GRANT 语句(未显示),为每个代理账户授予所需的 MySQL 访问权限。
  2. 为代理账户授予 PROXY 权限,以代表每个代理账户:
GRANT PROXY ON local_wlad TO win_proxy;
GRANT PROXY ON local_dev TO win_proxy;
GRANT PROXY ON local_admin TO win_proxy;

现在,Windows 用户local_userMyDomain\domain_user可以作为win_proxy连接到 MySQL 服务器,并在经过身份验证后具有身份验证字符串中指定帐户(在本例中为local_wlad)的权限。以win_proxy身份连接的MyDomain\Developers组中的用户具有local_dev帐户的权限。BUILTIN\Administrators组中的用户具有local_admin帐户的权限。

要配置身份验证,使所有没有自己的 MySQL 帐户的 Windows 用户通过代理帐户进行身份验证,请在上述说明中将默认代理帐户(''@'')替换为win_proxy。有关默认代理帐户的信息,请参阅 Section 8.2.19, “Proxy Users”。

注意

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

要在 Connector/NET 8.0 及更高版本中使用 Windows 身份验证插件与 Connector/NET 连接字符串,请参阅 Connector/NET Authentication。

原文:dev.mysql.com/doc/refman/8.0/en/ldap-pluggable-authentication.html

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) 手册页。


MySQL8 中文参考(二十六)(3)https://developer.aliyun.com/article/1566129

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