

# 在 Amazon RDS for PostgreSQL 中使用 Kerberos 身份验证
使用 Kerberos 身份验证

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

要开始操作，请创建一个 Amazon Managed Microsoft AD 目录来存储用户凭证。然后，将 Active Directory 的域和其他信息提供给 PostgreSQL 数据库实例。当用户使用 PostgreSQL 数据库实例进行身份验证时，身份验证请求将转发到 Amazon Managed Microsoft AD 目录。

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

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

数据库可以使用密码身份验证，也可以使用带有 Kerberos 或 Amazon Identity and Access Management（IAM）身份验证的密码身份验证。有关 IAM 身份验证的更多信息，请参阅 [适用于 MariaDB、MySQL 和 PostgreSQL 的IAM 数据库身份验证](UsingWithRDS.IAMDBAuth.md)。

**注意**  
RDS for PostgreSQL 不支持对 Active Directory 组进行 Kerberos 身份验证。

**Topics**
+ [

## 区域和版本可用性
](#postgresql-kerberos.RegionVersionAvailability)
+ [

## PostgreSQL 数据库实例的 Kerberos 身份验证概述
](#postgresql-kerberos-overview)
+ [

# 为 PostgreSQL 数据库实例设置 Kerberos 身份验证
](postgresql-kerberos-setting-up.md)
+ [

# 在 Active Directory 域中管理 RDS for PostgreSQL 数据库实例
](postgresql-kerberos-managing.md)
+ [

# 使用 Kerberos 身份验证连接到 PostgreSQL
](postgresql-kerberos-connecting.md)

## 区域和版本可用性
区域和版本可用性

功能可用性和支持因每个数据库引擎的特定版本以及 Amazon Web Services 区域而异。有关使用 Kerberos 身份验证的 RDS for PostgreSQL 的版本和区域可用性的更多信息，请参阅[支持 Amazon RDS 中 Kerberos 身份验证功能的区域和数据库引擎](Concepts.RDS_Fea_Regions_DB-eng.Feature.KerberosAuthentication.md)。

## PostgreSQL 数据库实例的 Kerberos 身份验证概述
Kerberos 身份验证概述

要为 PostgreSQL 数据库实例设置 Kerberos 身份验证，请执行以下步骤，稍后将详细介绍这些步骤：

1. 使用 Amazon Managed Microsoft AD 创建 Amazon Managed Microsoft AD 目录。您可以使用 Amazon Web Services 管理控制台、Amazon CLI 或 Amazon Directory Service API 创建目录。确保打开目录安全组上的相关出站端口，以便目录可以与实例进行通信。

1. 创建一个角色，以提供对您的 Amazon Managed Microsoft AD 目录进行调用的 Amazon RDS 访问权限。为此，请创建使用托管 IAM 策略 `AmazonRDSDirectoryServiceAccess` 的 Amazon Identity and Access Management (IAM) 角色。

   要使 IAM 角色允许访问，必须在您的 Amazon 账户的正确 Amazon 区域中激活 Amazon Security Token Service（Amazon STS）端点。原定设置情况下，Amazon STS 端点在所有 Amazon Web Services 区域中处于活动状态，您可以直接使用这些端点，而无需执行任何其他操作。有关更多信息，请参阅 *IAM 用户指南*中的[在 Amazon STS 区域中激活和停用 Amazon](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html#sts-regions-activate-deactivate)。

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

1. 如果您计划在不同的 Amazon 账户或 Virtual Private Cloud (VPC) 中查找目录和数据库实例，请配置 VPC 对等连接。有关更多信息，请参阅 *Amazon VPC Peering Guide* 中的[什么是 VPC 对等连接？](https://docs.amazonaws.cn/vpc/latest/peering/Welcome.html)。

1. 使用以下方法之一，从控制台、CLI 或 RDS API 中创建或修改 PostgreSQL 数据库实例：
   + [创建 Amazon RDS 数据库实例](USER_CreateDBInstance.md) 
   + [修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md) 
   + [还原到数据库实例](USER_RestoreFromSnapshot.md)
   + [将 Amazon RDS 的数据库实例还原到指定时间](USER_PIT.md)

   您可以在与目录相同的 Amazon Virtual Private Cloud (VPC) 中或在不同的 Amazon 账户或 VPC 中定位实例。创建或修改 PostgreSQL 数据库实例时，请执行以下操作：
   + 请提供创建目录时生成的域标识符（`d-*` 标识符）。
   + 还要提供您创建的 IAM 角色的名称。
   + 确保数据库实例安全组可以从目录安全组接收入站流量。

1. 使用 RDS 主用户凭证连接到 PostgreSQL 数据库实例。在 PostgreSQL 中创建用户以在外部进行标识。外部标识的用户可以使用 Kerberos 身份验证登录到 PostgreSQL 数据库实例。

# 为 PostgreSQL 数据库实例设置 Kerberos 身份验证
设置

您可以使用 Amazon Directory Service for Microsoft Active Directory (Amazon Managed Microsoft AD) 为 PostgreSQL 数据库实例设置 Kerberos 身份验证。要设置 Kerberos 身份验证，请执行以下步骤。

**Topics**
+ [

## 步骤 1：使用 Amazon Managed Microsoft AD 创建目录
](#postgresql-kerberos-setting-up.create-directory)
+ [

## 步骤 2：（可选）在本地 Active Directory 和 Amazon Directory Service 之间创建信任关系
](#postgresql-kerberos-setting-up.create-trust)
+ [

## 步骤 3：为 Amazon RDS 创建 IAM 角色以访问 Amazon Directory Service
](#postgresql-kerberos-setting-up.CreateIAMRole)
+ [

## 步骤 4：创建和配置用户
](#postgresql-kerberos-setting-up.create-users)
+ [

## 步骤 5：在目录和数据库实例之间启用跨 VPC 流量
](#postgresql-kerberos-setting-up.vpc-peering)
+ [

## 步骤 6：创建或修改 PostgreSQL 数据库实例
](#postgresql-kerberos-setting-up.create-modify)
+ [

## 步骤 7：为您的 Kerberos 主体创建 PostgreSQL 用户
](#postgresql-kerberos-setting-up.create-logins)
+ [

## 步骤 8：配置 PostgreSQL 客户端
](#postgresql-kerberos-setting-up.configure-client)

## 步骤 1：使用 Amazon Managed Microsoft AD 创建目录
步骤 1：使用 Amazon Managed Microsoft AD 创建目录

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

 创建 Amazon Managed Microsoft AD 目录时，Amazon Directory Service 将代表您执行下列任务：
+ 在您的 VPC 中设置 Active Directory。
+ 创建具有用户名 `Admin` 和指定密码的目录管理员账户。您可以使用此账户管理您的目录。
**重要**  
请务必保存此密码。Amazon Directory Service 不会存储此密码并且它无法取回或重置。
+ 为目录控制器创建安全组。安全组必须允许与 PostgreSQL 数据库实例进行通信。

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

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

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

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

1.  在 [Amazon Directory Service 控制台](https://console.amazonaws.cn/directoryservicev2/)导航窗格中，选择 **Directories (目录)**，然后选择 **Set up directory (设置目录)**。

1. 选择 **Amazon Managed Microsoft AD**。Amazon Managed Microsoft AD 是当前唯一支持用于 Amazon RDS 的选项。

1. 选择 **Next (下一步)**。

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[]:;"'<>,.?/)   
**确认密码**  
 重新键入管理员密码。  
确保您保存该密码。Amazon Directory Service 不会存储该密码，也无法检索或重置该密码。

1. 选择 **Next (下一步)**。

1. 在**选择 VPC 和子网**页面上，提供以下信息：  
**VPC**  
为目录选择 VPC。您可以在该相同 VPC 或不同的 VPC 中创建 PostgreSQL 数据库实例。  
**子网**  
 为目录服务器选择子网。两个子网必须位于不同的可用区。

1. 选择 **Next (下一步)**。

1.  检查目录信息。如果需要进行更改，请选择 **Previous (上一步)** 并作出更改。如果信息正确，请选择 **Create directory (创建目录)**。  
![\[“目录详细信息”页面\]](http://docs.amazonaws.cn/AmazonRDS/latest/UserGuide/images/WinAuth2.png)

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

 要查看有关您的目录的信息，请在目录列表中选择目录。记下**目录 ID** 值。在创建或修改 PostgreSQL 数据库实例时，您需要使用该值。

![\[详细信息页面的图像\]](http://docs.amazonaws.cn/AmazonRDS/latest/UserGuide/images/WinAuth3.png)


## 步骤 2：（可选）在本地 Active Directory 和 Amazon Directory Service 之间创建信任关系
步骤 2：（可选）为本地 Active Directory 创建信任关系

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

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

**注意**  
如果您使用本地 Microsoft Active Directory，则 Windows 客户端使用端点中 Amazon Directory Service 的域名而不是 rds.amazonaws.com 进行连接。要了解更多信息，请参阅[使用 Kerberos 身份验证连接到 PostgreSQL](postgresql-kerberos-connecting.md)。

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

![\[DNS 路由对应于创建的信任\]](http://docs.amazonaws.cn/AmazonRDS/latest/UserGuide/images/kerberos-auth-trust.png)


## 步骤 3：为 Amazon RDS 创建 IAM 角色以访问 Amazon Directory Service
步骤 3：创建 IAM 角色以访问 Amazon Directory Service

要使 Amazon RDS 为您调用 Amazon Directory Service，您的 Amazon 账户需要一个使用托管式 IAM 策略 `AmazonRDSDirectoryServiceAccess` 的 IAM 角色。该角色允许 Amazon RDS 对 Amazon Directory Service 进行调用。

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

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

**注意**  
用于 RDS for Microsoft SQL Server 的 Windows 身份验证的 IAM 角色不能用于 Amazon RDS for PostgreSQL。

作为使用 `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": "*"
    }
  ]
}
```

------

对于选择加入的 Amazon Web Services 区域，请在 IAM 角色信任策略中使用区域特定的服务主体。在为这些区域中的服务创建信任策略时，请在服务主体中指定区域代码。

以下示例显示了包括区域特定的服务主体的信任策略：

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

****  

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

------

将 REGION-CODE 替换为特定区域的代码。例如，对亚太地区（墨尔本）区域使用以下服务主体：

```
"Service": [
  "directoryservice.rds.ap-southeast-4.amazonaws.com",
  "rds.ap-southeast-4.amazonaws.com"
]
```

## 步骤 4：创建和配置用户
步骤 4：创建和配置用户

 您可以使用“Active Directory 用户和计算机”工具创建用户。该工具是 Active Directory Domain Services 和 Active Directory Lightweight Directory Services 工具之一。有关更多信息，请参阅 Microsoft 文档中的[将用户和计算机添加到 Active Directory 域](https://learn.microsoft.com/en-us/troubleshoot/windows-server/identity/create-an-active-directory-server#add-users-and-computers-to-the-active-directory-domain)。在这种情况下，用户是个人或其他实体，例如属于域的计算机，其身份在目录中维护。

要在 Amazon Directory Service 目录中创建用户，您必须连接到属于 Amazon Directory Service 目录成员的基于 Windows 的 Amazon EC2 实例。同时，您必须以具有创建用户权限的用户身份登录。有关更多信息，请参阅 *Amazon Directory Service 管理指南*中的[创建用户](https://docs.amazonaws.cn/directoryservice/latest/admin-guide/ms_ad_manage_users_groups_create_user.html)。

## 步骤 5：在目录和数据库实例之间启用跨 VPC 流量
步骤 5：启用跨 VPC 流量

如果您打算将目录和数据库实例放在同一 VPC 中，请跳过该步骤，然后转到[步骤 6：创建或修改 PostgreSQL 数据库实例](#postgresql-kerberos-setting-up.create-modify)。

如果您计划在不同 VPC 中查找目录和数据库实例，请使用 VPC 对等连接或 [Amazon Transit Gateway](https://docs.amazonaws.cn/vpc/latest/tgw/what-is-transit-gateway.html) 配置跨 VPC 流量。

以下过程使用 VPC 对等连接启用 VPC 之间的流量。请按照 *Amazon Virtual Private Cloud 对等连接指南*中的[什么是 VPC 对等连接？](https://docs.amazonaws.cn/vpc/latest/peering/Welcome.html)操作。

**使用 VPC 对等连接启用跨 VPC 流量**

1. 设置适合的 VPC 路由规则，以便确保网络流量可以双向流动。

1. 确保数据库实例安全组可以从目录安全组接收入站流量。

1. 确保没有任何网络访问控制列表 (ACL) 规则会阻止流量。

如果该目录由不同的 Amazon 账户拥有，则您必须共享该目录。

**在 Amazon 账户之间共享目录**

1. 按照 *Amazon 管理指南*中的[教程：共享 Amazon 托管 Microsoft AD 目录以实现无缝 EC2 域加入](https://docs.amazonaws.cn/directoryservice/latest/admin-guide/ms_ad_tutorial_directory_sharing.html)中的说明，开始与将要在其中创建数据库实例的 Amazon Directory Service 账户共享目录。

1. 使用数据库实例的账户登录到 Amazon Directory Service 控制台，并确保在处理之前域具有 `SHARED` 状态。

1. 使用数据库实例的账户登录 Amazon Directory Service 控制台时，请记录**目录 ID** 值。您可以使用此目录 ID 将数据库实例加入域。

## 步骤 6：创建或修改 PostgreSQL 数据库实例


创建或修改 PostgreSQL 数据库实例以用于您的目录。您可以使用控制台、CLI 或 RDS API 将数据库实例与目录关联。您可以通过下列方式之一来执行该操作：
+  使用控制台、[create-db-instance](https://docs.amazonaws.cn/cli/latest/reference/rds/create-db-instance.html) CLI 命令或 [CreateDBInstance](https://docs.amazonaws.cn/AmazonRDS/latest/APIReference/API_CreateDBInstance.html) RDS API 操作创建新的 PostgreSQL 数据库实例。有关说明，请参阅 [创建 Amazon RDS 数据库实例](USER_CreateDBInstance.md)。
+  使用控制台、[modify-db-instance](https://docs.amazonaws.cn/cli/latest/reference/rds/modify-db-instance.html) CLI 命令或 [ModifyDBInstance](https://docs.amazonaws.cn/AmazonRDS/latest/APIReference/API_ModifyDBInstance.html) RDS API 操作修改现有的 PostgreSQL 数据库实例。有关说明，请参阅 [修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。
+  使用控制台、[restore-db-instance-from-db-snapshot](https://docs.amazonaws.cn/cli/latest/reference/rds/restore-db-instance-from-db-snapshot.html) CLI 命令或 [RestoreDBInstanceFromDBSnapshot](https://docs.amazonaws.cn/AmazonRDS/latest/APIReference/API_RestoreDBInstanceFromDBSnapshot.html) RDS API 操作，从数据库快照还原 PostgreSQL 数据库实例。有关说明，请参阅 [还原到数据库实例](USER_RestoreFromSnapshot.md)。
+  使用控制台、[restore-db-instance-to-point-in-time](https://docs.amazonaws.cn/cli/latest/reference/rds/restore-db-instance-to-point-in-time.html) CLI 命令或 [RestoreDBInstanceToPointInTime](https://docs.amazonaws.cn/AmazonRDS/latest/APIReference/API_RestoreDBInstanceToPointInTime.html) RDS API 操作，将 PostgreSQL 数据库实例还原到某个时间点。有关说明，请参阅 [将 Amazon RDS 的数据库实例还原到指定时间](USER_PIT.md)。

仅 VPC 中的 PostgreSQL 数据库实例支持 Kerberos 身份验证。数据库实例可以与目录在同一 VPC 中或在不同 VPC 中。数据库实例必须使用允许在目录的 VPC 中传入和传出的安全组，以便数据库实例与目录通信。

### 控制台


在使用控制台创建、修改或还原数据库实例时，请选择**数据库身份验证**部分中的**密码和 Kerberos 身份验证**。然后选择**浏览目录**。选择目录或选择**创建一个新目录**以使用 Directory Service。

![\[选择 Kerberos 进行身份验证并确定要使用的目录。\]](http://docs.amazonaws.cn/AmazonRDS/latest/UserGuide/images/rpg-authentication-use-kerberos.png)


### Amazon CLI


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

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

```
aws rds modify-db-instance --db-instance-identifier mydbinstance --domain d-Directory-ID --domain-iam-role-name role-name 
```

**重要**  
如果修改数据库实例以启用 Kerberos 身份验证，请在做出更改之后重新启动数据库实例。

## 步骤 7：为您的 Kerberos 主体创建 PostgreSQL 用户


此时，您的 RDS for PostgreSQL 数据库实例已加入 Amazon Managed Microsoft AD 域。您需要将您在[步骤 4：创建和配置用户](#postgresql-kerberos-setting-up.create-users)的目录中创建的用户设置为 PostgreSQL 数据库用户，并授予登录数据库的权限。为此，请以具有 `rds_superuser` 权限的数据库用户身份登录。例如，如果在创建 RDS for PostgreSQL 数据库实例时接受了缺省设置值，请使用 `postgres`，如以下步骤所示。

**为 Kerberos 主体创建 PostgreSQL 数据库用户**

1. 使用 `psql` 通过 `psql` 连接到 RDS for PostgreSQL 数据库实例端点。以下示例对于 `rds_superuser` 角色使用原定设置 `postgres` 账户。

   ```
   psql --host=cluster-instance-1.111122223333.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password
   ```

1. 为要访问数据库的每个 Kerberos 主体（Active Directory 用户名）创建一个数据库用户名。使用 Active Directory 实例中定义的规范用户名（身份），即该用户名的小写 `alias`（Active Directory 中的用户名）和大写 Active Directory 域名。Active Directory 用户名是经过外部身份验证的用户，因此请在名称前后使用引号，如下所示。

   ```
   postgres=> CREATE USER "username@CORP.EXAMPLE.COM" WITH LOGIN;
   CREATE ROLE
   ```

1. 将 `rds_ad` 角色授予数据库用户。

   ```
   postgres=> GRANT rds_ad TO "username@CORP.EXAMPLE.COM";
   GRANT ROLE
   ```

为 Active Directory 用户身份创建完所有 PostgreSQL 用户后，用户可以使用他们的 Kerberos 凭证访问 RDS for PostgreSQL 数据库实例。

使用 Kerberos 进行身份验证的数据库用户需要从属于 Active Directory 域成员的客户端计算机进行身份验证。

被授予 `rds_ad` 角色的数据库用户不能同时拥有 `rds_iam` 角色。这也适用于嵌套成员资格。有关更多信息，请参阅 [适用于 MariaDB、MySQL 和 PostgreSQL 的IAM 数据库身份验证](UsingWithRDS.IAMDBAuth.md)。

## 步骤 8：配置 PostgreSQL 客户端


要配置 PostgreSQL 客户端，请采取以下步骤：
+ 创建一个 krb5.conf 文件（或等效的文件）以指向域。
+ 验证流量是否可以在客户端主机和 Amazon Directory Service 之间流动。使用网络实用程序（如 Netcat）执行以下操作：
  + 验证端口 53 上通过 DNS 的流量。
  + 验证端口 53 上通过 TCP/UDP 的流量以及 Kerberos 的流量，包括用于 Amazon Directory Service 的端口 88 和 464。
+ 验证流量是否可以通过数据库端口在客户端主机和数据库实例之间流动。例如，使用 psql 连接和访问数据库。

以下是 Amazon 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.cn = EXAMPLE.COM
 .amazon.com = EXAMPLE.COM
```

# 在 Active Directory 域中管理 RDS for PostgreSQL 数据库实例


可以使用控制台、CLI 或 RDS API 来管理数据库实例及其与 Microsoft Active Directory 的关系。例如，您可以关联 Active Directory 以启用 Kerberos 身份验证。您也可以删除 Active Directory 关联以禁用 Kerberos 身份验证。您也可以将由一个 Microsoft Active Directory 在外部进行身份验证的数据库实例移动到另一个 Active Directory。

例如，使用 CLI，您可以执行下列操作：
+ 要再次尝试为失败的成员启用 Kerberos 身份验证，请使用 [modify-db-instance](https://docs.amazonaws.cn/cli/latest/reference/rds/modify-db-instance.html) CLI 命令。为 `--domain` 选项指定当前成员的目录 ID。
+ 要在数据库实例上禁用 Kerberos 身份验证，请使用 [modify-db-instance](https://docs.amazonaws.cn/cli/latest/reference/rds/modify-db-instance.html) CLI 命令。为 `none` 选项指定 `--domain`。
+ 要将数据库实例从一个域移动到另一个域，请使用 [modify-db-instance](https://docs.amazonaws.cn/cli/latest/reference/rds/modify-db-instance.html) CLI 命令。为 `--domain` 选项指定新域的域标识符。

## 了解域成员资格
了解域成员资格

在创建或修改数据库实例后，它将成为域的成员。您可以在控制台中查看域成员身份状态，也可以通过运行 [describe-db-instances](https://docs.amazonaws.cn/cli/latest/reference/rds/describe-db-instances.html) CLI 命令来查看。数据库实例的状态可以是以下状态之一：
+ `kerberos-enabled` – 数据库实例已启用 Kerberos 身份验证。
+ `enabling-kerberos` – Amazon是在此数据库实例上启用 Kerberos 身份验证的过程。
+ `pending-enable-kerberos` – 启用 Kerberos 身份验证正在此数据库实例上等待处理。
+ `pending-maintenance-enable-kerberos` – Amazon将尝试在下一个计划的维护时段在数据库实例上启用 Kerberos 身份验证。
+ `pending-disable-kerberos` – 禁用 Kerberos 身份验证正在此数据库实例上等待处理。
+ `pending-maintenance-disable-kerberos` – Amazon 将尝试在下一个计划的维护时段在数据库实例上禁用 Kerberos 身份验证。
+ `enable-kerberos-failed` – 出现一个配置问题，导致 Amazon 无法在数据库实例上启用 Kerberos 身份验证。在重新发出命令以修改数据库实例之前纠正配置问题。
+ `disabling-kerberos` – Amazon是在此数据库实例上启用 Kerberos 身份验证的过程。

启用 Kerberos 身份验证的请求可能因网络连接问题或不正确的 IAM 角色而失败。在某些情况下，在创建或修改数据库实例时，尝试启用 Kerberos 身份验证可能会失败。如果是这样，请确保使用正确的 IAM 角色，然后修改数据库实例以加入域。

**注意**  
仅针对 RDS for PostgreSQL 的 Kerberos 身份验证将流量发送到域的 DNS 服务器。在运行 PostgreSQL 的数据库实例上，所有其他 DNS 请求将被视为出站网络访问。有关使用 RDS for PostgreSQL 进行出站网络访问的更多信息，请参阅 [将自定义 DNS 服务器用于出站网络访问](Appendix.PostgreSQL.CommonDBATasks.CustomDNS.md)。

# 使用 Kerberos 身份验证连接到 PostgreSQL
使用 Kerberos 身份验证连接

您可以使用 pgAdmin 界面或命令行界面（如 psql）通过 Kerberos 身份验证连接到 PostgreSQL。有关连接的更多信息，请参阅 [连接到运行 PostgreSQL 数据库引擎的数据库实例](USER_ConnectToPostgreSQLInstance.md) 。有关获取连接所需的端点、端口号和其他详细信息的信息，请参阅。[连接到 PostgreSQL 数据库实例](CHAP_GettingStarted.CreatingConnecting.PostgreSQL.md#CHAP_GettingStarted.Connecting.PostgreSQL)

**注意**  
PostgreSQL 中的 GSSAPI 身份验证和加密由 Kerberos 库 `libkrb5.so` 实施。`postgres_fdw` 和 `dblink` 等功能也依赖于同一个库，以通过 Kerberos 身份验证或加密进行出站连接。

## pgAdmin


要使用 pgAdmin 通过 Kerberos 身份验证连接到 PostgreSQL，请执行以下步骤：

1. 在您的客户端计算机上启动 pgAdmin 应用程序。

1. 在 **Dashboard** (控制面板) 选项卡上，选择 **Add New Server** (添加新服务器)。

1. 在 **Create - Server (创建 - 服务器)** 对话框中，在 **General (常规)** 选项卡上键入名称以在 pgAdmin 中标识该服务器。

1. 在 **Connection (连接)** 选项卡上，键入您的 RDS for PostgreSQL 数据库的以下信息。
   + 对于 **Host**（主机），输入 RDS for PostgreSQL 数据库实例的端点。端点看起来类似于以下所示：

     ```
     RDS-DB-instance.111122223333.aws-region.rds.amazonaws.com
     ```

     要从 Windows 客户端连接到本地 Microsoft Active Directory，请使用 Amazon Managed Active Directory 的域名，而不是主机端点中的 `rds.amazonaws.com`。例如，假设 Amazon Managed Active Directory 的域名为 `corp.example.com`。然后，对于 **Host**（主机），按如下方式指定端点：

     ```
     RDS-DB-instance.111122223333.aws-region.corp.example.com
     ```
   + 对于 **Port (端口)**，输入分配的端口。
   + 对于 **Maintenance database (维护数据库)**，输入客户端将连接到的初始数据库的名称。
   + 对于**用户名**，键入您在 [步骤 7：为您的 Kerberos 主体创建 PostgreSQL 用户](postgresql-kerberos-setting-up.md#postgresql-kerberos-setting-up.create-logins) 中为 Kerberos 身份验证输入的用户名。

1. 选择 **Save**。

## psql


要使用 psql 通过 Kerberos 身份验证连接到 PostgreSQL，请执行以下步骤：

1. 在命令提示符处，运行以下命令。

   ```
   kinit username                
   ```

   将 *`username`* 替换为用户名。在提示符下，输入在 Microsoft Active Directory 中为用户存储的密码。

1. 如果 PostgreSQL 数据库实例使用可公开访问的 VPC，请将数据库实例端点的 IP 地址放在 EC2 客户端上的 `/etc/hosts` 文件中。例如，以下命令获取 IP 地址，然后将其放在 `/etc/hosts` 文件中。

   ```
   % dig +short PostgreSQL-endpoint.Amazon-Region.rds.amazonaws.com  
   ;; Truncated, retrying in TCP mode.
   ec2-34-210-197-118.Amazon-Region.compute.amazonaws.com.
   34.210.197.118 
   
   % echo " 34.210.197.118  PostgreSQL-endpoint.Amazon-Region.rds.amazonaws.com" >> /etc/hosts
   ```

   如果您从 Windows 客户端使用本地 Microsoft Active Directory，则需要使用特殊终端节点进行连接。在主机终端节点中使用 `rds.amazonaws.com` Managed Active Directory 的域名，而不是 Amazon 域 Amazon。

   例如，假设 Amazon Managed Active Directory 的域名为 `corp.example.com`。为终端节点使用格式 `PostgreSQL-endpoint.Amazon-Region.corp.example.com`，将其放入 `/etc/hosts` 文件。

   ```
   % echo " 34.210.197.118  PostgreSQL-endpoint.Amazon-Region.corp.example.com" >> /etc/hosts
   ```

1. 使用以下 psql 命令登录到与 Active Directory 集成的 PostgreSQL 数据库实例。

   ```
   psql -U username@CORP.EXAMPLE.COM -p 5432 -h PostgreSQL-endpoint.Amazon-Region.rds.amazonaws.com postgres
   ```

   要从 Windows 客户端使用本地 Active Directory 登录 PostgreSQL 数据库集群，请使用以下 psql 命令以及上一步中的域名 (`corp.example.com`)：

   ```
   psql -U username@CORP.EXAMPLE.COM -p 5432 -h PostgreSQL-endpoint.Amazon-Region.corp.example.com postgres
   ```