MySQL 企业版支持允许 MySQL Server 使用 LDAP(轻量级目录访问协议)、LDAP 与 Kerberos 或本地 Kerberos 对 MySQL 用户进行身份验证的身份验证方法。MySQL Shell 支持对经典 MySQL 协议连接使用 LDAP 和 Kerberos 身份验证。X 协议连接不支持此功能。
以下各节介绍如何使用 LDAP 和 Kerberos 身份验证启用与 MySQL 服务器的连接。假定服务器正在运行启用了服务器端插件,并且客户端主机上提供了客户端插件。
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
插件。但是,此方法本质上是不安全的,除测试外,不建议用于任何情况。有关更多信息,请参阅 客户端明文可插拔身份验证。
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 身份验证组首选项和映射规范。
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
选项。
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 客户端模式,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 单点登录票据。
如果提供了密码,则身份验证票据存储在临时的内存存储中。