MySQL 企业版支持允许 MySQL 服务器使用 LDAP(轻量级目录访问协议)、LDAP 和 Kerberos 或原生 Kerberos 对 MySQL 用户进行身份验证的身份验证方法。MySQL Shell 支持对经典 MySQL 协议连接使用 LDAP 和 Kerberos 身份验证。X 协议连接不支持此功能。
以下部分介绍如何使用 LDAP 和 Kerberos 身份验证启用与 MySQL 服务器的连接。假设服务器在启用了服务器端插件的情况下运行,并且客户端主机上提供了客户端插件。
MySQL 和 LDAP 协同工作以获取用户、凭据和组信息。有关简单 LDAP 身份验证过程的概述,请参阅 MySQL 用户的 LDAP 身份验证工作原理。要将简单 LDAP 身份验证与 MySQL Shell 一起使用,必须满足以下条件
-
必须在设置为与 LDAP 服务器通信的 MySQL 服务器上创建一个用户帐户。MySQL 用户必须使用
authentication_ldap_simple
服务器端插件进行标识,并可以选择使用 LDAP 用户可分辨名称 (DN)。例如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
插件。但是,此方法本质上是不安全的,不建议在测试以外的任何情况下使用。有关更多信息,请参阅 客户端明文可插拔身份验证。
MySQL 服务器能够接受来自在 LDAP 目录中 MySQL 授权表外部定义的用户的连接。客户端和服务器端 SASL LDAP 插件使用 SASL 消息在 LDAP 协议中安全传输凭据(请参阅 使用 LDAP 可插拔身份验证)。
对于基于 SASL 的身份验证,MySQL 用户必须使用 authentication_ldap_sasl
服务器端插件进行标识,并可以选择 MySQL 帐户针对其进行身份验证的 LDAP 条目。例如
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 服务器软件包一起提供,而不是内置于 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 身份验证组首选项和映射规范。
MySQL Shell 还支持通过 LDAP SASL 进行 Kerberos 身份验证。使用通用安全服务应用程序编程接口 (GSSAPI) 安全抽象接口,此类连接对 Kerberos 进行身份验证以获取服务凭据,然后依次使用这些凭据启用对其他服务的安全访问。仅在 Linux 上的 MySQL 服务器和 MySQL Shell 上支持 GSSAPI/Kerberos 作为 LDAP 身份验证方法。
GSSAPI 库和 Kerberos 服务必须对 MySQL 服务器可用,连接才能成功。有关服务器端配置信息,请参阅 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 服务器变量 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 票据或可以从 Kerberos 获取正确的 Kerberos 票据,则 MySQL Shell 能够为使用 authentication_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 客户端模式,SSPI
或 GSSAPI
。此选项提供以下格式
命令行选项:
--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 单点登录票证。
如果提供了密码,则身份验证票证存储在临时的内存存储中。