Documentation Home
MySQL 外壳 8.0  / 第 4 章 MySQL Shell 入门  / 4.3 MySQL Shell 连接  /  4.3.4 使用 LDAP 和 Kerberos 身份验证

4.3.4 使用 LDAP 和 Kerberos 身份验证

MySQL 企业版支持使 MySQL 服务器能够使用 LDAP(轻量级目录访问协议)、带 Kerberos 的 LDAP 或本机 Kerberos 对 MySQL 用户进行身份验证的身份验证方法。MySQL Shell 8.0.27 支持经典 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.3 节,“使用加密连接”第 4.3.2 节,“使用 Unix 套接字和 Windows 命名管道进行连接”

  • 为了最大限度地降低安全风险, 必须通过将命令行选项的值设置为on a secure connectionmysql_clear_password来显式启用该插件 。例如,以下命令允许您为在上一个示例中创建的用户建立一个全局会话: --auth-methodclear_text_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 服务器能够接受来自 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';

客户端插件随 MySQL 服务器包一起提供,authentication_ldap_sasl_client 而不是内置到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 进行身份验证以获取服务凭证,然后依次使用这些凭证来实现对其他服务的安全访问。仅支持 GSSAPI/Kerberos 作为 Linux 上的 MySQL 服务器和 MySQL Shell 的 LDAP 身份验证方法。

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

下面的一般示例创建了代理用户 named lucy@MYSQL.LOCAL,它承担了被代理用户 named 的特权 proxied_krb_usr。它假定在​​ Kerberos 配置文件 MYSQL.LOCAL中配置 了领域域。/etc/krb5.conf

笔记

帐户名的用户部分包括主体域,因此“lucy@MYSQL.LOCAL”被引用为 LDAP Kerberos 身份验证的单个值。

CREATE USER 'lucy@MYSQL.LOCAL' 
   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 'lucy@MYSQL.LOCAL';

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

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

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

在调用 MySQL Shell 之前,您可以独立于 MySQL 从密钥分发中心获取并缓存票证授予票证。在这种情况下,调用 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),例如 lucy@MYSQL.LOCAL. 要创建与 UPN 对应的 MySQL 帐户 lucy@MYSQL.LOCAL,请使用以下语句:

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 省略用户凭据时,必须 指定该 选项。