文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
信息 (Gzip) - 4.0Mb
信息 (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  Kerberos 可插拔身份验证

8.4.1.7 Kerberos 可插拔身份验证

注意

Kerberos 可插拔身份验证是 MySQL 企业版(一个商业产品)中包含的扩展。要详细了解商业产品,请参阅 https://www.mysqlserver.cn/products/

MySQL 企业版支持一种身份验证方法,该方法允许用户使用 Kerberos 对 MySQL 服务器进行身份验证,前提是可以使用或可以获取适当的 Kerberos 票证。

此身份验证方法在 MySQL 9.0 中适用于 Linux 上的 MySQL 服务器和客户端。它在应用程序可以访问 Microsoft Active Directory 的 Linux 环境中非常有用,默认情况下,Microsoft Active Directory 已启用 Kerberos。客户端插件在 Windows 上也受支持。服务器端插件仍然仅在 Linux 上受支持。

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

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

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

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

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

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

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

以下部分提供了 Kerberos 可插拔身份验证特有的安装和使用信息:

有关 MySQL 中可插拔身份验证的一般信息,请参阅 第 8.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 的术语表部分找到帮助。

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

    • 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 上,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_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. MySQL 服务器使用 GSSAPI 创建 Kerberos 服务器端身份验证会话。服务器验证用户身份和用户请求的有效性。它使用在其服务密钥表文件中配置的服务密钥对 ST 进行身份验证,以确定身份验证是成功还是失败,并将身份验证结果返回给客户端。

应用程序可以使用提供的用户名和密码进行身份验证,也可以使用本地缓存的 TGT 或 ST 进行身份验证(例如,使用 kinit 或类似方法创建)。因此,此设计涵盖了从完全无需用户和密码的连接(其中 Kerberos 服务票证是从本地存储的 Kerberos 缓存中获取的)到提供用户名和密码并用于从 KDC 获取有效的 Kerberos 服务票证以发送到 MySQL 服务器的连接的各种用例。

如前面的描述中所示,MySQL Kerberos 身份验证使用两种密钥表文件。

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

安装 Kerberos 可插拔身份验证

本节介绍如何安装服务器端 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/host_name@realm_name

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

有关所有 Kerberos 身份验证系统变量的详细信息,请参阅 第 8.4.1.12 节“可插拔身份验证系统变量”

要加载插件并对其进行配置,请在 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 语法(用于变量赋值)”

要验证插件安装,请检查信息架构 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 可插拔身份验证 中所述),并且客户端主机上提供了客户端插件。

验证 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 帐户相关联。)

满足这些假设后,请遵循以下步骤

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

    [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 [email protected]
      Password for [email protected]: (enter password here)

      该命令将对名为 [email protected] 的 Kerberos 主体进行身份验证。当命令提示输入主体密码时,请输入密码。KDC 会返回一个 TGT,该 TGT 缓存在客户端以供其他支持 Kerberos 的应用程序使用。

    2. 使用 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 插件的相应配置设置启动。要创建一个与 user@realm_name 的 Kerberos UPN 相对应的 MySQL 帐户,MySQL DBA 使用如下语句

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 领域。而是将领域(在本例中为 MYSQL.LOCAL)指定为 BY 子句中的身份验证字符串。这与使用 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.LOCALEXAMPLE.COM)。这是不允许的。

使用 MySQL 帐户连接到 MySQL 服务器

设置好使用 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 模式的客户端两者都不使用。

连接到 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 [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 模式)的连接命令

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

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

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

在 Windows 上,客户端用户必须使用 plugin_authentication_kerberos_client_mode 插件选项明确指定 GSSAPI 模式,才能通过 MIT Kerberos 库启用支持。默认模式为 SSPI(请参阅 SSPI 模式下 Windows 客户端的命令)。

可以在选项文件中指定 GSSAPI 模式。

  • 在调用 MySQL 客户端程序之前。使用下划线或破折号都可以使插件变量名称有效。

    [mysql]
    plugin_authentication_kerberos_client_mode=GSSAPI

    或者

    [mysql]
    plugin-authentication-kerberos-client-mode=GSSAPI
  • 在运行时,使用 mysqlmysqldump 客户端程序从命令行指定。例如,以下命令(使用下划线或破折号)使 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 后将其销毁。

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

[appdefaults]
  mysql = {
    destroy_tickets = true
  }

客户端插件识别 mysql 部分中的以下参数:

  • destroy_tickets 值指示客户端插件在获取并使用 TGT 后是否销毁该 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 身份验证的调试输出。

注意

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

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

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

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