如何解決使用 IAM 身分驗證解決連線至 Amazon RDS for PostgreSQL 或 Aurora PostgreSQL 叢集時出現的問題?

2 分的閱讀內容
0

我想連線至自己的 Amazon Relational Database Service (Amazon RDS) for PostgreSQL 執行個體或與 Amazon Aurora PostgreSQL 相容的叢集。嘗試使用 AWS Identity Access Management (IAM) 身分驗證進行連線時,我收到「使用者的 PAM 身分驗證失敗」錯誤。

簡短描述

基於下列其中一點原因,您可能無法使用 IAM 身分驗證連線到 Amazon RDS for PostgreSQL 或 Aurora 資料庫執行個體:

  • IAM 身分驗證已關閉
  • IAM 角色許可不足或政策不正確
  • 資料庫使用者設定不正確
  • 連線字串不正確
  • IAM 實體不正確

解決方案

IAM 身分驗證已關閉

依預設,IAM 身分驗證已關閉。檢閱 RDS for PostgreSQL 執行個體或 Aurora PostgreSQL 叢集的組態設定。確定已開啟 IAM 身分驗證。從 Amazon RDS 主控台,您可透過選擇 Database Authentication (資料庫身分驗證) 來修改 Aurora 叢集或 RDS 執行個體。然後,選擇 IAM database authentication (IAM 資料庫身分驗證),並選擇 Continue (繼續) 以更新您的組態設定。

**備註:**在更新叢集組態設定期間選擇 Apply Immediately (立即套用) 時,會立即套用所有待處理的修改。此動作不會導致停機時間。

IAM 角色許可不足

若要使用 IAM 資料庫身分驗證成功連線至您的資料庫執行個體,您必須具有 rds-db:connect 動作的存取權。rds-db:connect 動作允許連線至資料庫執行個體。

例如:

{
    "Version": "2012-10-17",
    "Statement": [
    {
        "Effect": "Allow",
        "Action": [
            "rds-db:connect"
        ],
        "Resource": [
            " arn:aws:rds-db:region:account-id:dbuser:(DbiResourceId for RDS PostgreSQL or DbClusterResourceId for Aurora PostgreSQL)/db_user_name"
        ]
    }]

備註:用與 IAM 身分驗證關聯的資料庫帳戶使用者取代 db-user-name

同樣,請確定您使用正確的資源 ID (而非僅指定 ARN)。若要尋找資料庫執行個體的資源 ID,請在 Amazon RDS 主控台中選擇資料庫執行個體或叢集。然後,選擇 Configuration (組態) 索引標籤,以檢視資源 ID。

如需有關範例 IAM 政策中所列元素的詳細資訊,請參閱建立並使用 IAM 政策以進行 IAM 資料庫存取

備註:IAM 身分驗證不支援可用於政策陳述式條件元素的服務特定內容金鑰。IAM 身分驗證也不支援所有全域條件內容金鑰。如需全域條件內容金鑰的詳細資訊,請參閱 IAM 使用者指南中的 AWS 全域條件內容金鑰

資料庫使用者設定不正確

若要搭配 PostgreSQL 使用 IAM 身分驗證,請將 rds_iam 角色授予資料庫使用者。若要確認此角色與使用者相關聯,請執行下列命令:

**備註:**此命令僅在 PostgreSQL 用戶端中執行。

\du

您的輸出內容應如下所示:

List of roles
   Role name    |                         Attributes                         |                          Member of                          
-----------------+------------------------------------------------------------+-------------------------------------------------------------
db_user_name    |                                                            | {rds_iam}                                
postgres        | Create role, Create DB                                    +| {rds_superuser}          
                | Password valid until infinity                              |

您也可以使用在任何平台上執行的此查詢:

SELECT r.rolname,
ARRAY(SELECT b.rolname
FROM pg_catalog.pg_auth_members m
JOIN pg_catalog.pg_roles b ON (m.roleid = b.oid)
WHERE m.member = r.oid) memberof
FROM pg_catalog.pg_roles r
WHERE r.rolname !~ '^pg_'
ORDER BY 1;

若要建立使用者並授與 rds_iam 角色,請執行下列命令:

CREATE USER db_user_name WITH LOGIN; 
GRANT rds_iam TO db_user_name;

連線字串不正確

身份驗證字符由幾個字元組成,這些字元可能很難在命令列上使用。請將字符儲存至環境變數,然後在連線至 PostgreSQL 資料庫執行個體時使用該變數。

例如:

export RDSHOST='aurorapostgresql.cluster-abcdef12ghi.us-east-1.rds.amazonaws.com'
export PGPASSWORD="$(aws rds generate-db-auth-token --hostname $RDSHOST --port 5432 --region us-east-1 --username db_user_name)"
psql "host=$RDSHOST port=5432 sslmode=verify-full sslrootcert=global-bundle.pem dbname=postgres user=db_user_name password=$PGPASSWORD"

如需有關如何使用環境變數連線至 PostgreSQL 資料庫執行個體的詳細資訊,請參閱連線至 Aurora PostgreSQL 叢集

如果您收到類似於此範例中的錯誤,則用戶端嘗試連線到沒有 SSL 的資料庫執行個體。

FATAL: no pg_hba.conf entry for host "host.ip", user "<username>", database "postgres", SSL off 
FATAL: password authentication failed for user "db_user_name"

IAM 資料庫身分驗證需要 SSL 連線,並且所有傳入資料庫執行個體的資料都會加密。若要避免此錯誤,請確定連線使用 SSL。最佳實務是使用 sslmode 選項作為完整驗證,並在連線字串中的 sslrootcert 選項內提供憑證。

若要下載最新的 CA 憑證,請參閱使用 SSL/TLS 加密與資料庫叢集的連線

IAM 實體不正確

確保身分驗證字符由正確的 IAM 角色生成。若要檢查目前 IAM 使用者擔任的角色,請執行以下命令:

aws sts get-caller-identity

如果擔任的角色不正確,您可以切換到正確的 IAM 使用者/角色,或擔任正確的角色。確保您使用正確的 IAM 角色來生成身分驗證字符。

如果您仍然收到類似「使用者的 PAM 身分驗證失敗」的錯誤訊息,請檢查 AWS 帳戶是否屬於 AWS Organizations 組織。如果帳戶是組織的一部分,則將 rds-db:* 新增至組織的 SCP。如需詳細資訊,請參閱建立、更新和刪除服務控制政策

如果帳戶是組織的一部分,請檢查是否存在沒有 rds-db 許可的 IAM 使用者層次結構。有關更多資訊,請參閱如何使用服務控制政策在 AWS Organizations 中的各個帳戶之間設定許可防護機制

如果您使用 IAM 實體的許可界限,請確保您的 IAM 使用者/角色允許 rds-db:connect 動作。如需有關許可界限的詳細資訊,請參閱 IAM 實體的許可界限。若要修改使用者的許可界限,請參閱變更使用者的許可界限


AWS 官方
AWS 官方已更新 2 年前