Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  Kerberos Pluggable Authentication

8.4.1.8 Kerberos 可插拔身份验证

Note

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 身份验证插件与之通信。

  • 每个 Kerberos 用户(principal)都必须在 KDC 服务器管理的数据库中存在。

  • Kerberos 客户端库必须在使用服务器端或客户端 Kerberos 身份验证插件的系统上可用。此外,GSSAPI 用于访问 Kerberos 身份验证,因此 GSSAPI 库也必须可用。

MySQL 用户的 Kerberos 身份验证过程

本节概述了 MySQL 和 Kerberos 如何共同工作以认证 MySQL 用户。有关设置 MySQL 帐户以使用 Kerberos 认证插件的示例,请参阅 使用 Kerberos 可插拔认证

在这里,假设您熟悉 Kerberos 概念和操作。以下列表简要定义了几个常见的 Kerberos 术语。你也可以在 RFC 4120 的词汇表部分找到有助的信息。

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

    • SPN:服务主体名称;表示服务的主体名称。

    • UPN:用户主体名称;表示用户的主体名称。

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

    • AS:认证服务器;提供初始票据授予票据,以获取其他票据。

    • TGS:票据授予服务器;为 Kerberos 客户端提供其他票据,前提是客户端拥有有效的 TGT。

  • TGT:票据授予票据;呈交给 TGS,以获取服务票据以访问服务。

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

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

MySQL 中的 Kerberos 认证使用通用安全服务应用程序接口(GSSAPI),这是一个安全抽象接口。Kerberos 是该抽象接口的一个特定安全协议实例。使用 GSSAPI,应用程序认证到 Kerberos,以获取服务凭证,然后使用这些凭证来启用对其他服务的安全访问。

在 Windows 上,authentication_kerberos_client 认证插件支持两种模式,客户端用户可以在运行时或在选项文件中指定:

使用 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 服务器端身份验证会话。服务器验证用户身份和用户请求的有效性。它使用服务密钥文件中的服务密钥来验证 ST,以确定身份验证是否成功,并将身份验证结果返回给客户端。

应用程序可以使用提供的用户名和密码进行身份验证,也可以使用本地缓存的 TGT 或 ST(例如,使用 kinit 或类似命令创建)。因此,该设计涵盖了从完全无用户和无密码连接(其中 Kerberos 服务票据从本地存储的 Kerberos 缓存中获取)到提供用户名和密码以获取有效的 Kerberos 服务票据的连接。

如前述所示,MySQL Kerberos 身份验证使用两种类型的密钥文件:

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

Kerberos 可插拔身份验证安装

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

Note

服务器端插件仅支持 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 可插拔身份验证

使用 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 帐户关联。)

假设这些假设满足,按照以下步骤进行:

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

    [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,该 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
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 账户 user@realm_name,MySQL DBA 使用类似以下语句:

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

Note

注意,当创建使用 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服务器:

  1. 使用用户主体名称(UPN)和密码对Kerberos进行身份验证,以获取票据授予票据(TGT)。

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

  3. 通过呈现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插件的位置。如果插件安装在默认(编译时)位置,可以省略这个选项。

  • 命令还应该包括其他选项,如--host--port,以指定要连接的MySQL服务器。

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

Linux客户端连接命令

在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 来检查。

Note

当客户端 Kerberos 身份验证插件自己获取 TGT 时,客户用户可能不想重用 TGT。如 Client Configuration Parameters for Kerberos Authentication 所述,local /etc/krb5.conf 文件可以用于使客户端插件在完成后销毁 TGT。

Windows 客户端在 SSPI 模式下的连接命令

在 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 地址:

    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 进行身份验证。如果名称不同,身份验证将失败。

Windows 客户端在 GSSAPI 模式下的连接命令

在 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
  • 在运行时从命令行使用 mysqlmysqldump 客户端程序。例如,以下命令(使用下划线或破折号)使 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 客户端主机。

Note

运行 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_ticketsfalse,但可以设置为 true 以避免 TGT 的重用。(该设置仅适用于客户端插件创建的 TGT,不适用于其他插件或外部 MySQL 创建的 TGT。)

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

Kerberos身份验证调试

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

Note

尽管名称中有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 错误、警告、信息和调试消息