Amazon Web Services ブログ

IAM 認証を使用して、pgAdmin Amazon Aurora PostgreSQL または Amazon RDS for PostgreSQL に接続する

Amazon Relational Database Service (RDS) では、AWS Identity and Access Management (IAM) を使用して、Amazon RDS for PostgreSQL データベースインスタンスと Amazon Aurora PostgreSQL クラスターのデータベースアクセスを管理できます。データベース管理者は、データベースユーザーを IAM のユーザーとロールに関連付けることができます。IAM データベース認証を使用すると、データベースクラスターに接続するときにパスワードを入力する必要がありません。代わりに、認証トークンを用います。

認証トークンは、Aurora がリクエスト時に生成する一意の文字列で、AWS 署名バージョン 4 を使用します。各トークンの有効期間は 15 分です。認証は IAM を使用して外部で管理されるため、ユーザーの認証情報をデータベースに保存する必要はありません。パスワード認証を引き続き利用することもできます。詳細については、PostgreSQL ドキュメントのウェブサイトの「クライアント認証」を参照してください。

この記事では、Aurora PostgreSQL クラスターに接続するためにすでに使用しているツールで IAM 認証を行う方法について説明します。ここで説明する手順は Amazon RDS for PostgreSQL インスタンスでも同じ様に使えます。リソースをプロビジョニングし、IAM 認証の環境を設定するために提供されたコマンドを使って一緒に実行することができます。

この記事では、psql コマンドラインツールまたは IAM 認証情報による pgAdmin のいずれかを使用してクラスターに接続する方法についても説明します。

前提条件

RDS は、PostgreSQL データベースインスタンスの Secure Socket Layer (SSL) 暗号化をサポートしています。SSL を使用して、お使いのアプリケーションと PostgreSQL データベースインスタンス間の PostgreSQL 接続を暗号化できます。

SSL 証明書の検証を有効にすることを強くお勧めします。詳細については、「PostgreSQL DB インスタンスでの SSL の使用」を参照してください。ユーザーガイドに記された Amazon S3 バケットから証明書をダウンロードする必要があります。

さらに、Aurora データベースクラスターを作成する前に、Amazon Aurora の環境をセットアップする必要があります。

セットアップ

既存の Aurora PostgreSQL クラスターまたは RDS for PostgreSQL データベースを使用して IAM 認証を有効にするか、新しいクラスターを作成できます。 クラスターがない場合は、AWS マネジメントコンソールAWS CLI、AWS SDK、または AWS CloudFormation テンプレートを使用して、Aurora PostgreSQL クラスターをプロビジョニングできます。この記事では、AWS CLI を使用して新しい Aurora PostgreSQL クラスターを作成します。

データベースの作成

Aurora PostgreSQL クラスターまたは RDS PostgreSQL インスタンスがまだない場合は、作成する必要があります。クライアントマシンからのエントリを許可するセキュリティグループでデータベースを設定します。次の CLI コマンドを使用します。

aws rds create-db-cluster --db-cluster-identifier <cluster-name> --engine aurora-postgresql \
--master-username <user-name> --master-user-password <password> \
--db-subnet-group-name <subnet-name> --vpc-security-group-ids <security-group>

プレースホルダーをクラスター名、ユーザー名、パスワード、サブネット名、セキュリティグループに置き換えます。

作業に使用する Aurora PostgreSQL データベースがすでにある場合は、この手順をスキップできます。

上記のコードでデータベースクラスターを作成します。コンソールを使用してデータベースクラスターを作成する場合、RDS はデータベースクラスターのプライマリインスタンス (ライター) を自動的に作成します。AWS CLI を使用してデータベースクラスターを作成する場合、データベースクラスターのプライマリインスタンスを明示的に作成する必要があります。次のコードを参照してください。

aws rds create-db-instance --db-instance-identifier <instance-name> \
--db-cluster-identifier <cluster-name> --engine aurora-postgresql --db-instance-class db.r4.large

インスタンス名とクラスター名のプレースホルダーを置き換えます。

詳細については、「Amazon Aurora DB クラスターの作成」を参照してください。

IAM 認証を有効にする

デフォルトでは、IAM データベース認証はデータベースインスタンスとデータベースクラスターで無効になっています。コンソール、AWS CLI、または RDS API を使用して、IAM データベース認証を有効にする (または再び無効にする) ことができます。詳細については、「IAM データベース認証の有効化と無効化」を参照してください。

コマンドラインから IAM 認証を有効にするには、クラスター名を知っておく必要があります。クラスター名は、RDS コンソールまたは describe-db-clusters AWS CLI コマンドの出力値から見つけることができます。次のコードを参照してください。

aws rds describe-db-clusters \
--query "DBClusters[*].[DBClusterIdentifier]"

次のコマンドは、クラスターで IAM 認証を有効にします。

aws rds modify-db-cluster \
--db-cluster-identifier <cluster-name> \
--apply-immediately \
--enable-iam-database-authentication

プレースホルダーをクラスター名に置き換えます。

IAM データベースアクセス用の IAM リソース

この記事では、rds-db:connect のアクションを持つポリシーを 1 人の IAM ユーザーにアタッチします。次の図は、このワークフローを示しています。

他の Amazon リソースネーム (ARN) を作成して、様々なアクセスパターンをサポートし、ポリシーを複数のユーザーまたはロールにアタッチすることができます。詳細については、「IAM データベースアクセス用の IAM ポリシーの作成と使用」を参照してください。

ポリシー

IAM ユーザーまたはロールがデータベースインスタンスまたはデータベースクラスターに接続できるようにするには、IAM ポリシーを作成する必要があります。IAM ポリシーを作成した後、それを IAM ユーザーまたはロールにアタッチします。詳細については、「最初の顧客管理ポリシーの作成とアタッチ」を参照してください

次の 4 つの主要なデータからポリシードキュメントを作成します。

  • クラスターのリージョン
  • AWS アカウント番号
  • データベースのリソース ID
  • データベースのユーザー名

次のコードを参照してください。

 {
  "Version" : "2012-10-17",
  "Statement" :
  [
    {
      "Effect" : "Allow",
      "Action" : ["rds-db:connect"],
      "Resource" : ["arn:aws:rds-db:us-east-1:123456789012:dbuser:db-ABCDEFGHIJKL01234/mydbuser"]
    }
  ]
}

以下のフォーマットを使用して、1 つのデータベースインスタンス内の 1 つのデータベースユーザーアカウントを記述する ARN を指定します。

arn:aws:rds-db:<region>:<account-id>:dbuser:<resource-id>/<database-user-name>

上記のサンプルコードでは、次の要素が環境に合わせてカスタマイズされています。

  • us-east-1 – リージョン
  • 123456789012 – AWS アカウント ID
  • db-ABCDEFGHIJKL01234 – DB インスタンスの識別子
  • mydbuser – IAM 認証に関連付けるデータベースアカウントの名前。

resource ID は、データベースインスタンスの識別子です。この識別子はリージョンに固有のものであり、変更されることはありません。ポリシーの例では、識別子は db-ABCDEFGHIJKL01234 です。RDS のコンソールで DB インスタンスのリソース ID を見つけるには、[Configuration] を選択します。リソース ID は [Configuration] セクションにあります。

または、AWS CLI コマンドを使用して、現在のリージョンのすべてのデータベースインスタンスの識別子とリソース ID を一覧表示できます。次のコードを参照してください。

aws rds describe-db-instances \
    --query "DBInstances[*].[DBInstanceIdentifier,DbiResourceId]”

IAM 管理者ユーザーは、IAM ポリシーの明示的なアクセス許可なしで DB インスタンスにアクセスできます。詳細については、「IAM ユーザーの作成」を参照してください。DB インスタンスへの管理者アクセスを制限するには、適切な、より低い特権のアクセス許可で IAM ロールを作成し、それを管理者に割り当てることができます。

rds-db: プレフィックスを、rds: で始まる他の RDS API 操作プレフィックスと混同しないでください。IAM データベース認証にのみ rds-db: プレフィックスと rds-db:connect アクションを使用します。他のコンテキストでは無効です。

この記事の執筆時点では、IAM コンソールには、ポリシーのエラーと rds-db:connect アクションが表示されます。このエラーは無視してかまいません。

resource-id が明示的なリソース ID ではなく * に設定されている場合、リージョン内のすべてのデータベースに同じポリシーを使用できます。明示的な場合、すべてのリードレプリカまたは復元されたバックアップに接続するための新しいポリシーが必要です。ポリシーを単一のクラスターにロックダウンしないことにより厳密にアクセス許可を制御することとのトレードオフがありますが、この機能は労力の削減に役立ちます。

この記事では、新しい IAM ユーザーを作成して、次の AWS CLI コマンドを使用して新しい IAM ユーザーにポリシーをアタッチします。この機能にコンソールパスワードやアクセスキーは必要ありません。次のサンプルコードのユーザーには、どちらもありません。

aws iam create-user --user-name mydbuser

aws iam attach-user-policy \
--policy-arn arn:aws:iam:123456789012:policy/database-login-mydbuser \
--user-name mydbuser

データベースユーザーの作成

IAM ユーザーを作成し、IAM ポリシーをユーザーにアタッチしたら、ポリシーで指定したのと同じ名前でデータベースユーザーを作成します。PostgreSQL で IAM 認証を使用するには、データベースクラスターに接続し、データベースユーザーを作成し、rds_iam ロールを付与します。CREATE USER 権限を持つ任意のユーザーとして接続して、次の文を実行できます。

CREATE USER mydbuser WITH LOGIN; 
GRANT rds_iam TO mydbuser;

接続

IAM データベース認証では、データベースクラスターに接続するときに認証トークンを使用します。認証トークンは、パスワードの代わりに使用する文字列です。認証トークンを生成した後、トークンは 15 分で有効期限が切れます。有効期限が切れたトークンで接続を試行すると、接続リクエストが拒否されます。

すべての IAM 認証トークンには、署名バージョン 4 を使った有効な署名が必要です。詳細については、「署名バージョン 4 署名プロセス」を参照してください。AWS CLI および AWS SDK for Java は、作成した各トークンに自動的に署名できます。接続トークンは、AWS CLI を使用して生成できます。

IAM 認証トークンに署名したら、Amazon RDS データベースインスタンスまたは Aurora データベースクラスターに接続できます。

トークンの生成

認証トークンは数百文字で構成されているため、コマンドラインでは扱いにくい場合があります。これを回避する 1 つの方法は、トークンを環境変数に保存し、接続時にその変数を使用することです。次のコード例は、AWS CLI を使用して generated-db-auth-token コマンドを使用して署名付き認証トークンを取得し、それを PGPASSWORD 環境変数に保存する方法を示しています。

export RDSHOST="mypostgres-cluster.cluster-abcdefg222hq.us-east-1.rds.amazonaws.com"

export PGPASSWORD="$(aws rds generate-db-auth-token \
--hostname $RDSHOST \
--port 5432 \
--region us-east-1 \
--username mydbuser)"

上記のコード例では、generate-db-auth-token コマンドのパラメータは次のとおりです。

  • –hostname – アクセスする DB クラスター (クラスターエンドポイント) のホスト名。
  • –port – DB クラスターへの接続に使用するポート番号。
  • –region – DB クラスターを実行しているリージョン。
  • –username –アクセスしたいデータベースアカウント。

psql を使用してクラスターに接続する

psql を使用して接続する一般的な形式については、次のコードを参照してください。

psql "host=hostName port=portNumber sslmode=sslMode sslrootcert=certificateFile dbname=dbName user=userName"

パラメータは次のとおりです。

  • host – アクセスしたいデータベースクラスター (クラスターエンドポイント) のホスト名。
  • port – データベースクラスターへの接続に使用するポート番号。
  • sslmode – 使用する SSL モード。詳細については、PostgreSQL ドキュメントのウェブサイトの「PostgreSQL データベースインスタンスでの SSL の使用」 を参照してください。

sslmode から verify-full または verify-ca を使用することをお勧めします。sslmode = verify-full を使用すると、SSL 接続は DB インスタンスのエンドポイントを SSL 証明書のエンドポイントと照合します。

RDS PostgreSQL と Aurora PostgreSQL クラスターおよびインスタンスエンドポイントで verify-full を使用できます。Aurora PostgreSQL リーダーおよびカスタムエンドポイントでは、verify-ca を使用します。

次のコード例は、コマンドを使用して接続し、前のセクションでトークンを生成したときに設定した環境変数を使用することを示しています。

psql "host=$RDSHOST port=5432 sslmode=verify-full sslrootcert=/sample_dir/rds-combined-ca-bundle.pem dbname=dbName user= mydbuser"

pgAdmin を使用してクラスターに接続する

オープンソースツール pgAdmin を使用して、PostgreSQL データベースインスタンスに接続できます。次の手順を実行します。

  1. データベースインスタンスのエンドポイント (DNS 名) とポート番号を見つけます。
  2. RDS コンソールで、[Databases] を選択します。
  3. データベースインスタンスのリストから、PostgreSQL データベースインスタンス名を選択します。
  4. [Connectivity & security] タブで、エンドポイントとポート番号を記録します。
    データベースインスタンスに接続するには、エンドポイントとポート番号の両方が必要です。
    次のスクリーンショットは、データベースインスタンスの詳細のエンドポイントとポート番号を示しています。
  5. [pgAdmin] から pgAdmin をインストールします
    クライアントコンピュータに PostgreSQL のローカルインスタンスがなくても、pgAdmin をダウンロードして使用できます。
  6. クライアントコンピュータで pgAdmin アプリケーションを起動します。
  7. [Dashboard] で、[Add New Server] を選択します。
  8. [Create – Server] セクションの [General] の下の [Name] に、pgAdmin でサーバーを識別する名前を入力します。
  9. 今すぐ接続を選択解除しますか?
  10. [Connection] の [Host] に、エンドポイントを入力します。
    たとえば、この記事は mypostgresql.abcdefg222hq.us-east-1.rds.amazonaws.com と入力します。
  11. [Port] には、割り当てられたポートを入力します。
  12. [Username] には、データベースインスタンスの作成時に入力したユーザー名を入力します。
  13. オプションですが推奨される手順として、[SSL] で、[SSL mode] を変更します。
  14. このオプションの手順の一部として、選択した SSL モードに基づいて、証明書のパス (SSL 証明書の検証用に以前にダウンロードしたもの) も入力します。
    sslmode から verify-full または verify-ca を使用することをお勧めします。sslmode = verify-full を使用すると、SSL 接続は DB インスタンスのエンドポイントを SSL 証明書のエンドポイントと照合します。
    RDS PostgreSQL と Aurora PostgreSQL クラスターおよびインスタンスエンドポイントで verify-full を使用できます。Aurora PostgreSQL リーダーおよびカスタムエンドポイントでは、オプションの verify-ca を使用します。
  15. [保存] を選択します。
    トラブルシューティングの詳細については、「接続の問題のトラブルシューティング」を参照してください。
  16. サーバーを作成したら、AWS CLI から返された一時トークンを使用してサーバーに接続し、generated-db-auth-token コマンドを使用して署名付き認証トークンを取得します。
  17. pgAdmin ブラウザでデータベースにアクセスするには、[Servers] を選択します。
  18. データベースインスタンスを選択します。
  19. [Databases] を選択します。
  20. データベースインスタンスのデータベース名を選択します。
  21. SQL コマンドを入力できるパネルを開くには、[Tools] で [Query Tool] を選択します。

制限

IAM データベース認証を使用する場合、制限があります。アプリケーションは認証トークンを生成する必要があります。アプリケーションはそのトークンを使ってデータベースクラスターに接続します。1 秒あたりの新規接続の上限を超えると、IAM データベース認証の余分なオーバーヘッドにより接続スロットリングが発生する可能性があります。

詳細については、「MySQL および PostgreSQL 用の IAM データベース認証」を参照してください。

まとめ

RDS for PostgreSQL と Aurora PostgreSQL データベースで IAM 認証を使用することには多くの利点があります。

IAM データベース認証により、お客様の側でデータベース固有のユーザー認証情報を管理する必要がなくなります。データベース固有のパスワードを保持する必要はありません。IAM 認証情報を使用して、データベースアカウントを認証するだけです。

データベースに対して出入りするネットワークトラフィックが SSL を使って暗号化されます。各データベースクラスターで個別にアクセスを管理する代わりに、IAM を使用してデータベースリソースへのアクセスを一元管理できます。Amazon EC2 で実行するアプリケーションの場合、パスワードではなく EC2 インスタンスに固有のプロファイル認証情報を使用してデータベースにアクセスできます。これにより、セキュリティが強化されます。この記事では、psql コマンドラインツールや pgAdmin などのツールで、パスワードの代わりに IAM 認証を使用する方法を示しました。これらの手順とプロセスは、他のツールにも応用できます。

 

PostgreSQL データベース管理システム
(以前は Postgres、その後 Postgres95 と呼ばれていました)

Portions Copyright © 1996-2020, The PostgreSQL Global Development Group
Portions Copyright © 1994, The Regents of the University of California

pgAdmin

Copyright (c) 2002 – 2017, The pgAdmin Development Team

 


著者について

 

Ajeet Tewari は、アマゾン ウェブ サービスのソリューションアーキテクトです。彼は企業顧客と協力して、AWS への移行を手助けしています。彼の専門分野には、拡張性の高い分散システムの設計と実装、および戦略的 AWS イニシアチブのリードが含まれます。