MySQL Shell 9.0  /  ...  /  使用 LDAP 和 Kerberos 身份验证

4.3.5 使用 LDAP 和 Kerberos 身份验证

MySQL 企业版支持允许 MySQL Server 使用 LDAP(轻量级目录访问协议)、LDAP 与 Kerberos 或本地 Kerberos 对 MySQL 用户进行身份验证的身份验证方法。MySQL Shell 支持对经典 MySQL 协议连接使用 LDAP 和 Kerberos 身份验证。X 协议连接不支持此功能。

以下各节介绍如何使用 LDAP 和 Kerberos 身份验证启用与 MySQL 服务器的连接。假定服务器正在运行启用了服务器端插件,并且客户端主机上提供了客户端插件。

简单的 LDAP 身份验证

MySQL 和 LDAP 协同工作以获取用户、凭据和组信息。有关简单 LDAP 身份验证过程的概述,请参阅 MySQL 用户的 LDAP 身份验证如何工作。要在 MySQL Shell 中使用简单的 LDAP 身份验证,必须满足以下条件

  • 必须在设置为与 LDAP 服务器通信的 MySQL 服务器上创建一个用户帐户。必须使用 authentication_ldap_simple 服务器端插件和可选的 LDAP 用户可分辨名称 (DN) 来标识 MySQL 用户。例如

    CREATE USER 'admin'@'localhost'
       IDENTIFIED WITH authentication_ldap_simple 
       BY 'uid=admin,ou=People,dc=my-domain,dc=com';

    此示例中的 BY 子句指示 MySQL 帐户针对哪个 LDAP 条目进行身份验证。DN 的特定属性可能因 LDAP 服务器而异。

  • MySQL Shell 使用客户端 mysql_clear_password 插件,该插件将密码以明文形式发送到服务器。不使用密码哈希或加密,因此需要在 MySQL Shell 和服务器之间建立安全连接(使用 SSL 或套接字)。有关更多信息,请参阅 第 4.3.4 节“使用加密连接”第 4.3.3 节“使用 Unix 套接字和 Windows 命名管道进行连接”

  • 为了最大程度地降低安全风险,必须通过在安全连接上将 --auth-method 命令行选项的值设置为 clear_text_password 来显式启用 mysql_clear_password 插件。例如,以下命令允许您为在先前示例中创建的用户建立全局会话

    $> mysqlsh admin@localhost:3308 --auth-method=clear_text_password
    Please provide the password for 'admin@localhost:3308': admin_password (admin LDAP password)
    注意

    您还可以设置环境变量 LIBMYSQL_ENABLE_CLEARTEXT_PLUGIN,并为所有客户端连接启用 mysql_clear_password 插件。但是,此方法本质上是不安全的,除测试外,不建议用于任何情况。有关更多信息,请参阅 客户端明文可插拔身份验证

基于 SASL 的 LDAP 身份验证

MySQL Server 可以接受来自 LDAP 目录中 MySQL 授权表之外定义的用户连接。客户端和服务器端 SASL LDAP 插件使用 SASL 消息在 LDAP 协议内安全传输凭据(请参阅 使用 LDAP 可插拔身份验证)。

对于基于 SASL 的身份验证,必须使用 authentication_ldap_sasl 服务器端插件和可选的 MySQL 帐户针对其进行身份验证的 LDAP 条目来标识 MySQL 用户。例如

CREATE USER 'sammy'@'localhost' 
   IDENTIFIED WITH authentication_ldap_sasl
   BY 'uid=sammy_ldap,ou=People,dc=my-domain,dc=com';

authentication_ldap_sasl_client 客户端插件随 MySQL Server 软件包一起提供,而不是内置于 libmysqlclient 客户端库中。MySQL Shell 提供了持久连接选项 shell.options.mysqlPluginDir,使您能够定义所需插件的位置。或者,您可以通过使用非持久性命令行选项 --mysql-plugin-dir 指定路径来覆盖持久性设置。例如,以下命令允许您在 Linux 主机上为先前示例中创建的用户建立全局会话

$> mysqlsh sammy@localhost:3308 --mysql-plugin-dir="/usr/local/mysql/lib/plugin"
Please provide the password for 'sammy@localhost:3308': sammy_password (sammy_ldap LDAP password)

有关其他使用示例,请参阅 使用代理进行 LDAP 身份验证LDAP 身份验证组首选项和映射规范

通过 LDAP SASL 进行 GSSAPI/Kerberos 身份验证

MySQL Shell 还支持通过 LDAP SASL 进行 Kerberos 身份验证。此类连接使用通用安全服务应用程序编程接口 (GSSAPI) 安全抽象接口对 Kerberos 进行身份验证以获取服务凭据,然后依次使用这些凭据来启用对其他服务的安全访问。仅在 Linux 上的 MySQL 服务器和 MySQL Shell 支持 GSSAPI/Kerberos 作为 LDAP 身份验证方法。

GSSAPI 库和 Kerberos 服务必须可用于 MySQL Server 才能成功连接。有关服务器端配置信息,请参阅 GSSAPI/Kerberos 身份验证方法

以下常规示例创建名为 [email protected] 的代理用户,该用户假定名为 proxied_krb_usr 的代理用户的权限。它假定在 /etc/krb5.conf Kerberos 配置文件中配置了领域域 MYSQL.LOCAL

注意

帐户名称的用户部分包括主体域,因此 '[email protected]' 被引用为 LDAP Kerberos 身份验证的单个值。

CREATE USER '[email protected]' 
   IDENTIFIED WITH authentication_ldap_sasl 
   BY '#krb_grp=proxied_krb_user';
CREATE USER 'proxied_krb_user';
GRANT ALL PRIVILEGES ON my_db.* TO 'proxied_krb_user';
GRANT PROXY on 'proxied_krb_user' TO '[email protected]';

以下命令允许您在 Linux 主机上为先前示例中创建的用户建立全局会话。您必须指定服务器插件目录的位置,可以指定为持久性 shell.options.mysqlPluginDir 连接选项,也可以指定为非持久性命令选项,例如

$> mysqlsh lucy%40MYSQL.LOCAL:password@localhost:3308/my_db 
--mysql-plugin-dir="/usr/local/mysql/lib/plugin"

在此示例中,百分号编码 (%40) 替换主体名称中的保留字符 @password 是为 MySQL Server 变量 authentication_ldap_sasl_bind_root_pwd 设置的值。有关通过 LDAP SASL 进行 Kerberos 身份验证的相关服务器变量列表,请参阅 为 GSSAPI/Kerberos 配置服务器端 SASL LDAP 身份验证插件

在调用 MySQL Shell 之前,您可以独立于 MySQL 从密钥分发中心获取和缓存票据授予票据 (TGT)。在这种情况下,调用 MySQL Shell 时不要指定用户名或密码选项

$> mysqlsh localhost:3308/my_db --auth-method=authentication_ldap_sasl_client 
--mysql-plugin-dir="/usr/local/mysql/lib/plugin"

省略用户凭据时,必须指定 --auth-method=authentication_ldap_sasl_client 选项。

Kerberos 身份验证

MySQL Shell 能够为使用 authentication_kerberos 服务器端身份验证插件的帐户建立连接,前提是可以从 Kerberos 获取或可以获得正确的 Kerberos 票据。从 MySQL 企业版 8.0.27 开始,该功能在运行 Linux 和 Windows 的主机上可用(版本 8.0.26 仅支持 Linux)。有关详细的设置信息,请参阅 Kerberos 可插拔身份验证

Kerberos 身份验证可以组合用户名(例如 lucy)和用户帐户中指定的领域域(例如 MYSQL.LOCAL)来构造用户主体名称 (UPN),例如 [email protected]。要创建与 UPN [email protected] 对应的 MySQL 帐户,请使用以下语句

CREATE USER 'lucy' 
   IDENTIFIED WITH authentication_kerberos 
   BY 'MYSQL.LOCAL';

客户端插件使用 UPN 和密码来获取票据授予票据 (TGT),使用 TGT 来获取 MySQL 服务票据 (ST),并使用 ST 来对 MySQL 服务器进行身份验证。

以下命令允许您在 Linux 主机上为先前示例中创建的用户建立全局会话。您必须指定服务器插件目录的位置,可以指定为持久性 shell.options.mysqlPluginDir 连接选项,也可以指定为非持久性命令选项,例如

$> mysqlsh lucy:3308 --mysql-plugin-dir="/usr/local/mysql/lib/plugin"
Please provide the password for 'lucy@localhost:3308': UPN_password

在调用 MySQL Shell 之前,您可以独立于 MySQL 从密钥分发中心获取和缓存 TGT。在这种情况下,调用 MySQL Shell 时不要指定用户名或密码选项

$> mysqlsh localhost:3308 --auth-method=authentication_kerberos_client
--mysql-plugin-dir="/usr/local/mysql/lib/plugin"

省略用户凭据时,必须指定 --auth-method=authentication_kerberos_client 选项。

在 Microsoft Windows 平台上,可以使用 plugin-authentication-kerberos-client-mode 连接选项定义 Kerberos 客户端模式,SSPIGSSAPI。此选项以以下格式提供

  • 命令行选项:--plugin-authentication-kerberos-client-mode=SSPI | GSSAPI

  • 连接查询选项:user@host:port?plugin-authentication-kerberos-client-mode=SSPI | GSSAPI

  • URI 字典选项:plugin-authentication-kerberos-client-mode': 'SSPI' | 'GSSAPI',例如

     shell.connect({'user': 'mysql', 'auth-method':'authentication_kerberos_client', 'host': '127.0.0.1', 
                    'password': 'mysqlpa$$w0rd', 'plugin-authentication-kerberos-client-mode': 'GSSAPI', 
                    'scheme': 'mysql'});

您还可以在配置文件中指定 plugin-authentication-kerberos-client-mode。如果它存在于配置文件中,则将其用作默认值。

如果未定义 plugin-authentication-kerberos-client-mode,则默认情况下使用 SSPI

使用 Kerberos 身份验证连接到 MySQL 服务器时,身份验证模式具有以下行为

  • GSSAPI:

    • 如果未提供密码,则从 MIT Kerberos 缓存中检索身份验证票据。如果找不到有效的票据,则连接失败。

    • 如果提供了密码,则从 Kerberos 服务器检索身份验证票据并将其存储在 MIT Kerberos 缓存中。

    • 如果未提供帐户名,则 Windows 用户名将用作 MySQL 帐户名。

  • SSPI:

    • 如果未提供密码,则使用 Windows 单点登录票据。

    • 如果提供了密码,则身份验证票据存储在临时的内存存储中。