我有 Amazon Relational Database Service (Amazon RDS) for PostgreSQL 或 Amazon Aurora PostgreSQL 相容版本資料庫執行個體。我想使用 AWS Identity and Access Management (IAM) 身分驗證連線我的執行個體。
簡短描述
IAM 資料庫身分驗證比原生身分驗證方法更安全,原因如下:
- IAM 使用 AWS 存取金鑰來產生資料庫身分驗證權杖。您無需儲存資料庫使用者憑證。
- 身分驗證權杖的生命週期為 15 分鐘,因此您無需強制執行密碼重設。
- IAM 資料庫身分驗證需要使用 SSL 連線。這會加密您傳入和傳出 Amazon RDS 資料庫執行個體的所有資料。
- 如果您的應用程式執行於 Amazon Elastic Compute Cloud (Amazon EC2),您可以利用 Amazon EC2 執行個體設定檔來存取資料庫。您不需要在您的執行個體儲存資料庫密碼。
若要利用 IAM 角色設定 IAM 資料庫身分驗證,請依照下列步驟執行:
- 在 RDS 資料庫執行個體啟用 IAM 資料庫身分驗證。
- 建立 IAM 使用者並附加 IAM 原則,將資料庫使用者對應 IAM 角色。
- 將 IAM 角色附加到 EC2 執行個體。
- 產生 AWS 身分驗證權杖以識別 IAM 角色。
- 下載 SSL 根憑證檔案或憑證套件檔案。
- 若要連線 RDS 資料庫執行個體,請使用 IAM 角色憑證和身分驗證權杖或 SSL 憑證。
如果您執行 MySQL,請參閱如何允許使用者利用其 IAM 憑證對 Amazon RDS MySQL 資料庫執行個體進行身分驗證?
解決方案
開始之前,請完成下列先決條件:
- 啟動支援 IAM 資料庫身分驗證的 Amazon RDS for PostgreSQL 資料庫執行個體或 Aurora PostgreSQL 相容叢集
- 啟動 EC2 執行個體來連線資料庫
如需詳細資訊,請參閱 Aurora 的 IAM 資料庫身分驗證和 Amazon RDS 的 IAM 資料庫身分驗證。
若要連線 RDS 資料庫執行個體或 Aurora PostgreSQL 相容資料庫叢集,請使用 PostgreSQL 的 IAM 資料庫身分驗證:
-
在 RDS 資料庫執行個體或 Aurora 叢集上啟用 IAM 身分驗證。
-
建立 IAM 使用者,並附加下列原則:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"rds-db:connect"
],
"Resource": [
"arn:aws:rds-db:REGION:ACCOUNT:dbuser:RESOURCE_ID/iamuser"
]
}
]
}
注意: 利用 IAM 使用者取代 iamuser。
-
利用主要使用者登入 Amazon RDS for PostgreSQL 資料庫執行個體或 Aurora PostgreSQL 相容叢集:
psql
psql -h {database or cluster endpoint} -U {Master username} -d {database name}
pgAdmin
從 pgAdmin 導覽窗格選擇伺服器。然後,選擇伺服器名稱並輸入主要使用者密碼。
-
建立與 IAM 使用者具有相同名稱的子使用者:
CREATE USER iamuser WITH LOGIN;
GRANT rds_iam TO iamuser;
-
利用您建立的使用者名稱執行 generate-db-auth-token。這會建立臨時密碼,以供您在稍後步驟使用:
[ec2-user@ip-172-31-24-237 ~]$ export RDSHOST="aurorapg-ssl.cluster-XXXXXXXXXXX.us-west-2.rds.amazonaws.com"
[ec2-user@ip-172-31-24-237 ~]$ export PGPASSWORD="$(aws rds generate-db-auth-token --hostname $RDSHOST --port 5432 --region us-west-2 --username iamuser)"
[ec2-user@ip-172-31-24-237 ~]$ echo $PGPASSWORD
aurorapg-ssl.cluster-XXXXXXX.us-west-2.rds.amazonaws.com:5432/?Action=connect&DBUser=iamuser&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Expires=900&X-Amz-Credential=AKIA2O5GXNVDTAMABZFE%2F20190909%2Fus-west-2%2Frds-db%2Faws4_request&X-Amz-SignedHeaders=host&X-Amz-Date=20190909T171907Z&X-Amz-Signature=ead28003477c3082e5a17529ac8316db4f4bdf2fa8f79d3aaea806e9bafa2673
[ec2-user@ip-172-31-24-237 ~]$
-
若要在 pgAdmin 建立新的伺服器連線,請選擇一般索引標籤並清除立即連接方塊。在連線索引標籤輸入主機名稱、連接埠和使用者名稱,但無需輸入密碼。在 SSL 索引標籤將 SSL 模式設定為需要並儲存伺服器連線。
-
(選擇性) 在 SSL 索引標籤,您可以將 SSL 模式變更為 verify-full。根據選取的 SSL 模式輸入憑證的路徑。若要下載路徑,請執行下列命令:
wget https://s3.amazonaws.com/rds-downloads/rds-ca-2019-root.pem
注意: 2015 年根憑證已於 2020 年到期。若要移至 2019 年根憑證,請參閱輪換 SSL/TLS 憑證。
如果您的應用程式不接受憑證鏈,請下載包含舊根憑證和新根憑證的憑證套件:
$ wget https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem
-
建立伺服器之後,請連線伺服器。在出現提示時,輸入 generate-db-auth-token 為使用者 iamuser 產生的臨時權杖。
對於 psql,請執行以下命令進行連線。本範例利用您在產生權杖時設定的環境變數 $PGPASSWORD。此變數會啟動連線:
psql -h aurorapg-ssl.cfkx5hi8csxj.us-west-2.rds.amazonaws.com -p 5432 "sslmode=verify-full sslrootcert=rds-ca-2019-root.pem dbname=aurora_pg_ssl user=iamuser"
注意: 於產生權杖後,每個權杖的生命週期為 15 分鐘。如果您嘗試利用相同權杖重新建立連線,則連線會失敗。您必須產生新的權杖。
如果仍然收到類似於使用者的 PAM 身分驗證失敗等錯誤,請檢查 AWS 帳戶是否屬於 AWS Organizations 組織。如果帳戶屬於某個組織,請將 rds-db:* 加入帳戶所屬組織的服務控制原則 (SCP)。此外,請檢查 IAM 使用者或角色的階層是否不具備 rds-db 許可。如需詳細資訊,請參閱如何利用服務控制原則設定 AWS Organization 跨帳戶權限防護機制。
相關資訊
透過 Aurora PostgreSQL 相容性使用 IAM 身分驗證