#### 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 服务器和客户端。它在应用程序可以访问 Microsoft Active Directory（默认启用 Kerberos）的 Linux 环境中很有用。从 MySQL 8.0.27 开始，Windows 也支持客户端插件。（服务器端插件仍然仅在 Linux 上受支持。）

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

-   外部身份验证：Kerberos 身份验证使 MySQL 服务器能够接受来自 MySQL 授权表之外定义的用户的连接，这些用户已获得适当的 Kerberos 票证。

-   安全性：Kerberos 将票据与对称密钥加密结合使用，无需通过网络发送密码即可实现身份验证。Kerberos 身份验证支持无用户和无密码方案。

    下表显示了插件和库文件名。您的系统上的文件名后缀可能不同。该文件必须位于由[`插件目录`](server-system-variables.html#sysvar_plugin_dir)系统变量。有关安装信息，请参阅[安装 Kerberos 可插入身份验证](kerberos-pluggable-authentication.html#kerberos-pluggable-authentication-installation).

[](<>)

**表 6.23 用于 Kerberos 身份验证的插件和库名称**

| 插件或文件 | 插件或文件名 |
| ----- | ------ |
| 服务器端插件 | `身份验证_kerberos` |
| 客户端插件 | `authentication_kerberos_client` |
| 库文件 | `authentication_kerberos.so`,`authentication_kerberos_client.so` |

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

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

-   [Kerberos 可插入身份验证的先决条件](kerberos-pluggable-authentication.html#kerberos-pluggable-authentication-prerequisites)

-   [MySQL 用户的 Kerberos 身份验证如何工作](kerberos-pluggable-authentication.html#kerberos-pluggable-authentication-process)

-   [安装 Kerberos 可插入身份验证](kerberos-pluggable-authentication.html#kerberos-pluggable-authentication-installation)

-   [使用 Kerberos 可插入身份验证](kerberos-pluggable-authentication.html#kerberos-pluggable-authentication-usage)

-   [Kerberos 身份验证调试](kerberos-pluggable-authentication.html#kerberos-pluggable-authentication-debugging)

    有关 MySQL 中可插入身份验证的一般信息，请参阅[第 6.2.17 节，“可插拔身份验证”](pluggable-authentication.html).

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

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

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

-   要由 MySQL 进行身份验证的每个 Kerberos 用户（主体）必须存在于由 KDC 服务器管理的数据库中。

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

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

本节概述 MySQL 和 Kerberos 如何协同工作以验证 MySQL 用户。有关显示如何设置 MySQL 帐户以使用 Kerberos 身份验证插件的示例，请参阅[使用 Kerberos 可插入身份验证](kerberos-pluggable-authentication.html#kerberos-pluggable-authentication-usage).

此处假定您熟悉 Kerberos 概念和操作。以下列表简要定义了几个常见的 Kerberos 术语。您还可以找到词汇表部分[RFC 4120](https://tools.ietf.org/html/rfc4120)有帮助。

-   [主要的](glossary.html#glos_principal)：命名实体，例如用户或服务器。在此讨论中，某些与委托人相关的术语经常出现：

    -   [SPN](glossary.html#glos_service_principal_name)：服务主体名称；代表服务的主体的名称。

    -   [UPN](glossary.html#glos_user_principal_name)：用户主体名称；代表用户的主体名称。

-   [KDC](glossary.html#glos_key_distribution_center)：密钥分发中心，包括 AS 和 TGS：

    -   [作为](glossary.html#glos_authentication_server)：认证服务器；提供获得额外票证所需的初始票证授予票证。

    -   [TGS](glossary.html#glos_ticket_granting_server)：票证授予服务器；向拥有有效 TGT 的 Kerberos 客户端提供额外的票证。

-   [TGT](glossary.html#glos_ticket_granting_ticket)：授予门票的门票；提交给TGS，以获取服务访问的服务票。

-   [装货单](glossary.html#glos_service_ticket)：服务票；提供对MySQL服务器等服务的访问。

    使用Kerberos进行身份验证需要KDC服务器，例如，由Microsoft Active Directory提供。

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

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

    Kerberos身份验证遵循以下步骤，其中服务器端和客户端部分使用`身份验证`和`身份验证\u kerberos\u客户端`身份验证插件：

1.  MySQL服务器向客户端应用程序发送其服务主体名称。此SPN必须在Kerberos系统中注册，并在服务器端使用[`身份验证\u kerberos\u服务\u主体`](pluggable-authentication-system-variables.html#sysvar_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（例如，使用**基尼特**或类似）。因此，这种设计涵盖了从完全无用户和无密码的连接（其中Kerberos服务票证从本地存储的Kerberos缓存获取）到提供用户名和密码并用于从KDC获取有效Kerberos服务票证并发送到MySQL服务器的连接等各种使用情况。

    如前所述，MySQL Kerberos身份验证使用两种密钥表文件：

[](<>)

-   在客户端主机上，可以使用客户端密钥表文件来获取TGT和ST，而无需提供密码。看见[Kerberos身份验证的客户端配置参数](kerberos-pluggable-authentication.html#kerberos-pluggable-authentication-mysql-client-config-parameters).

-   在MySQL服务器主机上，服务器端服务密钥表文件用于验证MySQL服务器从客户端接收到的服务票证。使用[`身份验证\u kerberos\u服务\u密钥\u选项卡`](pluggable-authentication-system-variables.html#sysvar_authentication_kerberos_service_key_tab)系统变量。

    有关keytab文件的信息，请参见[https://web.mit.edu/kerberos/krb5-latest/doc/basic/keytab_def。html](https://web.mit.edu/kerberos/krb5-latest/doc/basic/keytab_def.html).

##### 安装Kerberos可插入身份验证

本节介绍如何安装服务器端Kerberos身份验证插件。有关安装插件的一般信息，请参阅[第5.6.1节，“安装和卸载插件”](plugin-loading.html).

为了便于服务器使用，插件库文件必须位于MySQL插件目录（由[`插件目录`](server-system-variables.html#sysvar_plugin_dir)系统变量）。如有必要，通过设置[`插件目录`](server-system-variables.html#sysvar_plugin_dir)在服务器启动时。

服务器端插件库文件的基本名称为`身份验证`.文件名后缀因平台而异（例如，`所以`对于Unix和类Unix系统，`.dll`适用于Windows）。

要在服务器启动时加载插件，请使用[`--插件加载添加`](server-options.html#option_mysqld_plugin-load-add)选项来命名包含它的库文件。使用这种插件加载方法，每次服务器启动时都必须给出该选项。另外，为任何插件提供的系统变量指定要配置的值。该插件公开这些系统变量，从而可以配置其操作：

-   [`身份验证\u kerberos\u服务\u主体`](pluggable-authentication-system-variables.html#sysvar_authentication_kerberos_service_principal)：MySQL服务主体名称（SPN）。此名称将发送给尝试使用Kerberos进行身份验证的客户端。SPN必须存在于KDC服务器管理的数据库中。

-   [`身份验证\u kerberos\u服务\u密钥\u选项卡`](pluggable-authentication-system-variables.html#sysvar_authentication_kerberos_service_key_tab)：用于验证从客户端接收的票据的密钥表文件。此文件必须存在并包含SPN的有效密钥，否则客户端身份验证将失败。

     [](<>)

    有关所有Kerberos身份验证系统变量的详细信息，请参阅[第6.4.1.13节，“可插拔认证系统变量”](pluggable-authentication-system-variables.html).

    要加载插件并对其进行配置，请在`我的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
```

修改后`我的cnf`，重新启动服务器以使新设置生效。

或者，要在运行时加载插件，请使用以下语句，调整`所以`根据需要为您的平台添加后缀：

```
INSTALL PLUGIN authentication_kerberos
  SONAME 'authentication_kerberos.so';
```

[`安装插件`](install-plugin.html)立即加载插件，并将其注册到`mysql。插件`系统表，使服务器在每次后续正常启动时加载它，而无需[`--插件加载添加`](server-options.html#option_mysqld_plugin-load-add).

在运行时安装插件后，它公开的系统变量将变为可用，您可以将这些变量的设置添加到应用程序中`我的cnf`配置插件以进行后续重启。例如：

```
[mysqld]
authentication_kerberos_service_principal=mysql/krbauth.example.com@MYSQL.LOCAL
authentication_kerberos_service_key_tab=/var/mysql/data/mysql.keytab
```

修改后`我的cnf`，重新启动服务器以使新设置生效。

要在运行时而不是启动时设置并保留每个值，请使用以下语句：

```
SET PERSIST authentication_kerberos_service_principal='mysql/krbauth.example.com@MYSQL.LOCAL';
SET PERSIST authentication_kerberos_service_key_tab='/var/mysql/data/mysql.keytab';
```

[`设定持续时间`](set-variable.html)为正在运行的MySQL实例设置一个值。它还会保存该值，从而将其带入后续服务器重启。要更改正在运行的MySQL实例的值，而不将其带入后续重新启动，请使用`全球的`关键字而不是`坚持`看见[第13.7.6.1节，“设置变量赋值语法”](set-variable.html).

要验证插件安装，请检查[`信息模式。插件`](information-schema-plugins-table.html)或使用[`显示插件`](show-plugins.html)声明（见[第5.6.2节，“获取服务器插件信息”](obtaining-plugin-information.html)).例如：

```
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-pluggable-authentication.html#kerberos-pluggable-authentication-usage).

##### 使用Kerberos可插入身份验证

本节介绍如何使用Kerberos可插入身份验证使MySQL帐户连接到MySQL服务器。假设服务器运行时启用了服务器端插件，如中所述[安装Kerberos可插入身份验证](kerberos-pluggable-authentication.html#kerberos-pluggable-authentication-installation)，并且客户端插件在客户端主机上可用。

-   [验证Kerberos可用性](kerberos-pluggable-authentication.html#kerberos-usage-kerberos-setup)

-   [创建一个使用Kerberos身份验证的MySQL帐户](kerberos-pluggable-authentication.html#kerberos-usage-mysql-account-setup)

-   [使用MySQL帐户连接到MySQL服务器](kerberos-pluggable-authentication.html#kerberos-usage-mysql-client-usage)

-   [Kerberos身份验证的客户端配置参数](kerberos-pluggable-authentication.html#kerberos-pluggable-authentication-mysql-client-config-parameters)

###### 验证Kerberos可用性

下面的示例演示如何在Active Directory中测试Kerberos的可用性。该示例做出以下假设：

-   Active Directory正在名为的主机上运行`克尔鲍思。实例通用域名格式`使用IP地址`198.51.100.11`.

-   与MySQL相关的Kerberos身份验证使用`MYSQL。地方的`域，并且还使用`MYSQL。地方的`作为域名。

-   一位名叫`karl@MYSQL.LOCAL`已在KDC注册。（在后面的讨论中，此主体名称与使用Kerberos对MySQL服务器进行身份验证的MySQL帐户相关联。）

    在满足这些假设的情况下，遵循以下步骤：

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

    [](<>)[](<>)

    ```
    [realms]
      MYSQL.LOCAL = {
        kdc = krbauth.example.com
        admin_server = krbauth.example.com
        default_domain = MYSQL.LOCAL
      }
    ```

2.  您可能需要在中添加一个条目`/etc/主持人`对于服务器主机：

    ```
    198.51.100.11 krbauth krbauth.example.com
    ```

3.  检查Kerberos身份验证是否正常工作：

    1.  使用**基尼特**要对Kerberos进行身份验证，请执行以下操作：

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

        该命令对名为的Kerberos主体进行身份验证`karl@MYSQL.LOCAL`。当命令提示输入委托人的密码时，请输入该密码。KDC返回一个TGT，该TGT缓存在客户端，供其他支持Kerberos的应用程序使用。

    2.  使用**克莱斯特**检查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帐户

使用`身份验证`身份验证插件基于Kerberos用户主体名称（UPN）。这里的说明假设一个名为`卡尔`使用Kerberos向MySQL验证Kerberos领域的名称`MYSQL。地方的`，并且用户主体名称为`karl@MYSQL.LOCAL`。此UPN必须在多个地方注册：

-   Kerberos管理员应将用户名注册为Kerberos主体。此名称包括一个域名。客户端使用主体名称和密码通过Kerberos进行身份验证，并获得票据授予票据（TGT）。

-   MySQL DBA应该创建一个与Kerberos主体名称相对应的帐户，并使用Kerberos插件进行身份验证。

    假设Kerberos用户主体名称已由相应的服务管理员注册，并且如中所述[安装Kerberos可插入身份验证](kerberos-pluggable-authentication.html#kerberos-pluggable-authentication-installation)，MySQL服务器已使用服务器端Kerberos插件的适当配置设置启动。创建一个MySQL帐户，该帐户对应于`*`使用者`*@*`域名`*`，MySQL DBA使用如下语句：


```
CREATE USER user
  IDENTIFIED WITH authentication_kerberos
  BY 'realm_name';
```

名为*`使用者`*可以包含或省略主机名部分。如果省略主机名，则默认为`%`和往常一样。这个*`域名`*存储为`身份验证\u字符串`中的帐户的值`mysql。使用者`系统表。

创建对应于UPN的MySQL帐户`karl@MYSQL.LOCAL`，使用以下语句：

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

例如，如果MySQL必须为此帐户构造UPN以获取或验证票证（TGT或STs），那么它可以通过将帐户名（忽略任何主机名部分）和域名结合起来来实现。例如，由前面的[`创建用户`](create-user.html)声明是`“卡尔”@“%”`.MySQL从用户名部分构造UPN`卡尔`（忽略主机名部分）和域名`MYSQL。地方的`生产`karl@MYSQL.LOCAL`.

笔记

请注意，当创建一个使用`身份验证`这个[`创建用户`](create-user.html)语句不将UPN域作为用户名的一部分。相反，请指定领域(`MYSQL。地方的`在本例中）作为`通过`条款这与创建使用`身份验证\u ldap\u sasl`使用GSSAPI/Kerberos身份验证方法的SASL LDAP身份验证插件。对于此类账户[`创建用户`](create-user.html)语句将UPN域作为用户名的一部分。看见[创建一个使用GSSAPI/Kerberos进行LDAP身份验证的MySQL帐户](ldap-pluggable-authentication.html#ldap-gssapi-mysql-account-setup).

设置好帐户后，客户端可以使用它连接到MySQL服务器。该过程取决于客户端主机是运行Linux还是Windows，如以下讨论所示。

使用`身份验证`受不支持具有相同用户部分但不同领域部分的UPN的限制。例如，您不能创建与以下两个UPN都对应的MySQL帐户：

```
kate@MYSQL.LOCAL
kate@EXAMPLE.COM
```

两个UPN都有一个用户部分`凯特`但在领域部分有所不同(`MYSQL。地方的`对`实例组件对象模型`).这是不允许的。

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

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

1.  使用用户主体名称（UPN）及其密码对Kerberos进行身份验证，以获得票据授予票据（TGT）。

2.  使用TGT获取MySQL的服务票证（ST）。

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

    第一步（对Kerberos进行身份验证）可以通过多种方式执行：

-   在连接到MySQL之前：

    -   在Linux上，调用**基尼特**获取TGT并将其保存在Kerberos凭据缓存中。

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

-   连接到MySQL时，客户端程序本身可以获得TGT，前提是它可以确定所需的Kerberos UPN和密码：

    -   这些信息可以来自命令选项或操作系统等来源。

    -   在Linux上，客户端还可以使用keytab文件或`/etc/krb5。形态`配置文件。Windows客户端两者都不使用。

    对于Linux和Windows，用于连接MySQL服务器的客户端命令的详细信息有所不同，因此将分别讨论每种主机类型，但无论主机类型如何，这些命令属性都适用：

-   显示的每个命令都包括以下选项，但在某些情况下，每个选项都可以省略：

    -   这个[`--默认身份验证`](connection-options.html#option_general_default-auth)选项指定客户端身份验证插件的名称(`身份验证\u kerberos\u客户端`)。当[`--使用者`](connection-options.html#option_general_user)选项是指定的，因为在这种情况下，MySQL可以根据MySQL服务器发送的用户帐户信息确定插件。

    -   这个[`--插件目录`](connection-options.html#option_general_plugin-dir)选项向客户端程序指示`身份验证\u kerberos\u客户端`插件。如果插件安装在默认（编译中）位置，则可以忽略此选项。

-   命令还应包括任何其他选项，例如[`--主人`](connection-options.html#option_general_host)或[`--港口`](connection-options.html#option_general_port)这是指定要连接到哪个MySQL服务器所必需的。

-   在一行中输入每个命令。如果命令包含[`--密码`](connection-options.html#option_general_password)选项要请求密码，请在提示时输入与MySQL用户关联的Kerberos UPN的密码。

**Linux客户端的连接命令**

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

-   在调用MySQL客户端程序之前，客户端用户可以独立于MySQL从KDC获得TGT。例如，客户端用户可以使用**基尼特**要通过提供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身份验证插件结合了用户名(`卡尔`)以及用户帐户中指定的领域(`MYSQL。地方的`)建设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是否存在，可以使用**克莱斯特**检查一下。

笔记

当客户端Kerberos身份验证插件本身获得TGT时，客户端用户可能不希望重用TGT。如中所述[Kerberos身份验证的客户端配置参数](kerberos-pluggable-authentication.html#kerberos-pluggable-authentication-mysql-client-config-parameters)当地的`/etc/krb5。形态`文件可以用来使客户端插件在使用TGT时销毁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身份验证插件结合了用户名(`卡尔`)以及用户帐户中指定的领域(`MYSQL.LOCAL`) 来构建 UPN (`卡尔@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.  开始`控制台程序`并选择网络和共享中心。

    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`文件。如果此文件丢失或无法访问，则会发生错误。假设文件是​​可访问的，它可以包含一个可选的`[应用默认值]`部分提供插件使用的信息。将信息放在`mysql`部分的一部分。例如：

[](<>)[](<>)[](<>)[](<>)

```
[appdefaults]
  mysql = {
    destroy_tickets = true
  }
```

客户端插件在`mysql`部分：

-   这`销毁门票`value 表示客户端插件获取并使用后是否销毁TGT。默认，`销毁门票`是`错误的`, 但可以设置为`真的`以避免 TGT 重用。（此设置仅适用于客户端插件创建的 TGT，不适用于其他插件或 MySQL 外部创建的 TGT。）

[](<>)

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

##### Kerberos 身份验证调试

[](<>)[](<>)

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

笔记

尽管`客户`在名字里`AUTHENTICATION_KERBEROS_CLIENT_LOG`，相同的环境变量适用于服务器端插件以及客户端插件。

在服务器端，允许的值为 0（关闭）和 1（打开）。日志消息被写入服务器错误日志，取决于服务器错误日志详细级别。例如，如果您使用基于优先级的日志过滤，则[`log_error_verbosity`](server-system-variables.html#sysvar_log_error_verbosity)系统变量控制详细程度，如中所述[第 5.4.2.5 节，“基于优先级的错误日志过滤（日志\_筛选\_内部的）”](error-log-priority-based-filtering.html).

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

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