Documentation Home
MySQL 8.0 参考手册  / 第 6 章 安全  / 6.4 安全组件和插件  / 6.4.1 认证插件  /  6.4.1.8 Kerberos 可插入认证

6.4.1.8 Kerberos 可插入认证

笔记

Kerberos 可插入身份验证是 MySQL 企业版(一种商业产品)中包含的扩展。要了解有关商业产品的更多信息,请参阅https://www.mysql.com/products/

MySQL Enterprise Edition 支持一种身份验证方法,使用户能够使用 Kerberos 向 MySQL Server 进行身份验证,前提是提供或可以获得适当的 Kerberos 票证。

此身份验证方法在 MySQL 8.0.26 及更高版本中可用,适用于 Linux 上的 MySQL 服务器和客户端。它在应用程序可以访问默认启用 Kerberos 的 Microsoft Active Directory 的 Linux 环境中很有用。从 MySQL 8.0.27 开始,Windows 也支持客户端插件。(服务器端插件仍然仅在 Linux 上受支持。)

Kerberos 可插入身份验证提供以下功能:

  • 外部身份验证:Kerberos 身份验证使 MySQL 服务器能够接受来自 MySQL 授权表之外定义的用户的连接,这些用户已获得正确的 Kerberos 票证。

  • 安全性:Kerberos 将票证与对称密钥加密结合使用,无需通过网络发送密码即可进行身份验证。Kerberos 身份验证支持无用户和无密码方案。

下表显示了插件和库文件名。文件名后缀在您的系统上可能不同。该文件必须位于 plugin_dir系统变量命名的目录中。有关安装信息,请参阅 安装 Kerberos 可插入身份验证

表 6.24 Kerberos 身份验证的插件和库名称

插件或文件 插件或文件名
服务器端插件 authentication_kerberos
客户端插件 authentication_kerberos_client
库文件 authentication_kerberos.so, authentication_kerberos_client.so

服务器端 Kerberos 身份验证插件仅包含在 MySQL 企业版中。它不包含在 MySQL 社区发行版中。客户端插件包含在所有发行版中,包括社区发行版。这使来自任何发行版的客户端都可以连接到加载了服务器端插件的服务器。

以下部分提供特定于 Kerberos 可插入身份验证的安装和使用信息:

有关 MySQL 中可插入身份验证的一般信息,请参阅第 6.2.17 节,“可插入身份验证”

Kerberos 可插入身份验证的先决条件

要对 MySQL 使用 Kerberos 可插入身份验证,必须满足以下先决条件:

  • Kerberos 服务必须可供 Kerberos 身份验证插件与之通信。

  • 每个要由 MySQL 验证的 Kerberos 用户(主体)必须存在于由 KDC 服务器管理的数据库中。

  • Kerberos 客户端库必须在使用服务器端或客户端 Kerberos 身份验证插件的系统上可用。另外,GSSAPI作为访问Kerberos认证的接口,所以必须有一个GSSAPI库。

MySQL 用户的 Kerberos 身份验证如何工作

本节概述了 MySQL 和 Kerberos 如何协同工作来验证 MySQL 用户。有关显示如何设置 MySQL 帐户以使用 Kerberos 身份验证插件的示例,请参阅 使用 Kerberos 可插入身份验证

此处假设您熟悉 Kerberos 概念和操作。以下列表简要定义了几个常见的 Kerberos 术语。您可能还会发现RFC 4120的词汇表部分 很有帮助。

  • Principal:命名实体,例如用户或服务器。在此讨论中,某些与本金相关的术语经常出现:

    • SPN:服务主体名称;代表服务的委托人的名称。

    • UPN:用户主体名称;代表用户的委托人的名称。

  • KDC : 密钥分发中心,由 AS 和 TGS 组成:

    • AS:认证服务器;提供获取额外票证所需的初始票证授予票证。

    • TGS:票据授予服务器;为拥有有效 TGT 的 Kerberos 客户端提供额外的票证。

  • TGT:票证授予票证;提交给 TGS 以获得服务访问的服务票据。

  • ST : 服务票;提供对服务的访问,例如 MySQL 服务器提供的服务。

使用 Kerberos 的身份验证需要 KDC 服务器,例如 Microsoft Active Directory 提供的服务器。

MySQL 中的 Kerberos 身份验证使用通用安全服务应用程序接口 (GSSAPI),这是一个安全抽象接口。Kerberos 是可通过该抽象接口使用的特定安全协议的实例。使用 GSSAPI,应用程序向 Kerberos 进行身份验证以获取服务凭证,然后依次使用这些凭证来实现对其他服务的安全访问。在 Windows 上,安全支持提供程序接口 (SSPI) 实现 GSSAPI。

使用 Kerberos 身份验证插件,应用程序和 MySQL 服务器能够使用 Kerberos 身份验证协议来相互验证用户和 MySQL 服务。这样用户和服务器都能够验证彼此的身份。没有密码通过网络发送,并且 Kerberos 协议消息受到保护以防止窃听和重放攻击。

Kerberos 身份验证遵循以下步骤,其中服务器端和客户端部分分别使用 authentication_kerberosauthentication_kerberos_client 身份验证插件执行:

  1. MySQL 服务器向客户端应用程序发送其服务主体名称。此 SPN 必须在 Kerberos 系统中注册,并使用 authentication_kerberos_service_principal 系统变量在服务器端进行配置。

  2. 使用 GSSAPI,客户端应用程序创建 Kerberos 客户端身份验证会话并与 Kerberos KDC 交换 Kerberos 消息:

    • 客户端从认证服务器获取一张票据授权票据。

    • 使用 TGT,客户端从票证授予服务获取 MySQL 的服务票证。

    如果 TGT、ST 或两者已在本地缓存,则可以跳过或部分跳过此步骤。客户端可以选择使用客户端密钥表文件来获取 TGT 和 ST,而无需提供密码。

  3. 使用 GSSAPI,客户端应用程序将 MySQL ST 呈现给 MySQL 服务器。

  4. 使用 GSSAPI,MySQL 服务器创建 Kerberos 服务器端身份验证会话。服务器验证用户身份和用户请求的有效性。它使用服务keytab文件中配置的服务密钥对ST进行认证,判断认证成功与否,并将认证结果返回给客户端。

应用程序能够使用提供的用户名和密码,或使用本地缓存的 TGT 或 ST(例如,使用kinit或类似工具创建)进行身份验证。因此,该设计涵盖了从完全无用户和无密码连接(从本地存储的 Kerberos 缓存获取 Kerberos 服务票证)到同时提供用户名和密码并用于从 KDC 获取有效 Kerberos 服务票证的连接的用例,发送到 MySQL 服务器。

如前所述,MySQL Kerberos认证使用两种keytab文件:

有关密钥表文件的信息,请参阅 https://web.mit.edu/kerberos/krb5-latest/doc/basic/keytab_def.html

安装 Kerberos 可插入身份验证

本节介绍如何安装服务器端 Kerberos 身份验证插件。有关安装插件的一般信息,请参阅第 5.6.1 节,“安装和卸载插件”

笔记

服务器端插件仅在 Linux 系统上受支持。在 Windows 系统上,仅支持客户端插件(自 MySQL 8.0.27 起),可用于在 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/host_name@realm_name

  • authentication_kerberos_service_key_tab:用于验证从客户端收到的票据的密钥表文件。此文件必须存在并包含 SPN 的有效密钥,否则客户端身份验证将失败。默认mysql.keytab在数据目录中。

有关所有 Kerberos 身份验证系统变量的详细信息,请参阅 第 6.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

如果 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. 请参阅 第 13.7.6.1 节,“变量赋值的 SET 语法”

要验证插件安装,请检查 INFORMATION_SCHEMA.PLUGINS表格或使用SHOW PLUGINS 语句(请参阅 第 5.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 可插入身份验证

本节介绍如何使用 Kerberos 可插入身份验证使 MySQL 帐户能够连接到 MySQL 服务器。假定服务器在启用服务器端插件的情况下运行,如 安装 Kerberos 可插入身份验证中所述,并且客户端插件在客户端主机上可用。

验证 Kerberos 可用性

以下示例显示如何测试 Active Directory 中 Kerberos 的可用性。该示例做出以下假设:

  • Active Directory 在以 krbauth.example.comIP 地址 命名的主机上运行198.51.100.11

  • MySQL相关的Kerberos认证使用 MYSQL.LOCAL域,也使用 MYSQL.LOCALrealm name。

  • 指定的主体karl@MYSQL.LOCAL已在 KDC 中注册。(在后面的讨论中,这个主体名称与使用 Kerberos 向 MySQL 服务器进行身份验证的 MySQL 帐户相关联。)

满足这些假设后,请遵循以下过程:

  1. 验证 Kerberos 库是否已在操作系统中正确安装和配置。例如,要配置MYSQL.LOCAL在 MySQL 身份验证期间使用的域和领域, /etc/krb5.confKerberos 配置文件应包含如下内容:

    [realms]
      MYSQL.LOCAL = {
        kdc = krbauth.example.com
        admin_server = krbauth.example.com
        default_domain = MYSQL.LOCAL
      }
  2. 您可能需要 /etc/hosts为服务器主机添加一个条目:

    198.51.100.11 krbauth krbauth.example.com
  3. 检查 Kerberos 身份验证是否正常工作:

    1. 使用kinit对 Kerberos 进行身份验证:

      $> kinit karl@MYSQL.LOCAL
      Password for karl@MYSQL.LOCAL: (enter password here)

      该命令对名为 的 Kerberos 主体进行身份验证karl@MYSQL.LOCAL。在命令提示时输入主体的密码。KDC 返回缓存在客户端的 TGT,供其他 Kerberos 感知应用程序使用。

    2. 使用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
创建一个使用 Kerberos 身份验证的 MySQL 帐户

使用身份验证插件的 MySQL 身份 authentication_kerberos验证基于 Kerberos 用户主体名称 (UPN)。此处的说明假定名为的 MySQL 用户 karl使用 Kerberos 向 MySQL 进行身份验证,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';

命名的帐户user可以包含或省略主机名部分。如果省略主机名,则默认%为照常。realm_name存储为 系统表 authentication_string中帐户的值。 mysql.user

要创建与 UPN 对应的 MySQL 帐户 karl@MYSQL.LOCAL,请使用以下语句:

CREATE USER 'karl'
  IDENTIFIED WITH authentication_kerberos
  BY 'MYSQL.LOCAL';

如果 MySQL 必须为此帐户构造 UPN,例如,为了获取或验证票证(TGT 或 ST),它通过组合帐户名(忽略任何主机名部分)和域名来实现。例如,前面CREATE USER 语句产生的完整帐户名是'karl'@'%'。MySQL 从用户名部分karl (忽略主机名部分)和域名 构建 UPNMYSQL.LOCAL以生成 karl@MYSQL.LOCAL.

笔记

请注意,在创建使用 进行身份验证的帐户时authentication_kerberos,该 CREATE USER语句不会将 UPN 领域作为用户名的一部分。相反,将领域(MYSQL.LOCAL在本例中) 指定为BY子句中的身份验证字符串。这不同于创建使用 authentication_ldap_saslSASL LDAP 身份验证插件和 GSSAPI/Kerberos 身份验证方法的帐户。对于此类帐户,该 CREATE USER声明确实将 UPN 领域作为用户名的一部分。请参阅 创建使用 GSSAPI/Kerberos 进行 LDAP 身份验证的 MySQL 帐户

设置好账户后,客户端就可以用它来连接MySQL服务器了。该过程取决于客户端主机运行的是 Linux 还是 Windows,如以下讨论所示。

的使用authentication_kerberos受到不支持具有相同用户部分但不同领域部分的 UPN 的限制。例如,您不能创建对应于这两个 UPN 的 MySQL 帐户:

kate@MYSQL.LOCAL
kate@EXAMPLE.COM

两个 UPN 都有一个用户部分,kate但领域部分不同(MYSQL.LOCALEXAMPLE.COM)。这是不允许的。

使用MySQL账号连接MySQL服务器

设置使用 Kerberos 进行身份验证的 MySQL 帐户后,客户端可以使用它连接到 MySQL 服务器,如下所示:

  1. 使用用户主体名称 (UPN) 及其密码向 Kerberos 进行身份验证以获得票证授予票证 (TGT)。

  2. 使用 TGT 获取 MySQL 的服务票证 (ST)。

  3. 通过出示 MySQL ST 向 MySQL 服务器进行身份验证。

可以通过多种方式执行第一步(向 Kerberos 进行身份验证):

  • 在连接到 MySQL 之前:

    • 在 Linux 上,调用kinit以获取 TGT 并将其保存在 Kerberos 凭证缓存中。

    • 在 Windows 上,身份验证可能已经在登录时完成,这会将登录用户的 TGT 保存在 Windows 内存缓存中。 未使用kinit并且没有 Kerberos 缓存。

  • 连接MySQL时,客户端程序本身可以获取TGT,如果它可以确定所需的Kerberos UPN和密码:

    • 该信息可以来自命令选项或操作系统等来源。

    • 在 Linux 上,客户端还可以使用密钥表文件或 /etc/krb5.conf配置文件。Windows 客户端都不使用。

用于连接到 MySQL 服务器的客户端命令的详细信息因 Linux 和 Windows 而异,因此将分别讨论每种主机类型,但这些命令属性适用于任何主机类型:

  • 显示的每个命令都包括以下选项,但在某些情况下每个选项都可以省略:

    • --default-auth 选项指定客户端身份验证插件的名称 ( authentication_kerberos_client)。当指定该选项时,可以省略该 --user选项,因为在这种情况下,MySQL 可以从 MySQL 服务器发送的用户帐户信息中确定插件。

    • --plugin-dir 选项向客户端程序指示authentication_kerberos_client 插件的位置。如果插件安装在默认(编译)位置,​​则可以省略此选项。

  • 命令还应包括任何其他选项,例如 指定要连接到哪个 MySQL 服务器所需的 --host或 。--port

  • 在一行中输入每个命令。如果该命令包含--password 请求密码的选项,请在出现提示时输入与 MySQL 用户关联的 Kerberos UPN 的密码。

Linux 客户端的连接命令

在 Linux 上,用于连接到 MySQL 服务器的适当客户端命令会有所不同,具体取决于该命令是使用来自 Kerberos 缓存的 TGT 进行身份验证,还是基于 MySQL 用户名和 UPN 密码的命令选项:

  • 在调用MySQL客户端程序之前,客户端用户可以独立于MySQL从KDC获取一个TGT。例如,客户端用户可以使用 kinit通过提供 Kerberos 用户主体名称和主体密码来向 Kerberos 进行身份验证:

    $> kinit karl@MYSQL.LOCAL
    Password for karl@MYSQL.LOCAL: (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 ( 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被重用。如 Kerberos 身份验证的客户端配置参数中所述,本地/etc/krb5.conf文件可用于使客户端插件在完成后销毁 TGT。

Windows 客户端的连接命令

在 Windows 上,用于连接到 MySQL 服务器的适当客户端命令会有所不同,具体取决于该命令是基于 MySQL 用户名和 UPN 密码的命令选项进行身份验证,还是使用 Windows 内存缓存中的 TGT。

命令可以显式指定 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 地址:

    1. 启动console.exe并选择 网络和共享中心

    2. 从网络和共享中心窗口的边栏中,选择更改适配器设置

    3. 在“网络连接”窗口中,右键单击要配置的网络或 VPN 连接,然后选择“ 属性” 。

    4. 在“网络”选项卡中,找到并单击“Internet 协议版本 4 (TCP/IPv4) ”,然后单击 “属性” 。

    5. 单击Internet 协议版本 4 (TCP/IPv4) 属性对话框中的高级。“高级 TCP/IP 设置”对话框打开。

    6. DNS选项卡中,将 Active Directory 服务器和领域添加为 DNS 服务器和前缀。

  • 此命令包含一个用于 MySQL 用户名但不用于 UPN 密码的选项:

    mysql
      --default-auth=authentication_kerberos_client
      --plugin-dir=path/to/plugin/directory
      --user=karl

    客户端 Kerberos 身份验证插件将用户名选项指定的名称与登录用户名进行比较。如果名称相同,插件将使用登录用户 TGT 进行身份验证。如果名称不同,则身份验证失败。

Kerberos 身份验证的客户端配置参数
笔记

本节仅适用于运行 Linux 的客户端主机,不适用于运行 Windows 的客户端主机。

如果在 MySQL 客户端应用程序调用时不存在有效的票证授予票证 (TGT),则应用程序本身可能会获取并缓存 TGT。如果在 Kerberos 身份验证过程中,客户端应用程序导致缓存 TGT,则可以通过设置适当的配置参数在不再需要后销毁任何已添加的此类 TGT。

authentication_kerberos_client 客户端 Kerberos 插件读取本地 /etc/krb5.conf文件 。如果此文件丢失或无法访问,则会发生错误。假设文件是​​可访问的,它可以包含一个可选 [appdefaults]部分来提供插件使用的信息。将信息放在该mysql部分的一部分内。例如:

[appdefaults]
  mysql = {
    destroy_tickets = true
  }

客户端插件识别 mysql部分中的这些参数:

  • destroy_tickets值表示客户端插件获取并使用TGT后是否销毁。默认情况下, destroy_ticketsfalse,但可以设置为 true以避免 TGT 重用。(此设置仅适用于客户端插件创建的 TGT,不适用于其他插件或外部 MySQL 创建的 TGT。)

在客户端主机上,客户端密钥表文件可用于在不提供密码的情况下获取 TGT 和 TS。有关密钥表文件的信息,请参阅 https://web.mit.edu/kerberos/krb5-latest/doc/basic/keytab_def.html

Kerberos 身份验证调试

环境变量启用或禁用 Kerberos 身份验证的AUTHENTICATION_KERBEROS_CLIENT_LOG 调试输出。

笔记

尽管CLIENT在名称 AUTHENTICATION_KERBEROS_CLIENT_LOG中,相同的环境变量适用于服务器端插件和客户端插件。

在服务器端,允许的值为 0(关闭)和 1(打开)。日志消息被写入服务器错误日志,受服务器错误日志详细级别的约束。例如,如果您使用基于优先级的日志过滤,则 log_error_verbosity系统变量控制详细程度,如 第 5.4.2.5 节,“基于优先级的错误日志过滤(log_filter_internal)”中所述。

在客户端,允许的值是从 1 到 5,并被写入标准错误输出。下表显示了每个日志级别值的含义。

日志级别 意义
1 或未设置 没有记录
2个 错误信息
3个 错误和警告信息
4个 错误、警告和信息消息
5个 错误、警告、信息和调试消息