PostgreSQL 用の Amazon Relational Database Service (Amazon RDS) または Amazon Aurora PostgreSQL 互換エディション DB インスタンスを使用しています。そのインスタンスに、AWS Identity and Access Management (IAM) 認証を使用して接続したいと考えています。
簡単な説明
IAM データベース認証は、ネイティブな認証方法よりも安全です。詳細については、「MariaDB、MySQL、PostgreSQL での IAM データベース認証」を参照してください。
IAM ロールを使用して IAM データベース認証を設定するには、次の手順を実行します。
- RDS DB インスタンスで IAM DB 認証を有効にします。
- IAM ユーザーを作成した後、データベースユーザーを IAM ロールにマップする IAM ポリシーをアタッチします。
- IAM ロールを Amazon Elastic Compute Cloud (Amazon EC2) インスタンスにアタッチします。
- IAM ロールを識別するために、AWS 認証トークンを生成します。
- SSL ルート証明書ファイルまたは証明書バンドルファイルをダウンロードします。
- RDS DB インスタンスに接続するには、IAM ロールの認証情報と認証トークンまたは SSL 証明書を使用します。
MySQL を実行している場合は、「ユーザーが IAM 認証情報を使用して Amazon RDS for MySQL DB インスタンスを認証できるようにするにはどうすればよいですか?」を参照してください。
解決策
前提条件
次の前提条件を満たす必要があります。
- IAM データベース認証をサポートする Amazon RDS for PostgreSQL DB インスタンスまたは Aurora PostgreSQL 互換クラスターを起動する
- EC2 インスタンスを起動してデータベースに接続する
詳細については、Aurora の 「IAM データベース認証」および「Amazon RDS の IAM データベース認証」を参照してください。
Amazon RDS インスタンスまたは Aurora クラスターでの IAM 認証に必要な設定を確認したり、IAM 認証をトラブルシューティングしたりするには、AWSSupport-TroubleshootRDSIAMAuthentication ランブックを使用します。詳細については、AWSSupport-TroubleshootRDSIAMAuthentication を参照してください。
IAM データベース認証を使用する
RDS DB インスタンスまたは Aurora PostgreSQL と互換性のある DB クラスターに接続するには、PostgreSQL の IAM データベース認証を使用します。
-
RDS DB インスタンスまたは 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"
]
}
]
}
注: iamuser は、IAM ユーザー情報に置き換えます。
-
Amazon RDS for PostgreSQL DB インスタンスまたは Aurora PostgreSQL 互換クラスターにプライマリユーザーとしてログインします。
psql
psql -h {database or cluster endpoint} -U {Master username} -d {database name}
pgAdmin
pgAdmin のナビゲーションペインから [Servers] (サーバー) を選択します。次に、サーバー名を選択し、プライマリユーザーのパスワードを入力します。
-
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 モード] を**[verify-full]** に変更することもできます。選択した SSL モードに、証明書のパスを入力します。パスをダウンロードするには、次のコマンドを実行します。
wget https://s3.amazonaws.com/rds-downloads/rds-ca-2019-root.pem
アプリケーションが証明書チェーンを受け入れない場合は、古いルート証明書と新しいルート証明書の両方を含む証明書バンドルをダウンロードしてください。
$ 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 組織のものであるかどうかを確認してください。アカウントが組織のものである場合は、そのアカウントが属する組織のサービスコントロールポリシー (SCP) に rds-db:* を追加します。また、rds-db アクセス許可のない IAM ユーザーまたはロールの階層がないかどうかも確認してください。
詳細については、「サービスコントロールポリシーを使用して AWS Organization の複数アカウントにわたり、アクセス許可ガードレールを設定する方法」を参照してください。
関連情報
Aurora PostgreSQL と互換性のある IAM 認証を使用する
SSL/TLS 証明書のローテーション