Kerberos 可插拔身份验证是 MySQL 企业版中包含的扩展,MySQL 企业版是商业产品。要了解有关商业产品的更多信息,请参见 https://www.mysqlserver.cn/products/.
MySQL 企业版支持一种身份验证方法,该方法允许用户使用 Kerberos 身份验证到 MySQL 服务器,前提是合适的 Kerberos 票证可用或可以获取。
此身份验证方法在 MySQL 8.4 中适用于 Linux 上的 MySQL 服务器和客户端。它在 Linux 环境中很有用,在这些环境中,应用程序可以访问 Microsoft Active Directory,Active Directory 默认情况下启用了 Kerberos。客户端插件也支持在 Windows 上运行。服务器端插件仍仅支持在 Linux 上运行。
Kerberos 可插拔身份验证提供以下功能
外部身份验证:Kerberos 身份验证使 MySQL 服务器能够接受来自在 MySQL 授权表之外定义的用户的连接,这些用户已获得正确的 Kerberos 票证。
安全性:Kerberos 使用票证以及对称密钥加密,从而能够在不通过网络发送密码的情况下进行身份验证。Kerberos 身份验证支持无用户和无密码方案。
下表显示了插件和库文件名。文件名后缀可能因您的系统而异。该文件必须位于由 plugin_dir
系统变量指定的目录中。有关安装信息,请参见 安装 Kerberos 可插拔身份验证。
表 8.24 Kerberos 身份验证的插件和库名称
插件或文件 | 插件或文件名 |
---|---|
服务器端插件 | authentication_kerberos |
客户端插件 | authentication_kerberos_client |
库文件 | authentication_kerberos.so , authentication_kerberos_client.so |
服务器端 Kerberos 身份验证插件仅包含在 MySQL 企业版中。它不包含在 MySQL 社区发行版中。客户端插件包含在所有发行版中,包括社区发行版。这使来自任何发行版的客户端能够连接到已加载服务器端插件的服务器。
以下部分提供了特定于 Kerberos 可插拔身份验证的安装和使用信息
有关 MySQL 中可插拔身份验证的一般信息,请参见 第 8.2.17 节,“可插拔身份验证”。
要将 Kerberos 可插拔身份验证用于 MySQL,必须满足以下先决条件
必须提供 Kerberos 服务,以便 Kerberos 身份验证插件与其通信。
每个要由 MySQL 身份验证的 Kerberos 用户(主体)必须存在于 KDC 服务器管理的数据库中。
在使用服务器端或客户端 Kerberos 身份验证插件的系统上,必须提供 Kerberos 客户端库。此外,GSSAPI 用于作为访问 Kerberos 身份验证的接口,因此必须提供 GSSAPI 库。
本节概述了 MySQL 和 Kerberos 如何协同工作以对 MySQL 用户进行身份验证。有关显示如何设置 MySQL 帐户以使用 Kerberos 身份验证插件的示例,请参见 使用 Kerberos 可插拔身份验证。
本文假定您熟悉 Kerberos 的概念和操作。以下列表简要定义了几个常见的 Kerberos 术语。您可能还会发现 RFC 4120 的词汇表部分有所帮助。
使用 Kerberos 进行身份验证需要一个 KDC 服务器,例如,由 Microsoft Active Directory 提供。
MySQL 中的 Kerberos 身份验证使用通用安全服务应用程序编程接口 (GSSAPI),它是一个安全抽象接口。Kerberos 是可以通过该抽象接口使用的特定安全协议的实例。使用 GSSAPI,应用程序向 Kerberos 进行身份验证以获取服务凭据,然后依次使用这些凭据来启用对其他服务的安全访问。
在 Windows 上,authentication_kerberos_client
身份验证插件支持两种模式,客户端用户可以在运行时设置或在选项文件中指定。
SSPI
模式:安全支持提供程序接口 (SSPI) 实现 GSSAPI(参见 SSPI 模式下 Windows 客户端的命令)。SSPI 虽然在线路级别与 GSSAPI 兼容,但仅支持 Windows 单点登录场景,并且专门指已登录的用户。SSPI 是大多数 Windows 客户端上的默认模式。GSSAPI
模式:通过 Windows 上的 MIT Kerberos 库支持 GSSAPI(参见 GSSAPI 模式下 Windows 客户端的命令)。
使用 Kerberos 身份验证插件,应用程序和 MySQL 服务器能够使用 Kerberos 身份验证协议来相互验证用户和 MySQL 服务的身份。这样,用户和服务器都可以验证彼此的身份。没有密码通过网络发送,Kerberos 协议消息受到保护,防止窃听和重放攻击。
Kerberos 身份验证遵循以下步骤,其中服务器端和客户端部分分别使用 authentication_kerberos
和 authentication_kerberos_client
身份验证插件执行。
MySQL 服务器向客户端应用程序发送其服务主体名称。此 SPN 必须在 Kerberos 系统中注册,并且在服务器端使用
authentication_kerberos_service_principal
系统变量进行配置。使用 GSSAPI,客户端应用程序创建一个 Kerberos 客户端身份验证会话,并与 Kerberos KDC 交换 Kerberos 消息。
客户端从认证服务器获取票据授予票据。
使用 TGT,客户端从票据授予服务获取 MySQL 的服务票据。
如果 TGT、ST 或两者都已缓存在本地,则可以跳过或部分跳过此步骤。客户端可以选择使用客户端密钥表文件来获取 TGT 和 ST,而无需提供密码。
使用 GSSAPI,客户端应用程序将 MySQL ST 呈现给 MySQL 服务器。
使用 GSSAPI,MySQL 服务器创建一个 Kerberos 服务器端身份验证会话。服务器验证用户身份和用户请求的有效性。它使用其服务密钥表文件中配置的服务密钥对 ST 进行身份验证,以确定身份验证是否成功,并将身份验证结果返回给客户端。
应用程序能够使用提供的用户名和密码进行身份验证,或者使用本地缓存的 TGT 或 ST(例如,使用 kinit 或类似命令创建)。因此,此设计涵盖了从完全无用户和无密码连接(从本地存储的 Kerberos 缓存中获取 Kerberos 服务票据)到同时提供用户名和密码并使用它们从 KDC 获取有效 Kerberos 服务票据以发送到 MySQL 服务器的各种用例。
如前述描述中所示,MySQL Kerberos 身份验证使用两种类型的密钥表文件。
在客户端主机上,客户端密钥表文件可用于获取 TGT 和 ST,而无需提供密码。参见 Kerberos 身份验证的客户端配置参数。
在 MySQL 服务器主机上,服务器端服务密钥表文件用于验证 MySQL 服务器从客户端接收的服务票据。密钥表文件名使用
authentication_kerberos_service_key_tab
系统变量配置。
有关密钥表文件的更多信息,请参见 https://web.mit.edu/kerberos/krb5-latest/doc/basic/keytab_def.html。
本节介绍如何安装服务器端 Kerberos 身份验证插件。有关安装插件的常规信息,请参见 第 7.6.1 节,“安装和卸载插件”。
服务器端插件仅在 Linux 系统上受支持。在 Windows 系统上,仅支持客户端插件,它可以在 Windows 系统上用于连接到使用 Kerberos 身份验证的 Linux 服务器。
要使服务器能够使用该插件,插件库文件必须位于 MySQL 插件目录(由 plugin_dir
系统变量指定的目录)中。如有必要,请通过在服务器启动时设置 plugin_dir
的值来配置插件目录位置。
服务器端插件库文件的基本名称为 authentication_kerberos
。Unix 和类 Unix 系统的文件名后缀为 .so
。
要在服务器启动时加载插件,请使用 --plugin-load-add
选项来命名包含它的库文件。使用这种插件加载方法,必须在每次服务器启动时提供该选项。此外,还要为要配置的任何插件提供的系统变量指定值。该插件公开这些系统变量,从而可以配置其操作。
authentication_kerberos_service_principal
:MySQL 服务主体名称 (SPN)。此名称将发送给尝试使用 Kerberos 进行身份验证的客户端。SPN 必须存在于 KDC 服务器管理的数据库中。默认值为mysql/
。主机名
@领域名
authentication_kerberos_service_key_tab
:用于验证从客户端接收的票据的密钥表文件。此文件必须存在并包含 SPN 的有效密钥,否则客户端身份验证将失败。默认值为数据目录中的mysql.keytab
。
有关所有 Kerberos 身份验证系统变量的详细信息,请参见 第 8.4.1.13 节,“可插拔身份验证系统变量”。
要加载插件并配置它,请在您的 my.cnf
文件中添加以下内容,使用适合您的安装的系统变量值。
[mysqld]
plugin-load-add=authentication_kerberos.so
authentication_kerberos_service_principal=mysql/[email protected]
authentication_kerberos_service_key_tab=/var/mysql/data/mysql.keytab
修改 my.cnf
后,重新启动服务器以使新设置生效。
或者,要在运行时加载插件,请使用以下语句。
INSTALL PLUGIN authentication_kerberos
SONAME 'authentication_kerberos.so';
INSTALL PLUGIN
会立即加载插件,并将它注册到 mysql.plugins
系统表中,以便服务器在每次随后的正常启动时加载它,而无需使用 --plugin-load-add
。
当您在运行时安装插件而不在 my.cnf
文件中配置其系统变量时,系统变量 authentication_kerberos_service_key_tab
将设置为数据目录中的默认值 mysql.keytab
。此系统变量的值无法在运行时更改,因此,如果您需要指定其他文件,则需要将设置添加到您的 my.cnf
文件中,然后重新启动 MySQL 服务器。例如。
[mysqld]
authentication_kerberos_service_key_tab=/var/mysql/data/mysql.keytab
如果密钥表文件不在正确的位置或不包含有效的 SPN 密钥,MySQL 服务器不会验证这一点,但客户端会返回身份验证错误,直到您修复问题为止。
可以使用 SET PERSIST
语句在运行时设置并持久化 authentication_kerberos_service_principal
系统变量,而无需重新启动服务器。
SET PERSIST authentication_kerberos_service_principal='mysql/[email protected]';
SET PERSIST
为正在运行的 MySQL 实例设置值。它还会保存该值,使其在随后的服务器重启时保留。要更改正在运行的 MySQL 实例的值,而不使其在随后的重启时保留,请使用 GLOBAL
关键字而不是 PERSIST
。参见 第 15.7.6.1 节,“SET 语法用于变量赋值”。
要验证插件安装,请检查 Information Schema PLUGINS
表或使用 SHOW PLUGINS
语句(参见 第 7.6.2 节,“获取服务器插件信息”)。例如。
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
FROM INFORMATION_SCHEMA.PLUGINS
WHERE PLUGIN_NAME = 'authentication_kerberos';
+-------------------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+-------------------------+---------------+
| authentication_kerberos | ACTIVE |
+-------------------------+---------------+
如果插件无法初始化,请检查服务器错误日志以获取诊断消息。
要将 MySQL 帐户与 Kerberos 插件关联,请参见 使用 Kerberos 可插拔身份验证。
本节介绍如何启用 MySQL 帐户使用 Kerberos 可插拔身份验证连接到 MySQL 服务器。假设服务器正在运行,并且启用了服务器端插件,如 安装 Kerberos 可插拔身份验证 中所述,并且客户端主机上提供了客户端插件。
验证 Kerberos 可用性
以下示例演示了如何在 Active Directory 中测试 Kerberos 的可用性。该示例做出了以下假设。
Active Directory 正在名为
krbauth.example.com
的主机上运行,IP 地址为198.51.100.11
。与 MySQL 相关的 Kerberos 身份验证使用
MYSQL.LOCAL
域,也使用MYSQL.LOCAL
作为领域名。名为
[email protected]
的主体已在 KDC 中注册。(在之后的讨论中,该主体名称与使用 Kerberos 认证到 MySQL 服务器的 MySQL 帐户相关联。)
在满足这些假设的情况下,请遵循以下步骤
验证 Kerberos 库是否已正确安装并在操作系统中配置。例如,要配置
MYSQL.LOCAL
域和区域以在 MySQL 身份验证期间使用,/etc/krb5.conf
Kerberos 配置文件应包含类似以下内容[realms] MYSQL.LOCAL = { kdc = krbauth.example.com admin_server = krbauth.example.com default_domain = MYSQL.LOCAL }
您可能需要在
/etc/hosts
中添加服务器主机条目198.51.100.11 krbauth krbauth.example.com
检查 Kerberos 身份验证是否正常工作
使用 kinit 认证到 Kerberos
$> kinit [email protected] Password for [email protected]: (enter password here)
该命令为名为
[email protected]
的 Kerberos 主体进行认证。当命令提示输入时,输入主体的密码。KDC 返回 TGT,该 TGT 缓存在客户端,供其他支持 Kerberos 的应用程序使用。使用 klist 检查是否已正确获取 TGT。输出应类似于以下内容
$> klist Ticket cache: FILE:/tmp/krb5cc_244306 Default principal: [email protected] Valid starting Expires Service principal 03/23/2021 08:18:33 03/23/2021 18:18:33 krbtgt/[email protected]
创建使用 Kerberos 身份验证的 MySQL 帐户
使用 authentication_kerberos
身份验证插件进行的 MySQL 身份验证基于 Kerberos 用户主体名称 (UPN)。以下说明假设名为 karl
的 MySQL 用户使用 Kerberos 认证到 MySQL,Kerberos 区域名为 MYSQL.LOCAL
,用户主体名称为 [email protected]
。此 UPN 必须在几个地方注册
Kerberos 管理员应将用户名注册为 Kerberos 主体。此名称包括一个区域名称。客户端使用主体名称和密码来认证 Kerberos 并获取票据授予票据 (TGT)。
MySQL DBA 应创建与 Kerberos 主体名称相对应的帐户,该帐户使用 Kerberos 插件进行认证。
假设 Kerberos 用户主体名称已由相应的服务管理员注册,并且如先前在 安装 Kerberos 可插拔身份验证 中所述,MySQL 服务器已使用服务器端 Kerberos 插件的适当配置设置启动。要创建与
的 Kerberos UPN 相对应的 MySQL 帐户,MySQL DBA 使用类似以下语句user
@realm_name
CREATE USER user
IDENTIFIED WITH authentication_kerberos
BY 'realm_name';
由 user
指定的帐户可以包含或省略主机名部分。如果省略主机名,则默认情况下它会像往常一样为 %
。 realm_name
存储为 mysql.user
系统表中帐户的 authentication_string
值。
要创建与 UPN [email protected]
相对应的 MySQL 帐户,请使用以下语句
CREATE USER 'karl'
IDENTIFIED WITH authentication_kerberos
BY 'MYSQL.LOCAL';
如果 MySQL 必须为该帐户构造 UPN,例如,要获取或验证票据 (TGT 或 ST),则它会通过组合帐户名(忽略任何主机名部分)和区域名来执行此操作。例如,从前面的 CREATE USER
语句生成的完整帐户名为 'karl'@'%'
。MySQL 从用户名部分 karl
(忽略主机名部分)和区域名 MYSQL.LOCAL
构造 UPN,以生成 [email protected]
。
请注意,在创建使用 authentication_kerberos
进行认证的帐户时,CREATE USER
语句不包含 UPN 区域作为用户名的一部分。相反,在 BY
子句中指定区域(在本例中为 MYSQL.LOCAL
)。这与创建使用 authentication_ldap_sasl
SASL LDAP 身份验证插件和 GSSAPI/Kerberos 身份验证方法的帐户不同。对于此类帐户,CREATE USER
语句确实包含 UPN 区域作为用户名的一部分。请参阅 创建使用 GSSAPI/Kerberos 进行 LDAP 身份验证的 MySQL 帐户。
设置完帐户后,客户端可以使用它连接到 MySQL 服务器。该过程取决于客户端主机运行的是 Linux 还是 Windows,如下面的讨论所述。
使用 authentication_kerberos
受限于不支持具有相同用户部分但区域部分不同的 UPN。例如,您不能创建与这两个 UPN 相对应的 MySQL 帐户
[email protected]
[email protected]
这两个 UPN 的用户部分都为 kate
,但区域部分不同 (MYSQL.LOCAL
与 EXAMPLE.COM
)。这是不允许的。
使用 MySQL 帐户连接到 MySQL 服务器
设置完使用 Kerberos 认证的 MySQL 帐户后,客户端可以使用它按如下方式连接到 MySQL 服务器
使用用户主体名称 (UPN) 及其密码认证 Kerberos,以获取票据授予票据 (TGT)。
使用 TGT 获取 MySQL 的服务票据 (ST)。
通过出示 MySQL ST 认证到 MySQL 服务器。
第一步(认证到 Kerberos)可以通过多种方式执行
在连接到 MySQL 之前
在 Linux 上或在 Windows 的
GSSAPI
模式下,调用 kinit 获取 TGT 并将其保存到 Kerberos 凭据缓存中。在 Windows 的
SSPI
模式下,身份验证可能已在登录时完成,这会将 TGT 保存到登录用户的 Windows 内存缓存中。kinit 不使用,也没有 Kerberos 缓存。
连接到 MySQL 时,如果客户端程序可以确定所需的 Kerberos UPN 和密码,则客户端程序本身可以获取 TGT
该信息可以来自命令选项或操作系统等来源。
在 Linux 上,客户端还可以使用密钥表文件或
/etc/krb5.conf
配置文件。Windows 客户端在GSSAPI
模式下使用配置文件。Windows 客户端在SSPI
模式下既不使用。
连接到 MySQL 服务器的客户端命令的详细信息因 Linux 和 Windows 而异,因此每种主机类型都会单独讨论,但这些命令属性适用于任何主机类型
显示的每个命令都包含以下选项,但每个选项都可以在特定条件下省略
--default-auth
选项指定客户端身份验证插件的名称 (authentication_kerberos_client
)。当指定--user
选项时,可以省略此选项,因为在这种情况下,MySQL 可以从 MySQL 服务器发送的用户帐户信息中确定插件。--plugin-dir
选项指示客户端程序authentication_kerberos_client
插件的位置。如果插件安装在默认(编译时)位置,则可以省略此选项。
命令还应包含任何其他选项(例如
--host
或--port
),这些选项是指定要连接到的 MySQL 服务器所必需的。在单行上输入每个命令。如果命令包含
--password
选项以请求密码,则在提示时输入与 MySQL 用户关联的 Kerberos UPN 的密码。
在 Linux 上,连接到 MySQL 服务器的适当客户端命令因命令是使用 Kerberos 缓存中的 TGT 进行认证,还是基于 MySQL 用户名和 UPN 密码的命令选项而异
在调用 MySQL 客户端程序之前,客户端用户可以独立于 MySQL 从 KDC 获取 TGT。例如,客户端用户可以使用 kinit 通过提供 Kerberos 用户主体名称和主体密码来认证 Kerberos
$> kinit [email protected] Password for [email protected]: (enter password here)
生成的 UPN 的 TGT 缓存在缓存中,并可供其他支持 Kerberos 的应用程序(例如使用客户端 Kerberos 身份验证插件的程序)使用。在这种情况下,请在不指定用户名或密码选项的情况下调用客户端
mysql --default-auth=authentication_kerberos_client --plugin-dir=path/to/plugin/directory
客户端插件在缓存中找到 TGT,使用它获取 MySQL ST,并使用 ST 认证到 MySQL 服务器。
如上所述,当 UPN 的 TGT 缓存在缓存中时,客户端命令不需要用户名和密码选项。如果命令包含它们,则会按如下方式处理它们
此命令包含用户名选项
mysql --default-auth=authentication_kerberos_client --plugin-dir=path/to/plugin/directory --user=karl
在这种情况下,如果选项指定的用户名与 TGT 中的 UPN 的用户名部分不匹配,则身份验证将失败。
此命令包含密码选项,您在提示时输入该选项
mysql --default-auth=authentication_kerberos_client --plugin-dir=path/to/plugin/directory --password
在这种情况下,客户端插件会忽略密码。由于身份验证基于 TGT,因此它可以成功即使用户提供的密码不正确。出于这个原因,如果找到导致忽略密码的有效 TGT,则插件会发出警告。
如果 Kerberos 缓存不包含 TGT,则客户端 Kerberos 身份验证插件本身可以从 KDC 获取 TGT。使用 MySQL 用户名和密码的选项调用客户端,然后在提示时输入 UPN 密码
mysql --default-auth=authentication_kerberos_client --plugin-dir=path/to/plugin/directory --user=karl --password
客户端 Kerberos 身份验证插件会将用户名 (
karl
) 和用户帐户中指定的区域 (MYSQL.LOCAL
) 组合起来,以构造 UPN ([email protected]
)。客户端插件使用 UPN 和密码获取 TGT,使用 TGT 获取 MySQL ST,并使用 ST 认证到 MySQL 服务器。或者,假设 Kerberos 缓存不包含 TGT,并且命令指定了密码选项,但没有指定用户名选项
mysql --default-auth=authentication_kerberos_client --plugin-dir=path/to/plugin/directory --password
客户端 Kerberos 身份验证插件使用操作系统登录名作为 MySQL 用户名。它会将该用户名和用户 MySQL 帐户中的区域组合起来,以构造 UPN。客户端插件使用 UPN 和密码获取 TGT,使用 TGT 获取 MySQL ST,并使用 ST 认证到 MySQL 服务器。
如果您不确定是否已存在 TGT,可以使用 klist 进行检查。
当客户端 Kerberos 身份验证插件本身获取 TGT 时,客户端用户可能不希望重复使用 TGT。如 Kerberos 身份验证的客户端配置参数 中所述,可以使用本地 /etc/krb5.conf
文件让客户端插件在完成后销毁 TGT。
在 Windows 上,使用默认客户端插件选项 (SSPI) 时,连接到 MySQL 服务器的适当客户端命令因命令是基于 MySQL 用户名和 UPN 密码的命令选项进行认证,还是使用来自 Windows 内存缓存的 TGT 而异。有关 Windows 上的 GSSAPI 模式的详细信息,请参阅 Windows 客户端在 GSSAPI 模式下的命令。
命令可以明确指定 MySQL 用户名和 UPN 密码的选项,或者命令可以省略这些选项
此命令包含 MySQL 用户名和 UPN 密码的选项
mysql --default-auth=authentication_kerberos_client --plugin-dir=path/to/plugin/directory --user=karl --password
客户端 Kerberos 身份验证插件会将用户名 (
karl
) 和用户帐户中指定的区域 (MYSQL.LOCAL
) 组合起来,以构造 UPN ([email protected]
)。客户端插件使用 UPN 和密码获取 TGT,使用 TGT 获取 MySQL ST,并使用 ST 认证到 MySQL 服务器。Windows 内存缓存中的任何信息都会被忽略;用户名和密码选项值优先。
此命令包含 UPN 密码的选项,但不包含 MySQL 用户名的选项
mysql --default-auth=authentication_kerberos_client --plugin-dir=path/to/plugin/directory --password
客户端 Kerberos 身份验证插件使用登录的用户名作为 MySQL 用户名,并将该用户名与域组合到用户的 MySQL 帐户中以构建 UPN。客户端插件使用 UPN 和密码获取 TGT,使用 TGT 获取 MySQL ST,并使用 ST 身份验证到 MySQL 服务器。
此命令不包含任何有关 MySQL 用户名或 UPN 密码的选项。
mysql --default-auth=authentication_kerberos_client --plugin-dir=path/to/plugin/directory
客户端插件从 Windows 内存缓存中获取 TGT,使用 TGT 获取 MySQL ST,并使用 ST 身份验证到 MySQL 服务器。
这种方法要求客户端主机是 Windows Server Active Directory (AD) 域的一部分。如果不是这种情况,请通过手动输入 AD 服务器和域作为 DNS 服务器和前缀来帮助 MySQL 客户端发现 AD 域的 IP 地址。
启动
console.exe
并选择 网络和共享中心。从“网络和共享中心”窗口的侧边栏中,选择 更改适配器设置。
在“网络连接”窗口中,右键单击要配置的网络或 VPN 连接,然后选择
。从 网络 选项卡中,找到并单击 Internet 协议版本 4 (TCP/IPv4),然后单击 。
在“Internet 协议版本 4 (TCP/IPv4) 属性”对话框中单击
。将打开“高级 TCP/IP 设置”对话框。从 DNS 选项卡中,添加 Active Directory 服务器和域作为 DNS 服务器和前缀。
此命令包含有关 MySQL 用户名的选项,但不包含有关 UPN 密码的选项。
mysql --default-auth=authentication_kerberos_client --plugin-dir=path/to/plugin/directory --user=karl
客户端 Kerberos 身份验证插件将用户名的选项指定的名称与登录的用户名进行比较。如果名称相同,插件将使用登录用户的 TGT 进行身份验证。如果名称不同,则身份验证将失败。
在 Windows 上,客户端用户必须使用 plugin_authentication_kerberos_client_mode
插件选项显式指定 GSSAPI
模式,以通过 MIT Kerberos 库启用支持。默认模式为 SSPI
(参见 Windows 客户端在 SSPI 模式下的命令)。
可以在选项文件中调用 MySQL 客户端程序之前指定 GSSAPI
模式。
插件变量名称使用下划线或破折号均有效。
[mysql] plugin_authentication_kerberos_client_mode=GSSAPI
或者
[mysql] plugin-authentication-kerberos-client-mode=GSSAPI
在运行时从命令行使用 mysql 或 mysqldump 客户端程序。例如,以下命令(使用下划线或破折号)会导致 mysql 通过 Windows 上的 MIT Kerberos 库连接到服务器。
mysql [connection-options] --plugin_authentication_kerberos_client_mode=GSSAPI
或者
mysql [connection-options] --plugin-authentication-kerberos-client-mode=GSSAPI
客户端用户可以从 MySQL Workbench 和一些 MySQL 连接器中选择
GSSAPI
模式。在运行 Windows 的客户端主机上,您可以通过设置KRB5_CONFIG
环境变量来覆盖Kerberos 配置文件的默认位置。
使用
KRB5CCNAME
环境变量的默认凭据缓存名称(例如,KRB5CCNAME=DIR:/mydir/
)。
有关特定客户端插件的信息,请参阅 https://dev.mysqlserver.cn/doc/ 上的文档。
连接到 MySQL 服务器的适当客户端命令取决于该命令是使用来自 MIT Kerberos 缓存的 TGT 进行身份验证,还是基于有关 MySQL 用户名和 UPN 密码的命令选项。Windows 上通过 MIT 库实现的 GSSAPI 支持类似于 Linux 上的 GSSAPI(参见 Linux 客户端的命令),以下除外
票证始终从运行 Windows 的主机的 MIT Kerberos 缓存中检索或放置到该缓存中。
kinit 在具有狭窄权限和特定角色的 Windows 功能帐户下运行。客户端用户不知道 kinit 密码。有关概述,请参阅 https://docs.oracle.com/en/java/javase/11/tools/kinit.html。
如果客户端用户提供密码,Windows 上的 MIT Kerberos 库将决定是使用该密码还是依赖于现有票证。
在 Kerberos 身份验证的客户端配置参数 中描述的
destroy_tickets
参数不受支持,因为 Windows 上的 MIT Kerberos 库不支持读取其值所需的 API 成员(get_profile_boolean
)。
Kerberos 身份验证的客户端配置参数
本节仅适用于运行 Linux 的客户端主机,不适用于运行 Windows 的客户端主机。
运行 Windows 的客户端主机,如果其 authentication_kerberos_client
客户端 Kerberos 插件设置为 GSSAPI
模式,则通常支持客户端配置参数,但 Windows 上的 MIT Kerberos 库不支持本节中描述的 destroy_tickets
参数。
如果在调用 MySQL 客户端应用程序时不存在有效的票证授予票证 (TGT),则应用程序本身可能会获取并缓存 TGT。如果在 Kerberos 身份验证过程中,客户端应用程序导致缓存 TGT,则可以通过设置适当的配置参数来销毁任何已添加的 TGT,在不再需要它们时销毁它们。(此设置仅适用于客户端插件创建的 TGT,不适用于其他插件或外部创建的 TGT。)
客户端 Kerberos 插件 authentication_kerberos_client
读取本地 /etc/krb5.conf
文件。如果此文件丢失或无法访问,则会发生错误。假设该文件可以访问,它可以包含一个可选的 [appdefaults]
部分,以提供插件使用的信息。将信息放置在该部分的 mysql
部分中。例如
[appdefaults]
mysql = {
destroy_tickets = true
}
客户端插件识别 mysql
部分中的以下参数。
destroy_tickets
值指示客户端插件在获取并使用 TGT 后是否销毁它。默认情况下,destroy_tickets
为false
,但可以设置为true
以避免重复使用 TGT。(此设置仅适用于客户端插件创建的 TGT,不适用于其他插件或外部创建的 TGT。)
在客户端主机上,可以使用客户端 keytab 文件在不提供密码的情况下获取 TGT 和 TS。有关 keytab 文件的信息,请参阅 https://web.mit.edu/kerberos/krb5-latest/doc/basic/keytab_def.html。
AUTHENTICATION_KERBEROS_CLIENT_LOG
环境变量启用或禁用 Kerberos 身份验证的调试输出。
尽管名称 AUTHENTICATION_KERBEROS_CLIENT_LOG
中包含 CLIENT
,但相同的环境变量适用于服务器端插件和客户端插件。
在服务器端,允许的值为 0(关闭)和 1(打开)。日志消息将写入服务器错误日志,并受服务器错误日志详细程度级别的约束。例如,如果您使用基于优先级的日志过滤,则 log_error_verbosity
系统变量控制详细程度,如 第 7.4.2.5 节,“基于优先级的错误日志过滤 (log_filter_internal)” 中所述。
在客户端,允许的值为 1 到 5,并写入标准错误输出。下表显示了每个日志级别值的含义。
日志级别 | 含义 |
---|---|
1 或未设置 | 不记录日志 |
2 | 错误消息 |
3 | 错误和警告消息 |
4 | 错误、警告和信息消息 |
5 | 错误、警告、信息和调试消息 |