IAM 認証を使用して RDS PostgreSQL インスタンスに接続するにはどうすればよいですか?

最終更新日: 2020 年 8 月 19 日

AWS Identity and Access Management (IAM) 認証を使用してAmazon Relational Database Service (Amazon RDS) PostgreSQL DB インスタンスに接続するにはどうすればよいですか?

簡単な説明

ユーザーは、IAM ユーザーまたはロール認証情報と認証トークンを使用して Amazon RDS DB インスタンスまたはクラスターに接続できます。IAM データベース認証は、次の理由により、ネイティブ認証方法よりも安全です。

  • IAM は AWS アクセスキーを使用してデータベース認証トークンを生成するため、データベースユーザー認証情報を保存する必要がありません。
  • 認証トークンの有効期間は 15 分なので、パスワードのリセットを強制する必要はありません。
  • IAM データベース認証には SSL 接続が必要なため、RDS DB インスタンスとの間で送受信されるすべてのデータは暗号化されます。
  • アプリケーションが Amazon Elastic Compute Cloud (Amazon EC2) で実行されている場合、EC2 インスタンスプロファイル認証情報を使用してデータベースにアクセスできます。インスタンスにデータベースのパスワードを保存する必要はありません。

IAM ロールを使用して IAM データベース認証を設定するには、次の手順に従います。

  1. RDS DB インスタンスで IAM DB 認証を有効にする。
  2. IAM ユーザーを作成し、データベースユーザーを IAM ロールにマッピングする IAM ポリシーをアタッチする。
  3. IAM ロールを EC2 インスタンスにアタッチする。
  4. AWS 認証トークンを生成して、IAM ロールを識別する。
  5. SSL ルート証明書ファイルまたは証明書バンドルファイルをダウンロードする。
  6. IAM ロール認証情報と認証トークンまたは SSL 証明書を使用して RDS DB インスタンスに接続します。

MySQL を実行する場合は、IAM 認証情報を使用して Amazon RDS MySQL DB インスタンスに接続するよう、ユーザーに許可する方法を教えてください。を参照します。

解決方法

開始する前に、IAM データベース認証をサポートする RDS PostgreSQL DB インスタンスまたは Aurora PostgreSQL クラスター、データベースに接続する EC2 インスタンスを必ず起動してください。

詳細については、Amazon Aurora の場合は、IAM データベース認証を、RDS の場合は、IAM データベース認証の可用性を参照してください。

PostgreSQL の IAM データベース認証を使用して、Amazon RDS DB インスタンスまたは Amazon Aurora PostgreSQL DB クラスターに接続できます。 

1.    RDS DB インスタンスまたは Aurora クラスターで IAM 認証を有効にします。

2.    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 が使用されています。

3.    マスターユーザーを使用して、Amazon RDS PostgreSQL DB インスタンスまたは Aurora PostgreSQL クラスターにログインします。

psql
psql -h {database or cluster endpoint} -U {Master username} -d {database name}

PGAdmin

pgAdmin ナビゲーションペインで [Servers] を選択し、サーバー名を選択して、マスターユーザーのパスワードを入力します。

4.    IAM ユーザーと同じ名前を持つ子ユーザーを作成します。
CREATE USER iamuser WITH LOGIN; 
GRANT rds_iam TO iamuser;

5.    作成したユーザー名を使用して、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 ~]$

6.    pgAdmin で新しいサーバー接続を作成するには、[General] タブを選択し、[Connect now] ボックスをオフにします。[Connection ] タブで、ホスト名、ポート、およびユーザー名を入力しますが、パスワードは入力しないでください。[SSL] タブで、[SSL mode] を [Require] に設定し、サーバー接続を保存します。 

7.    (オプション) [SSL] タブで、[SSL mode] を verify-full に変更できます。選択した SSL モードに基づいて、証明書のパス (以下のコマンドを実行してダウンロードできます) を入力します。

wget https://s3.amazonaws.com/rds-downloads/rds-ca-2019-root.pem

注意: 2015 ルート証明書を使用する場合、2020 年に有効期限が切れます。2019 ルート証明書に移動するには、SSL/TLS 証明書の更新を参照してください。

注意: アプリケーションが証明書チェーンを受け入れない場合は、次のコマンドを実行して、古いルート証明書と新しいルート証明書の両方を含む証明書バンドルをダウンロードします。

$ wget https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem

8.    サーバーの作成後、プロンプトが表示されたら、ユーザー 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 authentication failed for your user」などのエラーが表示される場合は、AWS アカウントが AWS Organizations の組織の一部であるかどうかを確認します。アカウントが組織の一部である場合は、そのアカウントが属する組織単位のサービス制御ポリシー (SCP) に rds-db: * を追加します。詳細については、SCP を更新する を参照してください。

アカウントが組織の一部である場合は、 rds-db アクセス許可を持たない IAM ユーザーまたはロールの階層があるかどうかを確認します。詳細については、お使いの AWS Organization で、サービスコントロールポリシーを使用して、複数アカウントのアクセス許可のガードレールを設定する方法を参照してください。


この記事はお役に立ちましたか?


請求に関するサポートまたは技術的なサポートが必要ですか?