跳至內容

如何對使用 IAM 驗證連線到 Amazon RDS for PostgreSQL 執行個體或 Aurora PostgreSQL 叢集時發生的錯誤進行疑難排解?

3 分的閱讀內容
0

當我使用 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 政策與信任關係皆已正確設定,您仍會收到「密碼驗證失敗」的錯誤訊息。該權杖必須使用與叢集所屬帳戶相同的憑證來產生。

相關資訊

Aurora 的 IAM 資料庫驗證

使用 IAM 驗證連線到資料庫叢集

變更使用者的許可界限

AWS 官方已更新 1 年前