

# 对 Aurora MySQL 使用 Kerberos 身份验证
<a name="aurora-mysql-kerberos"></a>

当用户连接到 Aurora MySQL 数据库集群时，您可以使用 Kerberos 身份验证来验证用户的身份。为此，请将数据库集群配置为使用 AWS Directory Service for Microsoft Active Directory 进行 Kerberos 身份验证。AWS Directory Service for Microsoft Active Directory 也称为 AWS Managed Microsoft AD。这是 Directory Service 提供的一项功能。要了解更多信息，请参阅《AWS Directory Service 管理指南》**中的[什么是 Directory Service？](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/what_is.html)

要开始操作，请创建一个 AWS Managed Microsoft AD 目录来存储用户凭证。然后，将 Active Directory 的域和其他信息提供给 Aurora MySQL 数据库集群。当用户向 Aurora MySQL 数据库集群验证身份时，身份验证请求将转发到 AWS Managed Microsoft AD 目录。

将所有凭证保存在同一目录中可以节省您的时间和精力。使用这种方法，您具有一个集中位置用于存储和管理多个数据库集群的凭证。使用目录还可以改善您的整体安全概要。

此外，还可以从自己的本地 Microsoft Active Directory 访问凭证。为此，请创建一个信任域关系，以便 AWS Managed Microsoft AD 目录信任您的本地 Microsoft Active Directory。通过这种方式，用户可以使用 Windows 单点登录（SSO）访问 Aurora MySQL 数据库集群，获得与访问本地网络中的工作负载相同的体验。

数据库可以使用 Kerberos、AWS Identity and Access Management (IAM)，或同时使用 Kerberos 和 IAM 身份验证。但是，由于 Kerberos 和 IAM 身份验证提供了不同的身份验证方法，因此，特定用户只能使用一种或另一种身份验证方法登录数据库，但不能同时使用这两种方法。有关 IAM 身份验证的更多信息，请参阅 [IAM 数据库身份验证](UsingWithRDS.IAMDBAuth.md)。

**Contents**
+ [Aurora MySQL 数据库集群的 Kerberos 身份验证概述](#aurora-mysql-kerberos-setting-up-overview)
+ [Aurora MySQL 的 Kerberos 身份验证限制](#aurora-mysql-kerberos.limitations)
+ [为 Aurora MySQL 数据库集群设置 Kerberos 身份验证](aurora-mysql-kerberos-setting-up.md)
  + [步骤 1：使用 AWS Managed Microsoft AD 创建目录](aurora-mysql-kerberos-setting-up.md#aurora-mysql-kerberos-setting-up.create-directory)
  + [步骤 2：（可选）为本地 Active Directory 创建信任](aurora-mysql-kerberos-setting-up.md#aurora-mysql-kerberos-setting-up.create-trust)
  + [步骤 3：创建 IAM 角色以供 Amazon Aurora 使用](aurora-mysql-kerberos-setting-up.md#aurora-mysql-kerberos-setting-up.CreateIAMRole)
  + [步骤 4：创建和配置用户](aurora-mysql-kerberos-setting-up.md#aurora-mysql-kerberos-setting-up.create-users)
  + [步骤 5：创建或修改 Aurora MySQL 数据库集群](aurora-mysql-kerberos-setting-up.md#aurora-mysql-kerberos-setting-up.create-modify)
  + [步骤 6：创建使用 Kerberos 身份验证的 Aurora MySQL 用户](aurora-mysql-kerberos-setting-up.md#aurora-mysql-kerberos-setting-up.create-logins)
    + [修改现有的 Aurora MySQL 登录名](aurora-mysql-kerberos-setting-up.md#aurora-mysql-kerberos.modify-login)
  + [步骤 7：配置 MySQL 客户端](aurora-mysql-kerberos-setting-up.md#aurora-mysql-kerberos-setting-up.configure-client)
  + [步骤 8：（可选）配置不区分大小写的用户名比较](aurora-mysql-kerberos-setting-up.md#aurora-mysql-kerberos-setting-up.case-insensitive)
+ [使用 Kerberos 身份验证连接到 Aurora MySQL](aurora-mysql-kerberos-connecting.md)
  + [使用 Aurora MySQL Kerberos 登录名连接到数据库集群](aurora-mysql-kerberos-connecting.md#aurora-mysql-kerberos-connecting.login)
  + [Aurora 全局数据库的 Kerberos 身份验证](aurora-mysql-kerberos-connecting.md#aurora-mysql-kerberos-connecting.global)
  + [从 RDS for MySQL 迁移到 Aurora MySQL](aurora-mysql-kerberos-connecting.md#aurora-mysql-kerberos-connecting.rds)
  + [阻止票证缓存](aurora-mysql-kerberos-connecting.md#aurora-mysql-kerberos.destroy-tickets)
  + [针对 Kerberos 身份验证的日志记录](aurora-mysql-kerberos-connecting.md#aurora-mysql-kerberos.logging)
+ [在域中管理数据库集群](aurora-mysql-kerberos-managing.md)
  + [了解域成员资格](aurora-mysql-kerberos-managing.md#aurora-mysql-kerberos-managing.understanding)

## Aurora MySQL 数据库集群的 Kerberos 身份验证概述
<a name="aurora-mysql-kerberos-setting-up-overview"></a>

要为 Aurora MySQL 数据库集群设置 Kerberos 身份验证，请完成以下一般步骤。这些步骤将在后面进行更详细的描述。

1. 使用 AWS Managed Microsoft AD 创建 AWS Managed Microsoft AD 目录。您可以使用 AWS 管理控制台、AWS CLI 或 Directory Service 创建目录。有关详细说明，请参阅《AWS Directory Service 管理指南》**中的[创建 AWS Managed Microsoft AD 目录](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_getting_started_create_directory.html)。

1. 创建使用托管式 IAM 策略 `AmazonRDSDirectoryServiceAccess` 的 AWS Identity and Access Management（IAM）角色。此角色允许 Amazon Aurora 调用您的目录。

   为了让角色允许访问，AWS Security Token Service（AWS STS）端点必须在您的 AWS 账户的 AWS 区域中激活。AWS STS 端点原定设置为在所有 AWS 区域中保持活跃状态，且您无需任何进一步动作即可使用这些端点。有关更多信息，请参阅《IAM 用户指南》中的[在 AWS 区域中激活和停用 AWS STS](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html#sts-regions-activate-deactivate)。

1. 使用 Microsoft Active Directory 工具在 AWS Managed Microsoft AD 目录中创建和配置用户。有关在 Active Directory 中创建用户的更多信息，请参阅 *AWS 管理指南*中的[在 AWS Directory Service 托管式 Microsoft AD 中管理用户和组](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_manage_users_groups.html)。

1. 创建或修改 Aurora MySQL 数据库集群。如果您在创建请求中使用 CLI 或 RDS API，请使用 `Domain` 参数指定域标识符。使用在创建目录时生成的 `d-*` 标识符和您创建的 IAM 角色的名称。

   如果您将现有 Aurora MySQL 数据库集群修改为使用 Kerberos 身份验证，请为数据库集群设置域和 IAM 角色参数。在与域目录相同的 VPC 中查找数据库集群。

1. 使用 Amazon RDS 主用户凭证连接到 Aurora MySQL 数据库集群。按照[步骤 6：创建使用 Kerberos 身份验证的 Aurora MySQL 用户](aurora-mysql-kerberos-setting-up.md#aurora-mysql-kerberos-setting-up.create-logins)中的说明在 Aurora MySQL 中创建数据库用户。

   您以此方式创建的用户可以使用 Kerberos 身份验证登录到 Aurora MySQL 数据库集群。有关更多信息，请参阅 [使用 Kerberos 身份验证连接到 Aurora MySQL](aurora-mysql-kerberos-connecting.md)。

要将 Kerberos 身份验证与本地或自托管式 Microsoft Active Directory 结合使用，请创建*林信任*。林信任是两组域之间的信任关系。信任可以是单向或双向的。有关使用 Directory Service 设置林信任的更多信息，请参阅 *AWS Directory Service 管理指南* 中的[何时创建信任关系](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_setup_trust.html)。

## Aurora MySQL 的 Kerberos 身份验证限制
<a name="aurora-mysql-kerberos.limitations"></a>

以下限制适用于 Aurora MySQL 的 Kerberos 身份验证：
+ Aurora MySQL 版本 3.03 及更高版本支持 Kerberos 身份验证。

  有关 AWS 区域支持的信息，请参阅[适用于 Aurora MySQL 的 Kerberos 身份验证](Concepts.Aurora_Fea_Regions_DB-eng.Feature.KerberosAuthentication.md#Concepts.Aurora_Fea_Regions_DB-eng.Feature.KerberosAuthentication.amy)。
+ 要将 Kerberos 身份验证与 Aurora MySQL 结合使用，MySQL 客户端或连接器必须在 Unix 平台上使用版本 8.0.26 或更高版本，在 Windows 上使用版本 8.0.27 或更高版本。否则，客户端 `authentication_kerberos_client` 插件不可用，您无法进行身份验证。
+ 在 Aurora MySQL 上仅支持 AWS Managed Microsoft AD。但是，您可以将 Aurora MySQL 数据库集群加入到同一 AWS 区域中不同账户拥有的共享 Managed Microsoft AD 域。

  您还可以使用自己的本地 Active Directory。有关更多信息，请参阅 [步骤 2：（可选）为本地 Active Directory 创建信任](aurora-mysql-kerberos-setting-up.md#aurora-mysql-kerberos-setting-up.create-trust)。
+ 当使用 Kerberos 对从 MySQL 客户端或从 Windows 操作系统上的驱动程序连接到 Aurora MySQL 集群的用户进行身份验证时，原定设置情况下，数据库用户名的字符大小写必须与 Active Directory 中用户的大小写相匹配。例如，如果 Active Directory 中的用户显示为 `Admin`，则数据库用户名必须为 `Admin`。

  但是，您现在可以通过 `authentication_kerberos` 插件使用不区分大小写的用户名比较。有关更多信息，请参阅 [步骤 8：（可选）配置不区分大小写的用户名比较](aurora-mysql-kerberos-setting-up.md#aurora-mysql-kerberos-setting-up.case-insensitive)。
+ 开启该功能后，必须重启读取器数据库实例才能安装 `authentication_kerberos` 插件。
+ 复制到不支持 `authentication_kerberos` 插件的数据库实例可能会导致复制失败。
+ 要让 Aurora 全局数据库使用 Kerberos 身份验证，您必须为全局数据库中的每个数据库集群配置该身份验证。
+ 域名长度必须小于 62 个字符。
+ 开启 Kerberos 身份验证后，请勿修改数据库集群端口。如果您修改此端口，则 Kerberos 身份验证将不再起作用。

# 为 Aurora MySQL 数据库集群设置 Kerberos 身份验证
<a name="aurora-mysql-kerberos-setting-up"></a>

使用 AWS Managed Microsoft AD 为 Aurora MySQL 数据库集群设置 Kerberos 身份验证。要设置 Kerberos 身份验证，请执行以下步骤。

**Topics**
+ [步骤 1：使用 AWS Managed Microsoft AD 创建目录](#aurora-mysql-kerberos-setting-up.create-directory)
+ [步骤 2：（可选）为本地 Active Directory 创建信任](#aurora-mysql-kerberos-setting-up.create-trust)
+ [步骤 3：创建 IAM 角色以供 Amazon Aurora 使用](#aurora-mysql-kerberos-setting-up.CreateIAMRole)
+ [步骤 4：创建和配置用户](#aurora-mysql-kerberos-setting-up.create-users)
+ [步骤 5：创建或修改 Aurora MySQL 数据库集群](#aurora-mysql-kerberos-setting-up.create-modify)
+ [步骤 6：创建使用 Kerberos 身份验证的 Aurora MySQL 用户](#aurora-mysql-kerberos-setting-up.create-logins)
+ [步骤 7：配置 MySQL 客户端](#aurora-mysql-kerberos-setting-up.configure-client)
+ [步骤 8：（可选）配置不区分大小写的用户名比较](#aurora-mysql-kerberos-setting-up.case-insensitive)

## 步骤 1：使用 AWS Managed Microsoft AD 创建目录
<a name="aurora-mysql-kerberos-setting-up.create-directory"></a>

Directory Service 将在 AWS 云中创建一个完全托管的 Active Directory。创建 AWS Managed Microsoft AD 目录时，Directory Service 将代表您创建两个域控制器和域名系统 (DNS) 服务器。目录服务器在 VPC 中的不同子网中创建。这种冗余有助于确保始终可以访问目录，即使发生了故障。

创建 AWS Managed Microsoft AD 目录时，Directory Service 代表您执行以下任务：
+ 在 VPC 中设置 Active Directory。
+ 创建具有用户名 `Admin` 和指定密码的目录管理员账户。您可以使用此账户管理您的目录。
**注意**  
请务必保存此密码。Directory Service 不会存储它。您可以重置它，但无法检索它。
+ 为目录控制器创建安全组。

在启动 AWS Managed Microsoft AD 时，AWS 创建一个组织单位 (OU)，其中包含目录的所有对象。此 OU 具有您在创建目录时输入的 NetBIOS 名称。此 OU 位于域根目录中，由 AWS 拥有和管理。

使用 AWS Managed Microsoft AD 目录创建的 `Admin` 账户有权为您的 OU 执行最常见的管理活动，包括：
+ 创建、更新或删除用户
+ 将资源添加到域（如文件或打印服务器），然后为 OU 中的用户分配这些资源的权限
+ 创建额外的 OU 和容器
+ 委托授权
+ 从 Active Directory 回收站还原删除的对象
+ 在 Active Directory Web 服务上运行 AD 和 DNS Windows PowerShell 模块 

`Admin` 账户还有权执行以下域范围的活动：
+ 管理 DNS 配置（添加、删除或更新记录、区域和转发器）
+ 查看 DNS 事件日志
+ 查看安全事件日志

**使用 AWS Managed Microsoft AD 创建目录**

1. 登录 AWS 管理控制台，然后打开 Directory Service 控制台，网址为：[https://console.aws.amazon.com/directoryservicev2/](https://console.aws.amazon.com/directoryservicev2/)。

1. 在导航窗格中，选择 **Directories (目录)**，然后选择 **Set up Directory (设置目录)**。

1. 选择 **AWS Managed Microsoft AD**。AWS Managed Microsoft AD 是当前唯一可以与 Amazon RDS 一起使用的选项。

1. 输入以下信息：  
**目录 DNS 名称**  
目录的完全限定名称，例如 **corp.example.com**。  
**目录 NetBIOS 名称**  
目录的短名称，如 **CORP**。  
**目录描述**  
（可选）目录的描述。  
**管理员密码**  
目录管理员的密码。目录创建过程将使用用户名 Admin 和此密码创建一个管理员账户。  
目录管理员密码不能包含单词“admin”。此密码区分大小写，且长度必须介于 8 – 64 个字符之间。至少，它还必须包含下列四种类别中三种类别的一个字符：  
   + 小写字母 (a–z)
   + 大写字母 (A–Z)
   + 数字 (0–9)
   + 非字母数字字符 (\$1\$1@\$1\$1%^&\$1\$1-\$1=`\$1\$1()\$1\$1[]:;"'<>,.?/)  
**确认密码**  
重新输入的管理员密码。

1. 选择**下一步**。

1.  在 **Networking (网络)** 部分中输入以下信息，然后选择 **Next (下一步)**：  
**VPC**  
目录的 VPC。在该同一 VPC 中创建 Aurora MySQL 数据库集群。  
**子网**  
目录服务器的子网。两个子网必须位于不同的可用区。

1. 查看目录信息并进行必要的更改。如果信息正确，请选择 **Create directory (创建目录)**。  
![\[创建过程中的目录详细信息页面\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/AuroraUserGuide/images/WinAuth2.png)

创建目录需要几分钟时间。创建成功后，**Status (状态)** 值将更改为 **Active (活动)**。

要查看有关您的目录的信息，请在目录列表中选择目录名称。请记下**目录 ID** 值，因为您在创建或修改 Aurora MySQL 数据库集群时需要此值。

![\[“目录详细信息”页面中的“目录 ID”\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/AuroraUserGuide/images/WinAuth3.png)


## 步骤 2：（可选）为本地 Active Directory 创建信任
<a name="aurora-mysql-kerberos-setting-up.create-trust"></a>

如果您不打算使用自己的本地 Microsoft Active Directory，请跳转至 [步骤 3：创建 IAM 角色以供 Amazon Aurora 使用](#aurora-mysql-kerberos-setting-up.CreateIAMRole)。

要将 Kerberos 身份验证与本地 Active Directory 结合使用，您需要使用林信任在本地 Microsoft Active Directory 和 AWS Managed Microsoft AD 目录（在[步骤 1：使用 AWS Managed Microsoft AD 创建目录](#aurora-mysql-kerberos-setting-up.create-directory)中创建）之间创建信任域关系。信任可以是单向的，此时 AWS Managed Microsoft AD 目录信任本地 Microsoft Active Directory。信任也可以是双向的，此时两个 Active Directory 相互信任。有关使用 Directory Service 设置信任的更多信息，请参阅 *AWS Directory Service 管理指南*中的[何时创建信任关系](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_setup_trust.html)。

**注意**  
如果使用本地 Microsoft Active Directory：  
Windows 客户端无法使用 Aurora 自定义端点进行连接。要了解更多信息，请参阅[Amazon Aurora 端点连接](Aurora.Overview.Endpoints.md)。
对于[全局数据库](aurora-global-database.md)：  
Windows 客户端可以使用全局数据库的主 AWS 区域 中的实例端点或集群端点进行连接。
Windows 客户端无法使用辅助 AWS 区域 中的集群端点进行连接。

请确保您的本地 Microsoft Active Directory 域名包含与新创建的信任关系对应的 DNS 后缀路由。以下屏幕截图显示一个示例。

![\[DNS 路由对应于创建的信任\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/AuroraUserGuide/images/kerberos-auth-trust.png)


## 步骤 3：创建 IAM 角色以供 Amazon Aurora 使用
<a name="aurora-mysql-kerberos-setting-up.CreateIAMRole"></a>

要使 Amazon Aurora 为您调用 Directory Service，您需要一个使用托管式 IAM policy `AmazonRDSDirectoryServiceAccess` 的 AWS Identity and Access Management（IAM）角色。该角色允许 Aurora 调用 Directory Service。

使用 AWS 管理控制台创建数据库集群并且您具有 `iam:CreateRole` 权限时，控制台将自动创建此角色。在这种情况下，角色名为 `rds-directoryservice-kerberos-access-role`。否则，您必须手动创建 IAM 角色。在创建该 IAM 角色时，请选择 `Directory Service`，然后将 AWS 托管策略 `AmazonRDSDirectoryServiceAccess` 附加到该角色。

有关为服务创建 IAM 角色的更多信息，请参阅 *IAM 用户指南*中的[创建向AWS服务委托权限的角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)。

或者，您可以创建具有所需权限的角色，而不是使用托管 IAM 策略 `AmazonRDSDirectoryServiceAccess`。在这种情况下，IAM 角色必须具有以下 IAM 信任策略。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "directoryservice.rds.amazonaws.com",
          "rds.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

------

角色还必须具有以下 IAM 角色策略。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Action": [
        "ds:DescribeDirectories",
        "ds:AuthorizeApplication",
        "ds:UnauthorizeApplication",
        "ds:GetAuthorizedApplicationDetails"
      ],
    "Effect": "Allow",
    "Resource": "*"
    }
  ]
}
```

------

## 步骤 4：创建和配置用户
<a name="aurora-mysql-kerberos-setting-up.create-users"></a>

您可以使用“Active Directory 用户和计算机”工具创建用户。该工具是 Active Directory Domain Services 和 Active Directory Lightweight Directory Services 工具的一部分。用户表示有权访问您的目录的独立个人或实体。

要在 Directory Service 目录中创建用户，请使用一个基于 Microsoft Windows 的本地或 Amazon EC2 实例，该实例已加入您的 Directory Service 目录中。您必须以具有权限创建用户的用户身份登录此实例。有关更多信息，请参阅*AWS Managed Microsoft AD Directory Service 管理指南*中的[管理 AWS 中的用户和组](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/creating_ad_users_and_groups.html)。

## 步骤 5：创建或修改 Aurora MySQL 数据库集群
<a name="aurora-mysql-kerberos-setting-up.create-modify"></a>

创建或修改 Aurora MySQL 数据库集群，以便与目录一起使用。您可以使用控制台、AWS CLI 或 RDS API 将数据库集群与目录关联。您可以通过下列方式之一来执行该任务：
+ 使用控制台、[create-db-cluster](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-cluster.html) CLI 命令或 [CreateDBCluster](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBCluster.html) RDS API 操作创建新的 Aurora MySQL 数据库集群。

  有关说明，请参阅[创建 Amazon Aurora 数据库集群](Aurora.CreateInstance.md)。
+ 使用控制台、[modify-db-cluster](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-cluster.html) CLI 命令或 [ModifyDBCluster](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBCluster.html) RDS API 操作修改现有的 Aurora MySQL 数据库集群。

  有关说明，请参阅[修改 Amazon Aurora 数据库集群](Aurora.Modifying.md)。
+ 使用控制台、[restore-db-cluster-from-snapshot](https://docs.aws.amazon.com/cli/latest/reference/rds/restore-db-cluster-from-snapshot.html) CLI 命令或 [RestoreDBClusterFromSnapshot](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_RestoreDBClusterFromSnapshot.html) RDS API 操作，从数据库快照还原 Aurora MySQL 数据库集群。

  有关说明，请参阅[从数据库集群快照还原](aurora-restore-snapshot.md)。
+ 使用控制台、[restore-db-cluster-to-point-in-time](https://docs.aws.amazon.com/cli/latest/reference/rds/restore-db-cluster-to-point-in-time.html) CLI 命令或 [RestoreDBClusterToPointInTime](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_RestoreDBClusterToPointInTime.html) RDS API 操作，将 Aurora MySQL 数据库集群还原到某个时间点。

  有关说明，请参阅[将数据库集群还原到指定时间](aurora-pitr.md)。

仅 VPC 中的 Aurora MySQL 数据库集群支持 Kerberos 身份验证。数据库集群可以与目录在同一 VPC 中或在不同 VPC 中。数据库集群的 VPC 必须具有允许与您的目录进行出站通信的 VPC 安全组。

### 控制台
<a name="aurora-mysql-kerberos-setting-up.create-modify.CON"></a>

在使用控制台创建、修改或还原数据库集群时，请选择**数据库身份验证**部分中的 **Kerberos 身份验证**。选择 **Browse Directory (浏览目录)**，然后选择目录或选择 **Create a new directory (创建新目录)**。

![\[创建数据库集群时的 Kerberos 身份验证设置\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/AuroraUserGuide/images/kerberos-auth-create-cluster.png)


### AWS CLI
<a name="aurora-mysql-kerberos-setting-up.create-modify.CLI"></a>

使用 AWS CLI 或 RDS API 时，将数据库集群实例与目录关联。数据库集群需要以下参数才能使用您创建的域目录：
+ 对于 `--domain` 参数，请使用创建目录时生成的域标识符（“d-\$1”标识符）。
+ 对于 `--domain-iam-role-name` 参数，请使用您使用托管 IAM 策略 `AmazonRDSDirectoryServiceAccess` 创建的角色。

例如，以下 CLI 命令修改数据库集群以使用目录。

对于 Linux、macOS 或 Unix：

```
aws rds modify-db-cluster \
    --db-cluster-identifier mydbcluster \
    --domain d-ID \
    --domain-iam-role-name role-name
```

对于：Windows

```
aws rds modify-db-cluster ^
    --db-cluster-identifier mydbcluster ^
    --domain d-ID ^
    --domain-iam-role-name role-name
```

**重要**  
如果您修改数据库集群以开启 Kerberos 身份验证，请在进行更改之后重启读取器数据库实例。

## 步骤 6：创建使用 Kerberos 身份验证的 Aurora MySQL 用户
<a name="aurora-mysql-kerberos-setting-up.create-logins"></a>

数据库集群加入到 AWS Managed Microsoft AD 域。这样，您可以从您域中的 Active Directory 用户创建 Aurora MySQL 用户。数据库权限是通过授予这些用户并从这些用户撤消的标准 Aurora MySQL 权限来管理的。

您可以允许 Active Directory 用户使用 Aurora MySQL 进行身份验证。为此，首先使用 Amazon RDS 主用户凭证连接到 Aurora MySQL 数据库集群，就像连接到任何其他数据库集群一样。登录后，在 Aurora MySQL 中创建一个具有 Kerberos 身份验证的经外部身份验证的用户，如下所示：

```
CREATE USER user_name@'host_name' IDENTIFIED WITH 'authentication_kerberos' BY 'realm_name';
```
+ 将 `user_name` 替换为用户名。您的域中的用户（人员和应用程序）现在可以使用 Kerberos 身份验证从加入域的客户端计算机连接到数据库集群。
+ 将 `host_name` 替换为主机名。可以使用 `%` 作为通配符。您也可以使用特定的 IP 地址作为主机名。
+ 将 *realm\$1name* 替换为域的目录领域名称。领域名称通常与使用大写字母的 DNS 域名相同，例如 `CORP.EXAMPLE.COM`。领域是一组使用相同 Kerberos 密钥分发中心的系统。

以下示例创建了一个名为 `Admin` 的数据库用户，该用户使用领域名称 `MYSQL.LOCAL` 针对 Active Directory 进行身份验证。

```
CREATE USER Admin@'%' IDENTIFIED WITH 'authentication_kerberos' BY 'MYSQL.LOCAL';
```

### 修改现有的 Aurora MySQL 登录名
<a name="aurora-mysql-kerberos.modify-login"></a>

还可以使用以下语法修改现有 Aurora MySQL 登录名以使用 Kerberos 身份验证：

```
ALTER USER user_name IDENTIFIED WITH 'authentication_kerberos' BY 'realm_name';
```

## 步骤 7：配置 MySQL 客户端
<a name="aurora-mysql-kerberos-setting-up.configure-client"></a>

要配置 MySQL 客户端，请采取以下步骤：

1. 创建一个 `krb5.conf` 文件（或等效的文件）以指向该域。

1. 验证流量是否可以在客户端主机和 Directory Service 之间流动。使用网络实用程序（如 Netcat）执行以下操作：
   + 验证端口 53 上通过 DNS 的流量。
   + 验证端口 53 上通过 TCP/UDP 的流量以及 Kerberos 的流量，包括用于 Directory Service 的端口 88 和 464。

1. 验证流量是否可以通过数据库端口在客户端主机和数据库实例之间流动。例如，使用 `mysql` 连接和访问数据库。

以下是 AWS Managed Microsoft AD 的示例 `krb5.conf` 内容。

```
[libdefaults]
 default_realm = EXAMPLE.COM
[realms]
 EXAMPLE.COM = {
  kdc = example.com
  admin_server = example.com
 }
[domain_realm]
 .example.com = EXAMPLE.COM
 example.com = EXAMPLE.COM
```

以下是本地 Microsoft Active Directory 的示例 `krb5.conf` 内容。

```
[libdefaults]
 default_realm = EXAMPLE.COM
[realms]
 EXAMPLE.COM = {
  kdc = example.com
  admin_server = example.com
 }
 ONPREM.COM = {
  kdc = onprem.com
  admin_server = onprem.com
 }
[domain_realm]
 .example.com = EXAMPLE.COM
 example.com = EXAMPLE.COM
 .onprem.com = ONPREM.COM
 onprem.com = ONPREM.COM  
 .rds.amazonaws.com = EXAMPLE.COM
 .amazonaws.com.rproxy.govskope.us.cn = EXAMPLE.COM
 .amazon.com = EXAMPLE.COM
```

## 步骤 8：（可选）配置不区分大小写的用户名比较
<a name="aurora-mysql-kerberos-setting-up.case-insensitive"></a>

原定设置情况下，MySQL 数据库用户名的字符大小写必须与 Active Directory 登录名的大小写匹配。但是，您现在可以通过 `authentication_kerberos` 插件使用不区分大小写的用户名比较。为此，可以将 `authentication_kerberos_caseins_cmp` 数据库集群参数设置为 `true`。

**使用不区分大小写的用户名比较**

1. 创建自定义数据库集群参数组。按照 [在 Amazon Aurora 中创建数据库集群参数组](USER_WorkingWithParamGroups.CreatingCluster.md) 所述的过程操作。

1. 编辑新的参数组以将 `authentication_kerberos_caseins_cmp` 的值设置为 `true`。按照 [在 Amazon Aurora 中修改数据库集群参数组中的参数](USER_WorkingWithParamGroups.ModifyingCluster.md) 所述的过程操作。

1. 将数据库集群参数组与 Aurora MySQL 数据库集群关联。按照 [在 Amazon Aurora 中将数据库集群参数组与数据库集群关联](USER_WorkingWithParamGroups.AssociatingCluster.md) 所述的过程操作。

1. 重启数据库集群。

# 使用 Kerberos 身份验证连接到 Aurora MySQL
<a name="aurora-mysql-kerberos-connecting"></a>

为避免错误，请在 Unix 平台上使用版本 8.0.26 或更高版本的 MySQL 客户端，在 Windows 上使用 8.0.27 或更高版本的 MySQL 客户端。

## 使用 Aurora MySQL Kerberos 登录名连接到数据库集群
<a name="aurora-mysql-kerberos-connecting.login"></a>

要通过 Kerberos 身份验证连接到 Aurora MySQL，您需要按照 [步骤 6：创建使用 Kerberos 身份验证的 Aurora MySQL 用户](aurora-mysql-kerberos-setting-up.md#aurora-mysql-kerberos-setting-up.create-logins) 中的说明，以您创建的数据库用户身份登录。

在命令提示符下，连接到其中一个与 Aurora MySQL 数据库集群关联的端点。当系统提示您输入密码时，请输入与该用户名关联的 Kerberos 密码。

当您使用 Kerberos 进行身份验证时，如果*票证授予票证*（TGT）尚不存在，则会生成此票证。`authentication_kerberos` 插件使用 TGT 获取*服务票证*，然后将其出示给 Aurora MySQL 数据库服务器。

可以使用 MySQL 客户端，在 Windows 或 Unix 上通过 Kerberos 身份验证连接到 Aurora MySQL。

### Unix
<a name="aurora-mysql-kerberos-connecting.login.unix"></a>

您可以使用以下方法之一进行连接：
+ 手动获取 TGT。在这种情况下，您不需要向 MySQL 客户端提供密码。
+ 直接向 MySQL 客户端提供 Active Directory 登录的密码。

在 Unix 平台上，MySQL 客户端版本 8.0.26 及更高版本支持客户端插件。

**通过手动获取 TGT 进行连接**

1. 在命令行界面上，使用以下命令获取 TGT。

   ```
   kinit user_name
   ```

1. 使用以下 `mysql` 命令登录数据库集群的数据库实例端点。

   ```
   mysql -h DB_instance_endpoint -P 3306 -u user_name -p
   ```
**注意**  
如果在数据库实例上轮换 keytab，则身份验证可能会失败。在这种情况下，通过重新运行 `kinit` 获得新的 TGT。

**直接连接**

1. 在命令行界面上，使用以下 `mysql` 命令登录到数据库集群的数据库实例端点。

   ```
   mysql -h DB_instance_endpoint -P 3306 -u user_name -p
   ```

1. 输入 Active Directory 用户的密码。

### Windows
<a name="aurora-mysql-kerberos-connecting.login.win"></a>

在 Windows 上，身份验证通常在登录时完成，因此，您无需手动获取 TGT 即可连接到 Aurora MySQL 数据库集群。数据库用户名的大小写必须与 Active Directory 中用户的字符大小写相匹配。例如，如果 Active Directory 中的用户显示为 `Admin`，则数据库用户名必须为 `Admin`。

在 Windows 上，MySQL 客户端版本 8.0.27 及更高版本支持客户端插件。

**直接连接**
+ 在命令行界面上，使用以下 `mysql` 命令登录到数据库集群的数据库实例端点。

  ```
  mysql -h DB_instance_endpoint -P 3306 -u user_name
  ```

## Aurora 全局数据库的 Kerberos 身份验证
<a name="aurora-mysql-kerberos-connecting.global"></a>

Aurora 全局数据库支持适用于 Aurora MySQL 的 Kerberos 身份验证。要使用主数据库集群的 Active Directory 对辅助数据库集群上的用户进行身份验证，请将 Active Directory 复制到辅助 AWS 区域。可以使用与主集群相同的域 ID 在辅助群集上开启 Kerberos 身份验证。只有企业版的 Active Directory 才支持 AWS Managed Microsoft AD 复制。有关更多信息，请参阅《AWS Directory Service 管理指南》**中的[多区域复制](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_configure_multi_region_replication.html)。

## 从 RDS for MySQL 迁移到 Aurora MySQL
<a name="aurora-mysql-kerberos-connecting.rds"></a>

从启用了 Kerberos 身份验证的 RDS for MySQL 迁移到 Aurora MySQL 后，修改使用 `auth_pam` 插件创建的用户以使用 `authentication_kerberos` 插件。例如：

```
ALTER USER user_name IDENTIFIED WITH 'authentication_kerberos' BY 'realm_name';
```

## 阻止票证缓存
<a name="aurora-mysql-kerberos.destroy-tickets"></a>

如果 MySQL 客户端应用程序启动时不存在有效的 TGT，则应用程序可以获取并缓存 TGT。如果要阻止缓存 TGT，请在 `/etc/krb5.conf` 文件中设置配置参数。

**注意**  
此配置仅适用于运行 Unix 的客户端主机，而不适用于运行 Windows 的客户端主机。

**防止 TGT 缓存**
+ 向 `/etc/krb5.conf` 中添加 `[appdefaults]` 部分，如下所示：

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

## 针对 Kerberos 身份验证的日志记录
<a name="aurora-mysql-kerberos.logging"></a>

`AUTHENTICATION_KERBEROS_CLIENT_LOG` 环境变量设置 Kerberos 身份验证的日志记录级别。您可以使用日志进行客户端调试。

允许的值为 1–5。日志消息写入标准错误输出。下表描述了每个日志记录级别。


| Logging level（日志记录级别） | 描述 | 
| --- | --- | 
| 1 或未设置 | 不记录 | 
| 2 | 错误消息 | 
| 3 | 错误和警告消息 | 
| 4 | 错误、警告和信息消息 | 
| 5 | 错误、警告、信息和调试消息 | 

# 在域中管理数据库集群
<a name="aurora-mysql-kerberos-managing"></a>

您可以使用 AWS CLI 或 RDS API 来管理您的数据库集群及其与托管式 Active Directory 的关系。例如，您可以关联一个 Active Directory 以进行 Kerberos 身份验证，并取消关联一个 Active Directory 以关闭 Kerberos 身份验证。也可以将由一个 Active Directory 在外部进行身份验证的数据库集群移到另一个 Active Directory。

例如，使用 Amazon RDS API，您可以执行下列操作：
+ 要重新尝试为失败的成员资格开启 Kerberos 身份验证，请使用 `ModifyDBInstance` API 操作并指定当前成员的目录 ID。
+ 要为成员资格更新 IAM 角色名称，请使用 `ModifyDBInstance` API 操作并指定当前成员资格的目录 ID 和新的 IAM 角色。
+ 要在数据库集群上关闭 Kerberos 身份验证，请使用 `ModifyDBInstance` API 操作并指定 `none` 作为域参数。
+ 要将数据库集群从一个域移至另一个域，请使用 `ModifyDBInstance` API 操作并指定新域的域标识符作为域参数。
+ 要列出每个数据库集群的成员资格，请使用 `DescribeDBInstances` API 操作。

## 了解域成员资格
<a name="aurora-mysql-kerberos-managing.understanding"></a>

在创建或修改数据库集群后，此集群将成为域的成员。您可以通过运行 [describe-db-clusters](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-clusters.html) CLI 命令来查看数据库集群的域成员身份的状态。数据库集群的状态可以是以下状态之一：
+ `kerberos-enabled` – 数据库集群已开启 Kerberos 身份验证。
+  `enabling-kerberos` – AWS 正在此数据库集群上开启 Kerberos 身份验证。
+ `pending-enable-kerberos` – 开启 Kerberos 身份验证的过程在此数据库集群上处于待处理状态。
+ `pending-maintenance-enable-kerberos` – AWS 将尝试在下一个计划的维护时段在数据库集群上开启 Kerberos 身份验证。
+ `pending-disable-kerberos` – 关闭 Kerberos 身份验证的过程在此数据库集群上处于待处理状态。
+ `pending-maintenance-disable-kerberos` – AWS 将尝试在下一个计划的维护时段在数据库集群上关闭 Kerberos 身份验证。
+ `enable-kerberos-failed` – 出现一个配置问题，导致 AWS 无法在数据库集群上开启 Kerberos 身份验证。在重新发出数据库集群修改命令之前检查并修复配置。
+ `disabling-kerberos` – AWS 正在此数据库集群上关闭 Kerberos 身份验证。

开启 Kerberos 身份验证的请求可能因网络连接问题或 IAM 角色不正确而失败。例如，假设您创建数据库集群或修改现有数据库集群，但开启 Kerberos 身份验证的尝试失败。在这种情况下，请重新发出修改命令或修改新创建的数据库集群以加入域。