為 PostgreSQL 資料庫執行個體設定 Kerberos 身分驗證 - Amazon Relational Database Service

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

為 PostgreSQL 資料庫執行個體設定 Kerberos 身分驗證

若要設定 Kerberos 身分驗證,請遵循下列步驟。

第 1 步:使用創建一個目錄 AWS Managed Microsoft AD

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

當您建立 AWS Managed Microsoft AD 目錄時,Direc AWS tory Service 會代表您執行下列工作:

  • 在 VPC 內設定 Active Directory。

  • 建立含有使用者名稱 Admin 與指定密碼的目錄管理員帳戶。您可以使用此帳戶來管理目錄。

    重要

    請務必儲存此密碼。 AWS 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 資源回收筒還原已刪除的物件

  • PowerShell 在活動目錄 Web 服務上運行 Windows 的活動目錄和域名服務(DNS)模塊

Admin 帳戶也有權執行下列全網域活動:

  • 管理 DNS 組態 (新增、移除或更新記錄、區域和轉寄站)

  • 檢視 DNS 事件日誌

  • 檢視安全事件日誌

若要建立目錄 AWS Managed Microsoft AD
  1. AWS Directory Service 主控台中,選擇 Directories (目錄),然後選擇 Set up directory (設定目錄)

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

  3. 選擇 Next (下一步)

  4. Enter directory information (輸入目錄資訊) 頁面上,提供下列資訊:

    版本

    選擇滿足您需求的版本。

    目錄 DNS 名稱

    目錄的完全合格名稱,例如 corp.example.com

    目錄 NetBIOS 名稱

    目錄的簡短名稱,例如:CORP

    目錄描述

    選擇填寫其他目錄說明。

    管理員密碼

    目錄管理員的密碼。目錄建立程序會建立含有使用者名稱 Admin 與這組密碼的管理者帳戶。

    目錄管理員密碼不得包含 "admin" 字組。密碼區分大小寫,長度須為 8 至 64 個字元。至少須有一位字元屬於以下四種類型中的三類:

    • 小寫字母 (a–z)

    • 大寫字母 (A–Z)

    • 數字 (0–9)

    • 非英數字元 (~!@#$%^&*_-+=`|\(){}[]:;"'<>,.?/)

    Confirm password (確認密碼)

    重新輸入管理員密碼。

    重要

    請確定您已儲存此密碼。 AWS Directory Service 不會儲存此密碼,也無法擷取或重設密碼。

  5. 選擇 Next (下一步)

  6. Choose VPC and subnets (選擇 VPC 和子網路) 頁面上,提供下列資訊:

    VPC

    選擇目錄的 VPC。您可在此相同 VPC 或不同 VPC 中建立 PostgreSQL 資料庫執行個體

    子網路

    選擇目錄伺服器的子網路。這兩個子網路必須位於不同的可用區域。

  7. 選擇 Next (下一步)

  8. 檢閱目錄資訊。如果需要變更,請選擇 Previous (上一步),然後進行變更。若資訊無誤,請選擇 Create directory (建立目錄)

    目錄詳細資訊頁面

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

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

詳細資訊頁面的影像

步驟 2:(選擇性) 建立內部部署作用中目錄之間的信任關係, AWS Directory Service

如果您不打算使用自己的內部部署 Microsoft Active Directory,請跳至步驟 3:為 RDS 創建 IAM 角色以訪問 AWS Directory Service.

若要使用內部部署 Active Directory 取得 Kerberos 驗證,您必須使用內部部署 Microsoft Active Directory 與目 AWS Managed Microsoft AD 錄 (在中建立) 之間使用樹系信任來建立信任網域關係。第 1 步:使用創建一個目錄 AWS Managed Microsoft AD信任可以是單向的,其中 AWS Managed Microsoft AD 目錄信任內部部署 Microsoft 活動目錄。信任也可以是雙向,其中兩個 Active Directory 互相信任。如需有關使用設定信任的詳細資訊 AWS Directory Service,請參閱《AWS Directory Service 管理指南》中的建立信任關係的時機。

注意

如果您使用內部部署的 Microsoft 活動目錄,Windows 用戶端會使用的網域名稱在端點 AWS Directory Service 中連線,而不是 rds.amazonaws.com。如需進一步了解,請參閱使用 Kerberos 身分驗證連線至 PostgreSQL

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

DNS 路由對應至建立的信任

步驟 3:為 RDS 創建 IAM 角色以訪問 AWS Directory Service

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

當您使用建立資料庫執行個體, AWS Management Console 且主控台使用者帳戶具有iam:CreateRole權限時,主控台會自動建立所需的 IAM 角色。在此情況下,角色名稱為 rds-directoryservice-kerberos-access-role。否則,您必須手動建立 IAM 角色。建立此 IAM 角色時Directory Service,請選擇 AWS 受管政策並將其附加AmazonRDSDirectoryServiceAccess到該角色。

如需為服務建立 IAM 角色的詳細資訊,請參閱《IAM 使用者指南》中的建立角色以將許可委派給 AWS 服務

注意

用於 Windows Authentication for RDS for Microsoft SQL Server 的 IAM 角色不可用於 Amazon RDS for PostgreSQL

作為使用 AmazonRDSDirectoryServiceAccess 受管政策的替代方案,您可以建立具有必要許可的政策。在此情況下,IAM 角色必須有以下 IAM 信任政策。

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

此角色也須具有下列 IAM 角色政策:

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

步驟 4:建立和設定使用者

您可以透過使用 Active Directory 使用者和運算集區來建立使用者。這是 Active Directory Domain Services 和 Active Directory 輕量型目錄服務工具之一。如需詳細資訊,請參閱 Microsoft 文件中的將使用者和電腦新增至 Active Directory 網域。在此情況下,使用者是個人或其他實體,例如其電腦屬於網域,而其身分在目錄中維護。

若要在 AWS Directory Service 目錄中建立使用者,您必須連線至作為 AWS Directory Service 目錄成員的 Windows Amazon EC2 執行個體。同時,您必須以具有建立使用者之許可的使用者身分來登入。如需詳細資訊,請參閱《AWS Directory Service 管理指南》中的建立使用者

步驟 5:啟用目錄和資料庫執行個體之間的跨 VPC 流量

如果您打算在相同 VPC 中尋找目錄和資料庫執行個體,請略過本步驟,並移至 步驟 6:建立或修改 PostgreSQL 資料庫執行個體

如果您打算在不同 VPC 中尋找目錄和資料庫執行個體,請使用 VPC 互連或 AWS Transit Gateway 來設定跨 VPC 流量。

下列程序會使用 VPC 互連來啟用 VPC 之間的流量。請遵循《Amazon Virtual Private Cloud 互連指南》什麼是 VPC 互連?的指示。

使用 VPC 互連以啟用跨 VPC 流量
  1. 設定適當的 VPC 路由規則,以確保網路流量可以雙向對流。

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

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

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

在 AWS 帳戶之間共用目錄
  1. 按照AWS Directory Service 《管理指南》中的教學課程:共用 AWS 受管 Microsoft AD 目錄以進行無縫 EC2 網域加入中的指示,開始與將在其中建立資料庫執行個體的 AWS 帳戶共用目錄

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

  3. 使用資料庫執行個體的帳戶登入 AWS Directory Service 主控台時,請記下目錄 ID 值。您可以使用此目錄 ID,將資料庫執行個體加入網域。

步驟 6:建立或修改 PostgreSQL 資料庫執行個體

建立或修改要搭配目錄使用的 PostgreSQL 資料庫執行個體。您可以使用主控台、CLI 或 RDS API,將資料庫執行個體與目錄建立關聯。您可採用下列其中一種方式來這麼做:

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

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

選擇 Kerberos 進行身分驗證並識別要使用的目錄。

使用時 AWS CLI,資料庫執行個體需要下列參數才能使用您建立的目錄:

  • 針對 --domain 參數,使用您建立目錄時產生的網域識別符 ("d-*" 識別符)。

  • 針對 --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 資料庫執行個體已加入 AWS Managed Microsoft AD 網域中。您在 步驟 4:建立和設定使用者 的目錄中建立的使用者必須設定為 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
  2. 針對您想要其有權存取資料庫之每個 Kerberos 主體建立資料庫使用者名稱 (Active Directory 使用者名稱)。針對該使用者名稱使用 Active Directory 執行個體中定義的標準使用者名稱 (身分) (亦即小寫 alias (Active Directory 中的使用者名稱)),以及 Active Directory 網域的大寫名稱。Active Directory 使用者名稱是經過外部驗證的使用者,因此請使用引號括住名稱,如下所示。

    postgres=> CREATE USER "username@CORP.EXAMPLE.COM" WITH LOGIN; CREATE ROLE
  3. 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 資料庫身分驗證

步驟 8:設定 PostgreSQL 用戶端

若要設定 PostgreSQL 用戶端,請執行下列步驟:

  • 建立可指向網域的 krb5.conf 檔案 (或同等檔案)。

  • 確認流量可以在用戶端主機和之間流動 AWS Directory Service。請使用 Netcat 等網路公用程式檢查以下各項:

    • 確認透過 DNS 傳送至連接埠 53 的流量。

    • 確認透過 TCP/UDP 傳送至連接埠 53 和 Kerberos 的流量,其中包括用於 AWS Directory Service的連接埠 88 和 464。

  • 確定流量可透過資料庫連接埠在用戶端主機和資料庫執行個體之間往來。例如,您可以使用 psql 來連接和存取資料庫。

以下是的範例內容。 AWS Managed Microsoft AD

[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