

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 為 PostgreSQL 資料庫執行個體設定 Kerberos 身分驗證
<a name="postgresql-kerberos-setting-up"></a>

您可以使用 AWS Directory Service for Microsoft Active Directory (AWS Managed Microsoft AD) 來設定 PostgreSQL 資料庫執行個體的 Kerberos 身分驗證。若要設定 Kerberos 身分驗證，請遵循下列步驟。

**Topics**
+ [步驟 1：使用 建立目錄 AWS Managed Microsoft AD](#postgresql-kerberos-setting-up.create-directory)
+ [步驟 2：（選用） 在內部部署 Active Directory 與 之間建立信任關係 Directory Service](#postgresql-kerberos-setting-up.create-trust)
+ [步驟 3：為 Amazon RDS 建立 IAM 角色以存取 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：使用 建立目錄 AWS Managed Microsoft AD
<a name="postgresql-kerberos-setting-up.create-directory"></a>

Directory Service 在 AWS 雲端中建立全受管 Active Directory。當您建立 AWS Managed Microsoft AD 目錄時， 會為您 Directory Service 建立兩個網域控制站和 DNS 伺服器。目錄伺服器是在 VPC 的不同子網路中建立。此備援有助於確保即使發生故障，您仍然可以存取目錄。

 當您建立 AWS Managed Microsoft AD 目錄時， AWS Directory Service 會代表您執行下列任務：
+ 在 VPC 內設定 Active Directory。
+ 建立含有使用者名稱 `Admin` 與指定密碼的目錄管理員帳戶。您可以使用此帳戶來管理目錄。
**重要**  
請務必儲存此密碼。 Directory Service 不會儲存此密碼，而且無法擷取或重設。
+ 建立目錄控制器的安全群組。安全群組必須允許與 PostgreSQL 資料庫執行個體進行通訊。

啟動時 AWS Directory Service for Microsoft Active Directory， 會 AWS 建立組織單位 (OU)，其中包含目錄的所有物件。此 OU 有您在建立目錄時所輸入的 NetBIOS 名稱，位於根網域中。網域根由 擁有和管理 AWS。

 使用 AWS Managed Microsoft AD 目錄建立`Admin`的帳戶具有 OU 最常見管理活動的許可：
+ 建立、更新或刪除使用者
+ 將資源 (例如檔案或列印伺服器) 新增至您的網域，然後對您 OU 中的使用者指派這些資源的許可 
+ 建立額外的 OU 和容器 
+ 委派授權 
+ 從 Active Directory 資源回收筒還原已刪除的物件 
+ 在 Active Directory Web 服務上執行適用於 Windows PowerShell 的 Active Directory 和網域名稱服務 (DNS) 模組 

`Admin` 帳戶也有權執行下列全網域活動：
+ 管理 DNS 組態 (新增、移除或更新記錄、區域和轉寄站) 
+ 檢視 DNS 事件日誌 
+ 檢視安全事件日誌 

**使用 建立目錄 AWS Managed Microsoft AD**

1.  在 [Directory Service 主控台](https://console.aws.amazon.com/directoryservicev2/)中，選擇 **Directories (目錄)**，然後選擇 **Set up directory (設定目錄)**。

1. 選擇 **AWS Managed Microsoft AD**. AWS Managed Microsoft AD 是目前支援與 Amazon RDS 搭配使用的唯一選項。

1. 選擇**下一步**。

1. 在 **Enter directory information (輸入目錄資訊)** 頁面上，提供下列資訊：  
**版本**  
 選擇滿足您需求的版本。  
**目錄 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[]:;"'<>,.?/)   
**Confirm password (確認密碼)**  
 重新輸入管理員密碼。  
請確定您儲存此密碼。 Directory Service 不會儲存此密碼，而且無法擷取或重設。

1. 選擇**下一步**。

1. 在 **Choose VPC and subnets (選擇 VPC 和子網路)** 頁面上，提供下列資訊：  
**VPC**  
選擇目錄的 VPC。您可在此相同 VPC 或不同 VPC 中建立 PostgreSQL 資料庫執行個體。  
**子網路**  
 選擇目錄伺服器的子網路。這兩個子網路必須位於不同的可用區域。

1. 選擇 **Next (下一步)**。

1.  檢閱目錄資訊。如果需要變更，請選擇 **Previous (上一步)**，然後進行變更。若資訊無誤，請選擇 **Create directory (建立目錄)**。  
![\[目錄詳細資訊頁面\]](http://docs.aws.amazon.com/zh_tw/AmazonRDS/latest/UserGuide/images/WinAuth2.png)

 建立目錄需要幾分鐘的時間。成功建立時，**Status (狀態)** 值會變更為 **Active (作用中)**。

 若要查看目錄的資訊，請選擇目錄清單中的目錄 ID。請記下 **Directory ID (目錄 ID)** 值，建立或修改 PostgreSQL 資料庫執行個體時需要此值。

![\[詳細資訊頁面的影像\]](http://docs.aws.amazon.com/zh_tw/AmazonRDS/latest/UserGuide/images/WinAuth3.png)


## 步驟 2：（選用） 在內部部署 Active Directory 與 之間建立信任關係 Directory Service
<a name="postgresql-kerberos-setting-up.create-trust"></a>

如果您不打算使用自己的內部部署 Microsoft Active Directory，請跳至[步驟 3：為 Amazon RDS 建立 IAM 角色以存取 Directory Service](#postgresql-kerberos-setting-up.CreateIAMRole).

若要使用現場部署 Active Directory 取得 Kerberos 身分驗證，您需要使用現場部署 Microsoft Active Directory 與 AWS Managed Microsoft AD 目錄 （在 中建立） 之間的樹系信任來建立信任網域關係[步驟 1：使用 建立目錄 AWS Managed Microsoft AD](#postgresql-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 用戶端會使用端點 Directory Service 中 的網域名稱進行連線，而不是使用 rds.amazonaws.com。如需詳細資訊，請參閱 [使用 Kerberos 身分驗證連線至 PostgreSQL](postgresql-kerberos-connecting.md)。

請確定您的內部部署 Microsoft Active Directory 網域名稱包含對應至新建立之信任關係的 DNS 尾碼路由。以下螢幕擷取畫面顯示了一個範例。

![\[DNS 路由對應至建立的信任\]](http://docs.aws.amazon.com/zh_tw/AmazonRDS/latest/UserGuide/images/kerberos-auth-trust.png)


## 步驟 3：為 Amazon RDS 建立 IAM 角色以存取 Directory Service
<a name="postgresql-kerberos-setting-up.CreateIAMRole"></a>

若要讓 Amazon RDS Directory Service 為您呼叫 ， AWS 您的帳戶需要使用 受管 IAM 政策 的 IAM 角色`AmazonRDSDirectoryServiceAccess`。此角色允許 Amazon RDS 呼叫 Directory Service。

當您使用 建立資料庫執行個體， AWS 管理主控台 且主控台使用者帳戶具有 `iam:CreateRole`許可時，主控台會自動建立所需的 IAM 角色。在此情況下，角色名稱為 `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)。

**注意**  
用於 Windows Authentication for RDS for Microsoft SQL Server 的 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": "*"
    }
  ]
}
```

------

對於選擇加入 AWS 區域，請在 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：建立和設定使用者
<a name="postgresql-kerberos-setting-up.create-users"></a>

 您可以透過使用 Active Directory 使用者和運算集區來建立使用者。這是 Active Directory Domain Services 和 Active Directory 輕量型目錄服務工具之一。如需詳細資訊，請參閱 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)。在此情況下，使用者是個人或其他實體，例如其電腦屬於網域，而其身分在目錄中維護。

若要在 Directory Service 目錄中建立使用者，您必須連線到做為 Directory Service 目錄成員的 Windows 型 Amazon EC2 執行個體。同時，您必須以具有建立使用者之許可的使用者身分來登入。如需詳細資訊，請參閱《AWS Directory Service 管理指南》**中的[建立使用者](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_manage_users_groups_create_user.html)。

## 步驟 5：啟用目錄和資料庫執行個體之間的跨 VPC 流量
<a name="postgresql-kerberos-setting-up.vpc-peering"></a>

如果您打算在相同 VPC 中尋找目錄和資料庫執行個體，請略過本步驟，並移至[步驟 6：建立或修改 PostgreSQL 資料庫執行個體](#postgresql-kerberos-setting-up.create-modify)。

如果您打算在不同 VPC 中尋找目錄和資料庫執行個體，請使用 VPC 互連或 [AWS Transit Gateway](https://docs.aws.amazon.com/vpc/latest/tgw/what-is-transit-gateway.html) 來設定跨 VPC 流量。

下列程序會使用 VPC 互連來啟用 VPC 之間的流量。請遵循《Amazon Virtual Private Cloud 互連指南》**中[什麼是 VPC 互連？](https://docs.aws.amazon.com/vpc/latest/peering/Welcome.html)的指示。

**使用 VPC 互連以啟用跨 VPC 流量**

1. 設定適當的 VPC 路由規則，以確保網路流量可以雙向對流。

1. 確保資料庫執行個體安全群組可以從目錄的安全群組接收傳入流量。

1. 確保沒有網路存取控制清單 (ACL) 規則來封鎖流量。

如果不同的 AWS 帳戶擁有該目錄，您必須共用該目錄。

**在 AWS 帳戶之間共用目錄**

1. 遵循《 *Directory Service 管理指南*》中的教學課程：共用 Managed Microsoft AD AWS 目錄以實現無縫 EC2 網域加入，開始與將在其中建立資料庫執行個體的帳戶共用目錄。 [AWS EC2 ](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_tutorial_directory_sharing.html) 

1. 使用資料庫執行個體的帳戶登入 Directory Service 主控台，並確保網域具有 `SHARED` 狀態，然後再繼續。

1. 使用資料庫執行個體的帳戶登入 Directory Service 主控台時，請注意**目錄 ID** 值。您可以使用此目錄 ID，將資料庫執行個體加入網域。

## 步驟 6：建立或修改 PostgreSQL 資料庫執行個體
<a name="postgresql-kerberos-setting-up.create-modify"></a>

建立或修改要搭配目錄使用的 PostgreSQL 資料庫執行個體。您可以使用主控台、CLI 或 RDS API，將資料庫執行個體與目錄建立關聯。您可採用下列其中一種方式來這麼做：
+  使用主控台、[create-db-instance](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-instance.html) CLI 命令，或 [CreateDBInstance](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBInstance.html) RDS API 操作，建立新的 PostgreSQL 資料庫執行個體。如需說明，請參閱「[建立 Amazon RDS 資料庫執行個體](USER_CreateDBInstance.md)」。
+  使用主控台、[modify-db-instance](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-instance.html) CLI 命令，或 [ModifyDBInstance](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBInstance.html) RDS API 操作，修改現有的 PostgreSQL 資料庫執行個體。如需說明，請參閱「[修改 Amazon RDS 資料庫執行個體](Overview.DBInstance.Modifying.md)」。
+  使用主控台、[restore-db-instance-from-db-snapshot](https://docs.aws.amazon.com/cli/latest/reference/rds/restore-db-instance-from-db-snapshot.html) CLI 命令，或 [RestoreDBInstanceFromDBSnapshot](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_RestoreDBInstanceFromDBSnapshot.html) RDS API 操作，從資料庫快照還原 PostgreSQL 資料庫執行個體。如需說明，請參閱「[還原至資料庫執行個體](USER_RestoreFromSnapshot.md)」。
+  使用主控台、[restore-db-instance-to-point-in-time](https://docs.aws.amazon.com/cli/latest/reference/rds/restore-db-instance-to-point-in-time.html) CLI 命令，或 [RestoreDBInstanceToPointInTime](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_RestoreDBInstanceToPointInTime.html) RDS API 操作，將 PostgreSQL 資料庫執行個體還原至某個時間點。如需說明，請參閱「[將 Amazon RDS 的資料庫執行個體還原至指定時間](USER_PIT.md)」。

僅有 VPC 中的 PostgreSQL 資料庫執行個體支援 Kerberos 身分驗證。資料庫執行個體可在與目錄相同的 VPC 中，或在不同 VPC 中。資料庫執行個體必須使用允許在目錄 VPC 內傳入和傳出的安全群組，如此資料庫執行個體才能與目錄通訊。

### 主控台
<a name="postgresql-kerberos-setting-up.create-modify.Console"></a>

使用主控台建立、修改或還原資料庫執行個體時，請在 **Database authentication** (資料庫身分驗證) 區段中選擇 **Password and Kerberos authentication** (密碼和 Kerberos 身分驗證)。然後選擇 **Browse Directory** (瀏覽目錄)。選取目錄或選擇 **Create a new directory** (建立新目錄) 以使用 Directory Service。

![\[選擇 Kerberos 進行身分驗證並識別要使用的目錄。\]](http://docs.aws.amazon.com/zh_tw/AmazonRDS/latest/UserGuide/images/rpg-authentication-use-kerberos.png)


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

當您使用 時 AWS 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 使用者
<a name="postgresql-kerberos-setting-up.create-logins"></a>

此時，您的 RDS for PostgreSQL 資料庫執行個體已加入 AWS 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 用戶端
<a name="postgresql-kerberos-setting-up.configure-client"></a>

若要設定 PostgreSQL 用戶端，請執行下列步驟：
+ 建立可指向網域的 krb5.conf 檔案 (或同等檔案)。
+ 確認流量可以在用戶端主機與 之間流動 Directory Service。請使用 Netcat 等網路公用程式檢查以下各項：
  + 確認透過 DNS 傳送至連接埠 53 的流量。
  + 確認透過 TCP/UDP 傳送至連接埠 53 和 Kerberos 的流量，其中包括用於 Directory Service的連接埠 88 和 464。
+ 確定流量可透過資料庫連接埠在用戶端主機和資料庫執行個體之間往來。例如，您可以使用 psql 來連接和存取資料庫。

以下是 的範例 krb5 AWS Managed Microsoft AD.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.goskope.com.cn = EXAMPLE.COM
 .amazon.com = EXAMPLE.COM
```