當我使用 AWS Identity Access Management (IAM) 驗證連線到 Amazon Relational Database Service (Amazon RDS) for PostgreSQL 執行個體或 Amazon Aurora PostgreSQL 相容版本叢集時發生錯誤。
簡短說明
發生以下情況時,您可能會收到「PAM authentication failed for user」(使用者 PAM 驗證失敗) 錯誤訊息:
- IAM 驗證關閉
- IAM 政策不包含 rds-db:connection 動作
- 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 RDS 主控台上選取資料庫執行個體或叢集,然後選擇 Configuration (組態) 索引標籤。如需詳細資訊,請參閱針對 IAM 資料庫存取建立和使用 IAM 政策。
注意: IAM 驗證不支援政策陳述式條件元素中的特定服務或全域條件前後關聯金鑰。
rds_iam 角色未與資料庫使用者關聯
若要搭配 PostgreSQL 使用 IAM 驗證,資料庫使用者必須擔任 rds_iam 角色。若要確認此角色是否與使用者關聯,請在 PostgreSQL 用戶端中執行下列命令:
\du
以下是預期的輸出:
List of rolesRole 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 動作。若要修改使用者的許可邊界,請參閱變更使用者的許可界限。