8.4.1.8 Kerberos 插件式认证
Kerberos插件式认证是MySQL Enterprise Edition的一种扩展,一个商业产品。要了解更多关于商业产品,请见https://www.mysql.com/products/。
MySQL Enterprise Edition支持使用Kerberos进行身份验证的方法,该方法使用户可以使用适当的Kerberos票据连接到MySQL Server。
该身份验证方法在MySQL 8.4中可用于Linux上的MySQL服务器和客户端,也可用于Windows客户端,但仅支持Linux服务器端插件。
Kerberos插件式认证提供以下功能:
-
外部身份验证:Kerberos身份验证使MySQL Server能够接受来自定义在MySQL授权表外的用户的连接,这些用户已经获得了适当的Kerberos票据。
-
安全性:Kerberos使用票据和对称密钥加密,实现身份验证不需要将密码发送到网络上。Kerberos身份验证支持无用户和无密码场景。
以下表格显示了插件和库文件名。文件名后缀可能在您的系统中不同。该文件必须位于由plugin_
系统变量指定的目录中。安装信息请见Installing Kerberos Pluggable Authentication。
8.24 Kerberos认证插件和库名称
Plugin or File | Plugin or File Name |
---|---|
服务器端插件 | authentication_kerberos |
客户端插件 | authentication_kerberos_client |
库文件 | authentication_kerberos.so , authentication_kerberos_client.so |
服务器端Kerberos认证插件仅在MySQL Enterprise Edition中包含,不包括社区发行版。客户端插件在所有发行版中都包含,包括社区发行版。这使得来自任何分布的客户端可以连接到已加载服务器端插件的服务器。
以下部分提供了特定于Kerberos可插拔认证的安装和使用信息:
关于 MySQL 插件式认证的总体信息,请参阅第8.2.17节,“插件式认证”。
Kerberos 插件式认证的前提条件
使用 MySQL 的 Kerberos 插件式认证,需要满足以下前提条件:
-
Kerberos 服务必须可用,以便 Kerberos 认证插件与其通信。
-
将要由 MySQL 认证的每个 Kerberos 用户(principal)都必须在 KDC 服务器管理的数据库中存在。
-
Kerberos 客户端库必须在系统上可用,其中包括服务器端或客户端 Kerberos 认证插件。另外,GSSAPI 作为访问 Kerberos 认证的接口,因此 GSSAPI 库也必须可用。
本节提供了 MySQL 和 Kerberos 之间的认证机制概述。关于如何设置 MySQL 账户以使用 Kerberos 认证插件,请参阅使用 Kerberos 插件式认证。
在这里假设您已经熟悉 Kerberos 概念和操作。以下是几个常见 Kerberos 术语的简要定义。你可能还会找到RFC 4120 的词汇表有帮助。
使用Kerberos身份验证需要密钥分配中心服务器,例如由Microsoft Active Directory提供的服务器。
MySQL 使用 Generic Security Service Application Program Interface(GSSAPI)进行 Kerberos 认证,GSSAPI 是一种安全抽象接口。Kerberos 是一种特定的安全协议实例,可以通过该抽象接口使用。使用 GSSAPI,应用程序可以将用户身份验证到 Kerberos,以获取服务凭证,然后使用这些凭证来启用对其他服务的安全访问。
在 Windows 上,authentication_kerberos_client
认证插件支持两个模式,客户端用户可以在运行时或在选项文件中设置:
-
SSPI
模式:Security Support Provider Interface(SSPI)实现 GSSAPI(见Windows 客户端在 SSPI 模式下的命令)。SSPI 虽然与 GSSAPI 在wire级别兼容,但仅支持 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)。
-
使用TGT,客户端从票证授予服务获得MySQL服务票据(ST)。
如果TGT、ST或两者已经本地缓存,可以跳过或部分跳过这个步骤。客户端可选地使用客户端密钥表文件来获取TGT和ST,而不需要提供密码。
-
-
使用GSSAPI,客户端应用程序将MySQL ST发送给MySQL服务器。
-
使用GSSAPI,MySQL服务器创建Kerberos服务器端身份验证会话。服务器验证用户标识和用户请求的有效性,并使用在其服务密钥表文件中配置的服务密钥来确定身份验证是否成功或失败,然后将身份验证结果返回给客户端。
应用程序可以使用提供的用户名和密码或本地缓存的TGT或ST(例如,使用kinit或类似工具创建)进行身份验证。这一设计因此涵盖了从完全无用户和密码连接到连接中同时提供用户名和密码并从KDC获取有效的Kerberos服务票据以发送给MySQL服务器的所有用例。
如前面的描述所示,MySQL Kerberos身份验证使用两种类型的密钥表文件:
-
在客户端主机上,可以使用客户端密钥表文件来获取TGT和ST而不需要提供密码。请参阅Kerberos身份验证客户端配置参数。
-
在MySQL服务器主机上,使用服务密钥表文件来验证来自客户端的服务票据。密钥表文件名称通过
authentication_kerberos_service_key_tab
系统变量进行配置。
关于密钥表文件的信息,请参阅https://web.mit.edu/kerberos/krb5-latest/doc/basic/keytab_def.html。
安装 Kerberos 插件式认证
本节描述了如何安装服务器端Kerberos身份验证插件。关于安装插件的总体信息,请见第7.6.1节,“Installing and Uninstalling Plugins”。
服务器端插件仅支持Linux系统。在Windows系统上,只支持客户端插件,可以在使用Kerberos身份验证的Linux服务器连接到Windows系统上。
要使插件可供服务器使用,插件库文件必须位于MySQL插件目录(由plugin_
系统变量指定的目录)中。如果必要,可以在服务器启动时配置插件目录位置,设置plugin_
的值。
服务器端插件库文件的基本名称是authentication_kerberos
。Unix和Unix-like系统上的文件名后缀为.so
。
要在服务器启动时加载插件,请使用--plugin-load-Add
选项指定包含插件的库文件。使用此插件加载方法,每次启动服务器都需要给出该选项。此外,还需要指定任何插件提供的系统变量的值,以便配置插件的操作:
-
authentication_kerberos_service_principal
: MySQL 服务主体名称(SPN)。该名称将被发送给使用 Kerberos 进行身份验证的客户端。SPN 必须在 KDC 服务器管理的数据库中存在。默认值为mysql/<em class="replaceable"><host_name>@<em class="replaceable"><realm_name>
。 -
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/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
如果密钥表文件不在正确的位置或不包含有效的 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 语法变量分配”。
要验证插件安装,请检查信息架构中的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 插件式认证。
使用 Kerberos 插件式认证
本节描述了如何使 MySQL 账户使用 Kerberos 可插拔身份验证连接到 MySQL 服务器。假设服务器已经启用了 server-端插件,详见安装 Kerberos 可插拔身份验证,并且客户端主机上已经安装了客户端插件。
Verify Kerberos Availability
以下示例展示了如何测试 Active Directory 中 Kerberos 的可用性。该示例假设:
-
Active Directory 在名为
krbauth.example.com
的主机上运行,IP 地址为198.51.100.11
。 -
MySQL 相关的 Kerberos 身份验证使用域名
MYSQL.LOCAL
,并且使用MYSQL.LOCAL
作为realm名称。 -
在KDC中注册了名为
karl@MYSQL.LOCAL
的主体。 (在后续讨论中,这个主体名称将与使用Kerberos身份验证到MySQL服务器的MySQL账户相关联。)
假设条件满足,遵循以下步骤:
-
验证操作系统中的Kerberos库是否安装和配置正确。例如,在为MySQL身份验证使用
MYSQL.LOCAL
域和realm时,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)
该命令对名为
karl@MYSQL.LOCAL
的Kerberos主体进行身份验证。在命令提示时输入主体的密码。KDC返回一个TGT,该TGT将在客户端缓存中用于其他Kerberos-aware应用程序使用。 -
使用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身份验证到MySQL服务器,Kerberosrealm名为MYSQL.LOCAL
,用户主体名称为karl@MYSQL.LOCAL
。这个UPN必须在多个地方注册:
-
Kerberos管理员应该将用户名注册为Kerberos主体。这个名称包括realm名称。客户端使用主体名称和密码与Kerberos进行身份验证,并获得票证授予票证(TGT)。
-
MySQL DBA 应该创建一个对应于Kerberos主体名称的账户,并使用Kerberos插件进行身份验证。
假设Kerberos用户主体名称已经由适当的服务管理员注册,并且,正如在安装Kerberos可插拔身份验证中之前描述的那样,MySQL服务器已经以适当的配置设置启动了server-side 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 karl@MYSQL.LOCAL
的MySQL账户,使用以下语句:
CREATE USER 'karl'
IDENTIFIED WITH authentication_kerberos
BY 'MYSQL.LOCAL';
如果MySQL需要为该帐户构建UPN,以便获取或验证票证(TGTs或STs),它将通过组合帐户名称(忽略任何主机名称部分)和realm名称来实现。例如,前面的CREATE USER
语句生成的完整帐户名称为'karl'@'%'
。MySQL从用户名称部分karl
(忽略主机名称部分)和realm名称MYSQL.LOCAL
中构建UPN,生成karl@MYSQL.LOCAL
。
注意,在使用authentication_kerberos
进行身份验证时,CREATE USER
语句不包括UPN realm作为用户名称的一部分,而是将realm(MYSQL.LOCAL
在本例中)指定为BY子句中的身份验证字符串。这与使用authentication_ldap_sasl
SASL LDAP身份验证插件和GSSAPI/Kerberos身份验证方法创建帐户不同。对于这些帐户,CREATE USER
语句包括UPN realm作为用户名称的一部分。请参阅使用GSSAPI/Kerberos为LDAP身份验证创建MySQL帐户。
设置帐户后,客户端可以使用它连接到MySQL服务器。该过程取决于客户端主机是否运行Linux或Windows,如下讨论所示。
使用authentication_kerberos
受限于不能支持具有相同用户部分但不同的realm部分的UPNs。例如,您无法创建MySQL账户对应这两个UPNs:
kate@MYSQL.LOCAL
kate@EXAMPLE.COM
这两个UPNs都有一个用户部分为kate
,但在realm部分中不同(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
模式,invokekinit以获取TGT并将其保存在Kerberos凭证缓存中。 -
在Windows中使用
SSPI
模式,身份验证可能已经在登录时完成,这样将TGT保存在Windows内存缓存中。kinit不被使用,没有Kerberos缓存。
-
-
连接到MySQL时,客户端程序本身可以获取TGT,如果它可以确定所需的Kerberos UPN和密码:
-
这些信息可以来自命令选项或操作系统。
-
在 Linux 上,客户端也可以使用密钥表文件或
/etc/krb5.conf
配置文件。Windows 客户端在GSSAPI
模式下使用配置文件,而在SSPI
模式下不使用。
-
连接到 MySQL 服务器的客户端命令的详细信息因 Linux 和 Windows 而异,因此每个主机类型将单独讨论,但这些命令属性无论主机类型都适用:
-
每个显示的命令都包括以下选项,但每个选项可能在某些情况下被省略:
-
--default-auth
选项指定客户端身份验证插件的名称(authentication_kerberos_client
)。在这种情况下,如果使用--user
选项,因为 MySQL 可以从 MySQL 服务器接收的用户帐户信息中确定插件。 -
--plugin-dir
选项指示客户端程序authentication_kerberos_client
插件的位置。如果插件安装在默认(编译时)位置,可以省略该选项。
-
-
每个命令都在单行中输入。如果该命令包括
--password
选项以请求密码,请在提示时输入与MySQL用户关联的Kerberos UPN的密码。
在 Linux 上,连接到 MySQL 服务器的适当客户端命令取决于命令是否使用 Kerberos 缓存中的 TGT 进行身份验证,还是基于 MySQL 用户名和 UPN 密码的命令选项:
-
在调用 MySQL 客户端程序之前,客户端用户可以独立于 MySQL 获取 TGT,从 KDC authenticating 例如,客户端用户可以使用kinit提供 Kerberos 用户主体名称和主体密码来身份验证:
$> kinit karl@MYSQL.LOCAL Password for karl@MYSQL.LOCAL: (enter password here)
结果的 TGT 对 UPN 是缓存的,并且可供其他 Kerberos-aware 应用程序使用,例如使用客户端侧 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
)和用户账户中指定的realm(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账户中的realm来构建UPN。最后,客户端插件使用UPN和密码获取TGT,使用TGT获取MySQL ST,并使用ST对MySQL服务器进行身份验证。
如果您不确定是否存在TGT,可以使用klist命令来检查。
当客户端Kerberos身份验证插件自己获取TGT时,客户用户可能不想重用TGT。如Kerberos身份验证客户端配置参数中所述,local /etc/krb5.conf
文件可以用来使客户端插件在使用完TGT后销毁它。
在 Windows 上,使用默认的客户端插件选项(SSPI),连接到 MySQL 服务器的适当客户端命令取决于命令是否基于 MySQL 用户名和 UPN 密码的命令选项,还是使用来自 Windows 内存缓存的 TGT。关于 Windows 中 GSSAPI 模式的详细信息,请见GSSAPI 模式下的 Windows 客户端命令。
命令可以明确指定 MySQL 用户名和 UPN 密码的选项,或者省略这些选项:
-
这个命令包括了 MySQL 用户名和 UPN 密码的选项:
mysql --default-auth=authentication_kerberos_client --plugin-dir=path/to/plugin/directory --user=karl --password
客户端 Kerberos 身份验证插件将用户名 (
karl
) 和用户账户中指定的realm (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) 域的一部分。如果不是,请帮助 MySQL 客户端发现 AD 域的 IP 地址,手动输入 AD 服务器和域名作为 DNS 服务器和前缀:
-
启动
console.exe
并选择 Network and Sharing Center。 -
从 Network and Sharing Center 窗口的侧边栏中,选择 Change adapter settings。
-
在 Network Connections 窗口中,右键单击网络或 VPN 连接以配置并选择
。 -
从 Network tab 中,找到并点击 Internet Protocol Version 4 (TCP/IPv4),然后点击 。
-
点击
在 Internet Protocol Version 4 (TCP/IPv4) 属性对话框中。Advanced TCP/IP 设置对话框打开。 -
从 DNS tab 中,添加 Active Directory 服务器和域名作为 DNS 服务器和前缀。
-
-
该命令包括了MySQL用户名的选项,但没有UPN密码的选项:
mysql --default-auth=authentication_kerberos_client --plugin-dir=path/to/plugin/directory --user=karl
客户端Kerberos身份验证插件将指定的用户名与已登录的用户名进行比较。如果用户名相同,插件将使用已登录用户的TGT进行身份验证。如果用户名不同,身份验证失败。
在Windows上,客户端用户必须使用GSSAPI
模式明确指定,以启用通过MIT Kerberos库的支持。默认模式是SSPI
(见SSPI模式下的Windows客户端命令).
可以指定GSSAPI
模式:
-
在选项文件中调用MySQL客户端程序之前。插件变量名使用underscores或dashes都有效:
[mysql] plugin_authentication_kerberos_client_mode=GSSAPI
或者:
[mysql] plugin-authentication-kerberos-client-mode=GSSAPI
-
在运行时从命令行使用mysql或mysqldump客户端程序。例如,以下命令(使用underscores或dashes)将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
来override默认的 Kerberos 配置文件路径。-
使用环境变量
KRB5CCNAME
来设置默认的 credential cache 名称(例如,KRB5CCNAME=DIR:/mydir/
). -
关于特定的客户端插件信息,请参阅https://dev.mysql.com/doc/.
连接到 MySQL 服务器的适当客户端命令取决于命令是否使用 MIT Kerberos 缓存中的 TGT 进行身份验证,或者基于 MySQL 用户名和 UPN 密码的命令选项。Windows 上的 MIT 库 GSSAPI 支持与 Linux 类似(见Linux 客户端命令),以下是例外:
-
在运行 Windows 的主机上,票据总是从或放入 MIT Kerberos 缓存中。
-
kinit 在 Windows 上的功能账户下运行,具有狭窄权限和特定角色。客户端用户不知道kinit密码。关于概述,请参阅https://docs.oracle.com/en/java/javase/11/tools/kinit.html.
-
如果客户端用户提供了密码,Windows 上的 MIT Kerberos 库将决定是否使用它或依靠现有的票据。
-
If the client user supplies a password, the MIT Kerberos library on Windows decides whether to use it or rely on the existing ticket.
-
由于 Windows 上的 MIT Kerberos 库不支持读取配置文件的值(
get_profile_boolean
),因此参数destroy_tickets
不被支持,详见Kerberos 认证客户端配置参数。
Client Configuration Parameters for Kerberos Authentication
本节仅适用于运行 Linux 的客户机,不适用于运行 Windows 的客户机。
在 Windows 客户机上,使用 authentication_kerberos_client
客户端 Kerberos 插件时,可以支持客户端配置参数,但 MIT Kerberos 库不支持本节中描述的 destroy_tickets
参数。
如果在 MySQL 客户端应用程序启动时没有有效的票证授予票(TGT),应用程序可能会自己获取和缓存 TGT。如果在 Kerberos 认证过程中客户端应用程序导致 TGT 被缓存,那么可以通过设置相应的配置参数来销毁该 TGT。
客户端 Kerberos 插件读取本地 /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
,同名环境变量也适用于服务器端插件。
在服务器端,允许的值是0(off)和1(on)。日志消息将写入到服务器错误日志中,subject to the server error-logging verbosity level。例如,如果您使用优先级日志过滤,您可以使用log_error_verbosity
系统变量控制 verbosity,详见第7.4.2.5节,“Priority-Based Error Log Filtering (log_filter_internal)”。
在客户端-side,允许的值范围从1到5,并将其写入标准错误输出。以下表格显示了每个日志级别值的含义。
Log Level | Meaning |
---|---|
1 或未设置 | 无记录 |
错误信息 | |
错误和警告信息 | |
错误、警告和信息消息 | |
错误、警告、信息和调试消息 |