PostgreSQL 用の Amazon Relational Database Service (Amazon RDS) または Amazon Aurora PostgreSQL 互換エディション DB インスタンスがあります。AWS ID および Access Management (IAM) 認証を使用してインスタンスに接続したいと考えています。
簡単な説明
IAM データベース認証は、以下の理由により、ネイティブ認証方法よりも安全です。
- IAM は、AWS アクセスキーを使用してデータベース認証トークンを生成します。データベースユーザーの認証情報を保存する必要はありません。
- 認証トークンの有効期間は 15 分なので、パスワードを強制的にリセットする必要はありません。
- IAM データベース認証には SSL 接続が必要です。これにより、Amazon RDS DB インスタンスとの間で送受信されるすべてのデータが暗号化されます。
- アプリケーションが Amazon Elastic Compute Cloud (Amazon EC2) で実行されている場合は、Amazon EC2 インスタンスプロファイルの認証情報を使用してデータベースにアクセスできます。データベースパスワードをインスタンスに保存する必要はありません。
IAM ロールを使用して IAM データベース認証をセットアップするには、以下の手順に従います。
- RDS DB インスタンスで IAM DB 認証を有効にします。
- IAM ユーザーを作成し、データベースユーザーを IAM ロールにマップする IAM ポリシーをアタッチします。
- IAM ロールを 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 データベース認証」を参照してください。
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で新しいサーバー接続を作成するには、[General] (一般) タブを選択し、[Connect now] (今すぐ接続) ボックスをオフにします。[Connection] (接続) タブから、ホスト名、ポート、ユーザー名を入力しますが、パスワードはまだ入力しないでください。SSLタブから SSL モードを [Require] (必須) に設定し、サーバー接続を保存します。
-
(オプション) [SSL] タブから、[SSL mode] (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
-
サーバーを作成したら、サーバーに接続します。プロンプトが表示されたら、ユーザー iamuser 用に生成される generate-db-auth-token 一時トークンを入力します。
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 認証を使用する