AWS re:Postを使用することにより、以下に同意したことになります AWS re:Post 利用規約

IAM 認証を使用して Amazon RDS for PostgreSQL または Amazon Aurora PostgreSQL に接続する方法を教えてください。

所要時間2分
0

PostgreSQL 用の Amazon Relational Database Service (Amazon RDS) または Amazon Aurora PostgreSQL 互換エディション DB インスタンスを使用しています。そのインスタンスに、AWS Identity and Access Management (IAM) 認証を使用して接続したいと考えています。

簡単な説明

IAM データベース認証は、ネイティブな認証方法よりも安全です。詳細については、「MariaDB、MySQL、PostgreSQL での IAM データベース認証」を参照してください。

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

  1. RDS DB インスタンスで IAM DB 認証を有効にします。
  2. IAM ユーザーを作成した後、データベースユーザーを IAM ロールにマップする IAM ポリシーをアタッチします。
  3. IAM ロールを Amazon Elastic Compute Cloud (Amazon EC2) インスタンスにアタッチします
  4. IAM ロールを識別するために、AWS 認証トークンを生成します。
  5. SSL ルート証明書ファイルまたは証明書バンドルファイルをダウンロードします。
  6. 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 データベース認証を使用します。

  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"
          ]
        }
      ]
    }

    注: iamuser は、IAM ユーザー情報に置き換えます。

  3. Amazon RDS for 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 で新しいサーバー接続を作成するには、[全般] タブを選択し、[今すぐ接続] ボックスを解除します。[接続] タブでホスト名、ポート、ユーザー名を入力します。ただし、パスワードはまだ入力しないでください。SSLタブで **[SSL モード]**を [必須] に設定したら、サーバー接続を保存します。

  7. (オプション) [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
  8. サーバーに接続します。プロンプトが表示されたら、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 証明書のローテーション

コメントはありません

関連するコンテンツ