如何對使用 IAM 驗證連線到 Amazon RDS for PostgreSQL 執行個體或 Aurora PostgreSQL 叢集時發生的錯誤進行疑難排解?
當我使用 AWS Identity Access Management (IAM) 驗證連線到 Amazon Relational Database Service (Amazon RDS) for PostgreSQL 執行個體或 Amazon Aurora PostgreSQL 相容版本叢集時發生錯誤。
簡短說明
發生以下情況時,您可能會收到 "PAM authentication failed for user" 錯誤訊息:
- IAM 驗證關閉
- IAM 政策不包含 rds-db:connect 動作
- rds_iam 角色未與資料庫使用者關聯
- 連線不正確
- 使用了不正確的 IAM 角色
解決方法
注意: 如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請務必使用最新版 AWS CLI。
IAM 驗證關閉
預設情況下,IAM 驗證處於關閉狀態。為 Amazon RDS for PostgreSQL 執行個體或 Aurora PostgreSQL 相容叢集開啟 IAM 驗證。
IAM 政策不包含 rds-db:connect 動作
若要使用 IAM 資料庫驗證連線到資料庫執行個體,請更新您的政策以加入 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" ] } ] }
注意: 請務必在政策中使用正確的資源 ID 和 Amazon Resource Name (ARN)。
若要尋找資料庫執行個體的資源 ID,請在 Amazon Aurora 和 RDS 主控台上選取資料庫執行個體或叢集,然後選擇組態索引標籤。如需更多資訊,請參閱建立和使用 IAM 政策以進行 IAM 資料庫存取。
注意: IAM 驗證不支援政策陳述式條件元素中的特定服務或全域條件內容金鑰。
rds_iam 角色未與資料庫使用者關聯
若要搭配 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 ) AS 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;
連線不正確
驗證權杖包含多個在命令列中難以使用的字元。請改為將驗證權杖儲存到環境變數中,然後在連線到 Aurora 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"
當用戶端嘗試在沒有 SSL/TLS 連線的情況下連線到資料庫執行個體時,您會收到下列錯誤訊息:
"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/TLS 連線,因為傳入和傳出資料庫執行個體的所有資料都已加密。為了避免上述錯誤,請確認您使用的是 SSL/TLS 連線。最佳做法是使用 sslmode 選項作為完整驗證,並在連線字串的 sslrootcert 選項中提供憑證。
若要下載最新的憑證認證機構 (CA) 憑證,請參閱使用 SSL/TLS 加密資料庫叢集的連線。
使用了不正確的 IAM 角色
您可能會收到錯誤訊息,因為您使用不正確的 IAM 角色來產生驗證權杖。若要檢查目前 IAM 使用者的擔任角色,請執行 get-caller-identity 命令:
aws sts get-caller-identity
如果擔任角色不正確,可從 IAM 使用者切換到正確的 IAM 角色,或擔任正確的角色。如果您仍收到錯誤訊息,請檢查 AWS 帳戶是否屬於 AWS Organizations 組織。如果帳戶屬於組織,則建立允許 rds-db: 的服務控制政策 (SCP)。如需更多資訊,請參閱 SCP 對許可的影響。
另外,請檢查是否存在不具備 rds-db: 許可的 IAM 使用者階層。如需詳細資訊,請參閱如何使用服務控制政策設定 AWS Organization 中跨帳戶的許可防護機制。
如果您使用 IAM 實體許可界限,則會允許您的 IAM 使用者或角色執行 rds-db:connect 動作。若要修改使用者的許可邊界,請參閱變更使用者的許可界限。
從不同 AWS 帳戶進行連線
如果您從不同的 AWS 帳戶連線到與 Aurora PostgreSQL 相容的叢集,請使用叢集帳戶中的臨時憑證來產生驗證權杖。執行下列 assume-role AWS CLI 命令,以在叢集帳戶中擔任某個角色:
aws sts assume-role \ --role-arn arn:aws:iam::CLUSTER-ACCOUNT-ID:role/ROLE-NAME \ --role-session-name cross-account-session
注意: 請以叢集所在的 AWS 帳戶 ID 取代 CLUSTER-ACCOUNT-ID,並以您的 IAM 角色名稱取代 ROLE-NAME。
然後,匯出臨時憑證並產生身分驗證權杖:
export AWS_ACCESS_KEY_ID=TEMPORARY-ACCESS-KEY export AWS_SECRET_ACCESS_KEY=TEMPORARY-SECRET-KEY export AWS_SESSION_TOKEN=TEMPORARY-SESSION-TOKEN export PGPASSWORD="$(aws rds generate-db-auth-token --hostname CLUSTER-ENDPOINT --port 5432 --region REGION --username DB-USER-NAME)"
注意: 請將 TEMPORARY-ACCESS-KEY、TEMPORARY-SECRET-KEY 及 TEMPORARY-SESSION-TOKEN 取代為 assume-role 輸出結果中的值。請將 CLUSTER-ENDPOINT 取代為您的叢集端點,REGION 取代為您的 AWS 區域,DB-USER-NAME 取代為您的資料庫使用者名稱。
若您直接使用來源帳戶的憑證來產生該權杖,則即使所有 IAM 政策與信任關係皆已正確設定,您仍會收到「密碼驗證失敗」的錯誤訊息。該權杖必須使用與叢集所屬帳戶相同的憑證來產生。

