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

所要時間2分
0

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 データベース認証をセットアップするには、以下の手順に従います。

  1. RDS DB インスタンスで IAM DB 認証を有効にします。
  2. IAM ユーザーを作成し、データベースユーザーを IAM ロールにマップする IAM ポリシーをアタッチします。
  3. IAM ロールを 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 データベース認証」を参照してください。

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で新しいサーバー接続を作成するには、[General] (一般) タブを選択し、[Connect now] (今すぐ接続) ボックスをオフにします。[Connection] (接続) タブから、ホスト名、ポート、ユーザー名を入力しますが、パスワードはまだ入力しないでください。SSLタブから SSL モード[Require] (必須) に設定し、サーバー接続を保存します。

  7. (オプション) [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
  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 認証が失敗したのと同様のエラーが表示される場合は、その AWS アカウントが AWS Organizations 組織の一部であるかどうかを確認してください。アカウントが組織の一部である場合は、アカウントが属する組織のサービスコントロールポリシー (SCP)rds-db:* を追加します。また、rds-db 権限のない IAM ユーザーまたはロールの階層がないかどうかも確認してください。詳細については、「サービスコントロールポリシーを使用して AWS Organization のアカウント間に許可ガードレールを設定する方法」を参照してください。

関連情報

Aurora PostgreSQL と互換性のある IAM 認証を使用する

コメントはありません

関連するコンテンツ