Kerberos 可插拔身份验证是 MySQL Enterprise Edition 中的一个扩展,一个商业产品。要了解更多关于商业产品的信息,请参阅 https://www.mysql.com/products/。
MySQL Enterprise Edition 支持一种身份验证方法,允许用户使用 Kerberos 对 MySQL Server 进行身份验证,前提是适当的 Kerberos 票据可用或可以获取。
这种身份验证方法在 MySQL 8.3 中的 Linux 服务器和客户端上可用,也适用于 Windows 客户端。服务器端插件仍然只支持 Linux。
Kerberos 可插拔身份验证提供以下功能:
-
外部身份验证:Kerberos 身份验证使 MySQL Server 能够接受来自外部定义的用户的连接,这些用户已经获取了适当的 Kerberos 票据。
-
安全性:Kerberos 使用票据和对称密钥加密,实现身份验证而不需要在网络上传输密码。Kerberos 身份验证支持无用户和无密码场景。
以下表格显示插件和库文件名。文件名后缀可能在您的系统上不同。文件必须位于由 plugin_dir
系统变量命名的目录中。有关安装信息,请参阅 安装 Kerberos 可插拔身份验证。
表 8.25 Kerberos 身份验证插件和库文件名
Plugin or File | Plugin or File Name |
---|---|
服务器端插件 | authentication_kerberos |
客户端插件 | authentication_kerberos_client |
库文件 | authentication_kerberos.so , authentication_kerberos_client.so |
服务器端 Kerberos 身份验证插件仅包含在 MySQL Enterprise Edition 中,不包含在 MySQL 社区发行版中。客户端插件包含在所有发行版中,包括社区发行版。这使得来自任何发行版的客户端都可以连接到加载了服务器端插件的服务器。
以下部分提供了 Kerberos 可插拔身份验证的安装和使用信息:
有关 MySQL 中的可插拔身份验证的常规信息,请参阅 第 8.2.17 节,“可插拔身份验证”。
要使用 Kerberos 可插拔身份验证,必须满足以下先决条件:
-
Kerberos 服务必须可用,以便 Kerberos 身份验证插件与之通信。
-
每个 Kerberos 用户(principal)都必须在 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(见 Windows 客户端的命令(SSPI 模式))。SSPI 虽然在wire 级别上与 GSSAPI 兼容,但仅支持 Windows 单点登录场景,具体地指的是已登录的用户。SSPI 是大多数 Windows 客户端的默认模式。 -
GSSAPI
模式:通过 Windows 上的 MIT Kerberos 库支持 GSSAPI(见 Windows 客户端的命令(GSSAPI 模式))。
使用 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 缓存中获取)到提供用户名和密码以获取有效的 Kerberos 服务票据的连接。
如前述所示,MySQL Kerberos 身份验证使用两种类型的密钥文件:
-
在客户端主机上,客户端密钥文件可能用于获取 TGT 和 ST,而不需要提供密码。请参阅 Client Configuration Parameters for Kerberos Authentication。
-
在 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
系统变量指定的目录)。如果必要,请在服务器启动时配置插件目录的位置。
服务器端插件库文件的基本名称是 authentication_kerberos
。Unix 和 Unix 类似系统上的文件名后缀是 .so
。
要在服务器启动时加载插件,请使用 --plugin-load-add
选项来指定包含插件的库文件名。使用此插件加载方法,每次服务器启动时都需要指定该选项。此外,还需要指定要配置的插件提供的系统变量的值。
-
authentication_kerberos_service_principal
: MySQL 服务主体名称(SPN)。该名称将被发送给尝试使用 Kerberos 进行身份验证的客户端。SPN 必须存在于 KDC 服务器管理的数据库中。默认值是mysql/
。host_name
@realm_name
-
authentication_kerberos_service_key_tab
: 来自客户端的服务票据的密钥文件。该文件必须存在并包含 SPN 或客户端身份验证的有效密钥,否则客户端身份验证将失败。默认值是mysql.keytab
在数据目录中。
有关所有 Kerberos 身份验证系统变量的详细信息,请参阅 第 8.4.1.14 节,“可插拔身份验证系统变量”。
要加载插件并配置它,请在 my.cnf
文件中添加以下行,使用适合您安装的系统变量值:
[mysqld]
plugin-load-add=authentication_kerberos.so
authentication_kerberos_service_principal=mysql/krbauth.example.com@MYSQL.LOCAL
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
如果 keytab 文件不在正确的位置或不包含有效的 SPN 密钥,MySQL 服务器不会验证它,但客户端将返回身份验证错误,直到您解决问题。
系统变量 authentication_kerberos_service_principal
可以在运行时设置和持久化,不需要重新启动服务器,使用 SET PERSIST
语句:
SET PERSIST authentication_kerberos_service_principal='mysql/krbauth.example.com@MYSQL.LOCAL';
SET PERSIST
设置当前 MySQL 实例的值。它还保存该值,使其在后续服务器重新启动时保持不变。要更改当前 MySQL 实例的值,而不使其在后续重新启动时保持不变,请使用 GLOBAL
关键字,而不是 PERSIST
。请参阅 第 15.7.6.1 节,“SET 语句 for 变量赋值”。
要验证插件安装,请检查 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 可插拔身份验证 中所述,并且客户端插件可用在客户端主机上。
Verify Kerberos Availability
以下示例显示了如何在 Active Directory 中测试 Kerberos 的可用性。该示例假设:
-
Active Directory 在主机
krbauth.example.com
上运行,IP 地址为198.51.100.11
。 -
MySQL 相关的 Kerberos 身份验证使用
MYSQL.LOCAL
域,并使用MYSQL.LOCAL
作为领域名称。 -
一个名为
karl@MYSQL.LOCAL
的 principal 已经注册到 KDC。(在后续讨论中,该 principal 名称将与使用 Kerberos 身份验证的 MySQL 帐户关联。)
假设这些假设满足,按照以下步骤进行:
-
验证 Kerberos 库是否正确安装和配置在操作系统中。例如,要配置用于 MySQL 身份验证的
MYSQL.LOCAL
域和领域,Kerberos 配置文件/etc/krb5.conf
应该包含类似以下内容:[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 karl@MYSQL.LOCAL Password for karl@MYSQL.LOCAL: (enter password here)
该命令对 Kerberos 主体名为
karl@MYSQL.LOCAL
的用户进行身份验证。当命令提示输入密码时,请输入主体的密码。KDC 将返回一个 TGT,该 TGT 将被缓存在客户端上,以便其他 Kerberos 感知应用程序使用。 -
使用 klist 检查 TGT 是否正确获取。输出应该类似于以下内容:
$> klist Ticket cache: FILE:/tmp/krb5cc_244306 Default principal: karl@MYSQL.LOCAL Valid starting Expires Service principal 03/23/2021 08:18:33 03/23/2021 18:18:33 krbtgt/MYSQL.LOCAL@MYSQL.LOCAL
-
Create a MySQL Account That Uses Kerberos Authentication
使用 authentication_kerberos
身份验证插件的 MySQL 身份验证基于 Kerberos 用户主体名(UPN)。以下说明假设 MySQL 用户名为 karl
,使用 Kerberos 身份验证,Kerberos 领域名为 MYSQL.LOCAL
,用户主体名为 karl@MYSQL.LOCAL
。该 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';
该账户名可以包括或省略主机名部分。如果省略主机名,默认为 %
。该 realm_name
将被存储为账户的 authentication_string
值在 mysql.user
系统表中。
要创建一个对应于 UPN karl@MYSQL.LOCAL
的 MySQL 账户,使用以下语句:
CREATE USER 'karl'
IDENTIFIED WITH authentication_kerberos
BY 'MYSQL.LOCAL';
如果 MySQL 需要构建该账户的 UPN,例如,获取或验证票据(TGT 或 ST),它将通过组合账户名(忽略主机名部分)和领域名来实现。例如,来自前一个 CREATE USER
语句的完整账户名是 'karl'@'%'
。MySQL 将从用户名部分 karl
(忽略主机名部分)和领域名 MYSQL.LOCAL
构建 UPN karl@MYSQL.LOCAL
。
注意,当创建使用 authentication_kerberos
身份验证的账户时,CREATE USER
语句不包括 UPN 领域作为用户名的一部分。相反,指定领域(在本例中为 MYSQL.LOCAL
)作为身份验证字符串在 BY
子句中。这与创建使用 authentication_ldap_sasl
SASL LDAP 身份验证插件的 GSSAPI/Kerberos 身份验证方法的账户不同。对于这些账户,CREATE USER
语句包括 UPN 领域作为用户名的一部分。请参阅 创建使用 GSSAPI/Kerberos 的 LDAP 身份验证的 MySQL 账户。
设置账户后,客户端可以使用它连接到 MySQL 服务器。该过程取决于客户端主机是否运行 Linux 或 Windows,如下所述。
使用 authentication_kerberos
受到限制,即 UPN 的用户部分相同但领域部分不同的 UPN 不支持。例如,您不能创建对应于以下 UPN 的 MySQL 账户:
kate@MYSQL.LOCAL
kate@EXAMPLE.COM
这两个 UPN 都有用户部分 kate
,但领域部分不同(MYSQL.LOCAL
versus EXAMPLE.COM
)。这不被允许。
Use the MySQL Account to Connect to the MySQL Server
在设置了使用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时,客户端程序本身可以获取TGT,如果它可以确定所需的Kerberos UPN和密码:
-
该信息可以来自命令选项或操作系统等来源。
-
在Linux上,客户端也可以使用密钥表文件或
/etc/krb5.conf
配置文件。Windows客户端在GSSAPI模式下使用配置文件。Windows客户端在SSPI模式下不使用。
-
客户端命令的详细信息因主机类型而异,因此每种主机类型将单独讨论,但这些命令属性适用于所有主机类型:
-
每个命令都包括以下选项,但每个选项都可以在某些条件下省略:
-
--default-auth
选项指定客户端身份验证插件的名称(authentication_kerberos_client
)。如果指定了--user
选项,这个选项可以省略,因为在那种情况下MySQL可以从MySQL服务器发送的用户账户信息中确定插件。 -
--plugin-dir
选项指示客户端程序authentication_kerberos_client
插件的位置。如果插件安装在默认(编译时)位置,可以省略这个选项。
-
-
每个命令都应该在一行中输入。如果命令包括
--password
选项以提示密码,请在提示时输入与MySQL用户关联的Kerberos UPN的密码。
在Linux上,适当的客户端命令因是否使用Kerberos缓存中的TGT或基于命令选项的MySQL用户名和UPN密码而异:
-
在调用MySQL客户端程序之前,客户端用户可以独立于MySQL从KDC获取TGT。例如,客户端用户可以使用kinit命令通过提供Kerberos用户主体名称和主体密码来身份验证Kerberos:
$> kinit karl@MYSQL.LOCAL Password for karl@MYSQL.LOCAL: (enter password here)
结果TGT用于UPN被缓存并变得可供其他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 (karl@MYSQL.LOCAL
)。客户端插件使用 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。如 Client Configuration Parameters for Kerberos Authentication 所述,local /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 (karl@MYSQL.LOCAL
)。客户端插件使用 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 上,客户端用户必须使用 GSSAPI
模式明确指定使用 plugin_authentication_kerberos_client_mode
插件选项,以便通过 MIT Kerberos 库启用支持。默认模式是 SSPI
(见 Windows 客户端命令 SSPI 模式)。
可以指定 GSSAPI
模式:
-
在调用 MySQL 客户端程序之前,在选项文件中。插件变量名称使用下划线或破折号都是有效的:
[mysql] plugin_authentication_kerberos_client_mode=GSSAPI
或:
[mysql] plugin-authentication-kerberos-client-mode=GSSAPI
-
在运行时从命令行使用 mysql 或 mysqldump 客户端程序。例如,以下命令(使用下划线或破折号)使 mysql 通过 MIT Kerberos 库在 Windows 上连接到服务器。
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.mysql.com/doc/ 的文档。
-
适当的客户端命令取决于是否使用 TGT 从 MIT Kerberos 缓存中进行身份验证,或者基于命令选项的 MySQL 用户名和 UPN 密码。通过 MIT 库在 Windows 上的 GSSAPI 支持类似于 Linux 上的 GSSAPI(见 Linux 客户端命令),但有以下例外:
-
票据总是从或放入 MIT Kerberos 缓存中在 Windows 上的主机上。
-
kinit 在 Windows 上的功能账户上运行,具有狭窄的权限和特定角色。客户端用户不知道 kinit 密码。有关概述,请参阅 https://docs.oracle.com/en/java/javase/11/tools/kinit.html。
-
如果客户端用户提供密码,MIT Kerberos 库在 Windows 上将决定是否使用它或依赖现有的票据。
-
参数
destroy_tickets
,在 Kerberos 身份验证客户端配置参数 中描述,不支持,因为 MIT Kerberos 库在 Windows 上不支持从配置文件中读取其值所需的 API 成员(get_profile_boolean
)。
Client Configuration Parameters for Kerberos Authentication
本节仅适用于 Linux 客户端主机,不适用于 Windows 客户端主机。
运行 Windows 的客户端主机使用 authentication_kerberos_client
客户端 Kerberos 插件设置为 GSSAPI
模式支持客户端配置参数,但 MIT Kerberos 库在 Windows 上不支持 destroy_tickets
参数。
如果在 MySQL 客户端应用程序调用时没有有效的票据授予票据(TGT),则应用程序本身可能会获取和缓存 TGT。如果在 Kerberos 身份验证过程中客户端应用程序导致 TGT 被缓存,可以通过设置适当的配置参数来销毁不再需要的 TGT。
客户端插件 authentication_kerberos_client
读取本地 /etc/krb5.conf
文件。如果该文件缺失或不可访问,将发生错误。假设该文件可访问,可以包括一个可选的 [appdefaults]
部分,以提供插件使用的信息。将信息放在 mysql
部分中。例如:
[appdefaults]
mysql = {
destroy_tickets = true
}
客户端插件识别 mysql
部分中的这些参数:
-
值
destroy_tickets
指示客户端插件是否销毁 TGT 后使用它。默认情况下,destroy_tickets
为false
,但可以设置为true
以避免 TGT 的重用。(该设置仅适用于客户端插件创建的 TGT,不适用于其他插件或外部 MySQL 创建的 TGT。)
在客户端主机上,可以使用客户端密钥表文件来获取TGT和TS,而不需要提供密码。有关密钥表文件的信息,请参阅https://web.mit.edu/kerberos/krb5-latest/doc/basic/keytab_def.html。
环境变量AUTHENTICATION_KERBEROS_CLIENT_LOG
启用或禁用Kerberos身份验证的调试输出。
尽管名称中有CLIENT
,环境变量AUTHENTICATION_KERBEROS_CLIENT_LOG
同样适用于服务器端插件和客户端插件。
在服务器端,允许的值为0(关闭)和1(开启)。日志消息将写入服务器错误日志,subject to服务器错误日志记录级别。例如,如果您使用基于优先级的日志过滤,可以使用log_error_verbosity
系统变量控制详细程度,如第7.4.2.5节,“基于优先级的错误日志过滤(log_filter_internal)”所述。
在客户端,允许的值从1到5,将写入标准错误输出。以下表格显示了每个日志级别的含义。
Log Level | Meaning |
---|---|
1 或未设置 | 无日志 |
2 | 错误消息 |
3 | 错误和警告消息 |
4 | 错误、警告和信息消息 |
5 | 错误、警告、信息和调试消息 |