Amazon Web Services ブログ
IAM 認証を使用した Amazon RDS および Aurora PostgreSQL データベースアクセスの保護
AWS は 2 つのマネージド型 PostgreSQL オプションを提供しています。Amazon RDS for PostgreSQL と Amazon Aurora PostgreSQL です。どちらも、データベースへのアクセスを管理するための IAM 認証をサポートしています。データベースユーザーを IAM ユーザーとロールに関連付けて、1 つの場所からすべてのデータベースへのユーザーアクセスを管理できます。これにより、異なる RDS/Aurora インスタンスで権限が同期されないことによる問題を回避できます。
この記事では、IAM 認証を使用できる 2 つの一般的なシナリオについてご説明します。同じ AWS アカウントの Amazon EC2 でホストされているアプリケーションから RDS/Aurora データベースにアクセスする方法と、別のアカウントからアクセスする方法があります。また、これらのシナリオに関連するベストプラクティスについてもご説明します。
この記事では Aurora PostgreSQL 環境を使用していますが、このソリューションは RDS PostgreSQL でも機能します。クラスタープロビジョニングの一部として IAM 認証を有効にしたり、クラスター作成後に CLI またはコンソールを使用してクラスターを変更したりできます。IAM データベース認証は、PostgreSQL バージョン 9.6.9 および 10.4 以降で使用できます。
前提条件
開始する前に、以下の前提条件を満たしてください。
- 2 つの AWS アカウント (この記事では DB アカウントと管理アカウント) が必要です。
- Aurora PostgreSQL DB クラスターを起動するか、PostgreSQL 10.7 で DB アカウントの既存の Aurora クラスターを使用します。
- 各 AWS アカウントに 1 つずつ、2 つの EC2 インスタンスを起動します。
- EC2 に psql クライアントをインストールし、Aurora クラスターへの接続を設定します。
- 認証情報を使用して AWS CLI を設定します。両方の AWS アカウントに対する管理者 IAM 権限が必要です。AWS 管理ポリシーの管理者を使用することもできます。
この記事は、お客様が RDS/Aurora PostgreSQL および EC2 環境での作業に精通していることを前提としています。
環境の設定
ご使用の環境を設定するには、次の手順を実行します。
- DB アカウントで EC2 インスタンスにログインします。psql クライアントを使用して Aurora PostgreSQL クラスターに接続し、サンプルスキーマ
pgdemo
をインストールします。次のコマンドを参照してください。 - アクセスコントロール用のデータベースロールを設定します。
PostgreSQL では、データベースユーザーに直接権限を付与することができます。ただし、アプリケーション要件に基づいて特定の権限セットを持つロールを作成することにより、最小権限モデルでロールベースのアクセスコントロールを実行するのが、ベストプラクティスです。詳細については、PostgreSQL ユーザーとロールの管理を参照して、PostgreSQL データベースでユーザー、ロール、およびグループを構成する方法を学びます。この記事では、次のロールを作成します。
–oltp_ro_role
– テーブルに対する選択権限などの読み取り専用権限がある
–oltp_rw_role
– テーブルに対する選択、削除、挿入、更新特権がある
両方のロールを作成するには、次のコマンドを入力します。 - IAM 認証がまだ有効になっていない場合、次の CLI コマンドを使用して有効にします。
<cluster-identifier> を実際のクラスター識別子に置き換えます。
- 次の CLI コマンドを入力して、RDS IAM 認証が有効になっていることを確認します。
true
の出力が返されます。
- データベースユーザーを作成し、ロール
rds_iam
および IAM ポリシーを使用して IAM 認証のアクセスを提供します。次のコマンドを入力します。
- データベースユーザーを作成したら、IAM ポリシーを作成して、手順 5 で作成したデータベースユーザーに接続アクセスを許可します。次のコードでファイル
oltp_rw_user.json
を作成します。リソースパラメータの形式は次のとおりです。
arn:aws:rds-db
:region:account-id:dbuser:
DbClusterResourceId/db-user-name
リージョン:account-id と DbClusterResourceId/db-user-name を適切な値に置き換えます。コンソールまたは次の CLI コマンドを使用して、リソース識別子を見つけることができます。
- ポリシードキュメントの準備ができたら、次のコードを使用して IAM ポリシーを作成します。
- 以前のコードをテンプレートとして使用して、
oltp_ro_user
のポリシードキュメントを作成します。
環境をセットアップし、IAM 認証機能をテストする準備が整いました。
同じアカウントの EC2 でホストされているアプリケーションからデータベースにアクセスする
典型的な実稼働環境には、OLTP、バッチジョブ、レポートなどのユースケースのために、単一の Aurora データベースクラスターに接続する複数のアプリケーションが含まれます。これらのアプリケーションには、明確なセキュリティ、運用、およびパフォーマンスの要件があります。したがって、それらの要件は通常、独自の EC2 インスタンスでホストされます。この例では、IAM ロールを介してデータベースアクセスを管理できます。この概念を使用して、特定のデータベース環境へのアクセスをロックダウンすることもできます。たとえば、EC2 インスタンス (App1) でホストされるアプリケーションは、特定のデータベースインスタンス prod-db1
にのみ接続できます。
EC2 に IAM ロールを使用すると、手動またはプログラムでの管理が必要な長期 AWS アクセスキーを使用する必要がなくなります。詳細については、Amazon EC2 の IAM ロールを参照してください。
この記事では EC2 インスタンスプロファイルを使用して、この機能を実現します。詳細については、インスタンスプロファイルの使用を参照してください。
次の図は、このソリューションの高レベルアーキテクチャを示しています。このアーキテクチャには、Aurora クラスターのデモ
データベースへの読み取り/書き込みアクセスが必要な OLTP アプリケーションがあります。OLTP アプリケーションは、IAM ロール pgdemo_oltp_rw_role
にマップされたインスタンスロールを持つ EC2 Auto Scaling グループでホストされます。レポートアプリケーションは、インスタンスロール pgdemo_oltp_ro_role
を持つ別の EC2 Auto Scaling グループで実行されます。
このアーキテクチャを説明するために、psql などのクライアントアプリケーションが EC2 インスタンスにインストールされていて、データベースへの読み取りおよび書き込みアクセスが必要だと想定します。このアプリケーションにアクセスを付与するには、DB アカウントで次の手順を実行します。
- 次の信頼ポリシーを作成し、
ec2-role-trust-policy.json
という名前のテキストファイルに保存します。
- IAM ロール
pgdemo-oltp-rw-role
を作成し、ポリシーpgdemo-oltp-rw-user-policy
をロールに添付します。次のコマンドを参照してください。
- 次のコマンドを使用して、この IAM ロールを EC2 インスタンスに添付します。
- EC2 インスタンスにログインし、
aws rds generate-db-auth-token
API を使用して一時的な認証情報を生成します。次のコマンドを参照してください。注:
echo $PGPASSWORD
コマンドを使用して、生成された認証情報トークンを表示できます。詳細については、IAMDBAuth.Connecting.AWSCLI.PostgreSQL を参照してください。
- psql ユーティリティを使用して、生成された認証情報を使用して Aurora クラスターに接続します。
IAM 認証を使用すると、psql などのアプリケーションはデータベースにログインし、データベースレベルのロールマッピングに基づいて DML アクションを実行できます。同じ手順を拡張して、レポートアプリケーションへの読み取り専用アクセスを提供できます。
別のアカウントの EC2 でホストされているアプリケーションからデータベースにアクセスする
次の例では、DB アカウントの RDS/Aurora データベースと、管理アカウントなどの別のアカウントのツールをホストするセキュリティチームを一元管理する DBA と IT オペレーターのマルチアカウントシナリオを想定しています。セキュリティチームは、監査および監視を行うために、すべてのデータベースにアクセスする必要があります。DB アカウントのすべてのデータベースでデータベースユーザー/ロールをプロビジョニングする代わりに、IAM 認証を使用できます。
DBA は、IAM クロスアカウントロール機能を介して DB アカウントからのアクセスを提供するために、最小特権モデルをデプロイできます。
次の図は、このソリューションの高レベルアーキテクチャを示しています。このアーキテクチャは、インスタンスプロファイルオプションを介して EC2 インスタンスに関連付けられた管理アカウント内の pg-mgmt-role
という名前の標準ロールで構成されます。監視が必要な DB アカウントのすべてのデータベースには、必須権限で構成されたデータベースユーザー pgmonitor があります。 IAM データベース認証を使用して Aurora クラスターに接続するために、DB アカウントに pg-monitor-role
を設定します。
このソリューションを実行するには、次の手順を実行します。
管理 AWS アカウントで実行する手順
- 次の信頼ポリシーを作成し、
ec2-role-trust-policy.json
という名前のテキストファイルに保存します。
- EC2 信頼ポリシーを使用して IAM ロール
pg-mgmt-role
を作成します。これは、ツールとアプリケーションによって、DB アカウントでホストされているさまざまなデータベースに接続するために使用されます。次のコードを参照してください。
- ポリシードキュメント
pg-mgmt-policy.json
を作成します。これにより、権限が監視対象のデータベースアカウントでpg-monitor-role
のロールを引き受けるように設定できます。次のコードを参照してください。
- ポリシーを作成し、管理アカウントの
pg-mgmt-role
に添付します。次のコードを参照してください。
pg-mgmt-role
IAM ロールが EC2 インスタンスプロファイルを介して EC2 インスタンスに添付されていることを確認してください。
DB AWS アカウントで実行する手順
- すべての Aurora クラスターに、IAM 認証および監視のための適切な権限を持つ、
pgmonitor
という名前のデータベースユーザーを作成します。次のコマンドを参照してください。
- 次のコードでポリシードキュメント
mgmt-account-trust-policy.json
を作成します。
- ロール信頼ポリシードキュメント
mgmt-account-trust-policy.json
で IAM ロールpg-monitor-role
を作成します。次のコマンドを参照してください。
- 次に、IAM ポリシーを作成して、Aurora クラスターへのアクセスを提供する必要があります。次のコードを使用して、ポリシー
pg-db-monitor-policy
を作成します。この場合、DBA は特定の AWS アカウントと AWS リージョンのすべての Aurora クラスターへのアクセスを提供しています。ご注意ください。特定のデータベースクラスターに制限する場合は、リソース ARN で DBClusterResourceId を
"arn:aws:rds-db:<AWS Region>:<AWS Account ID>:dbuser:<DbClusterResourceId>/pgmonitor"
に指定します。
- このポリシーを IAM ロール
pg-monitor-role
に添付します。次のコマンドを参照してください。
- ロールを作成した後、管理アカウントの EC2 インスタンスが送信先セキュリティグループの IP をホワイトリストに登録して Aurora クラスターに接続できることを確認します。詳細については、セキュリティグループによるアクセスのコントロールを参照してください。または、VPC ピアリングを設定している場合は、ルートとセキュリティグループを適切に設定してください。詳細については、異なる VPC の EC2 インスタンスによってアクセスされる VPC の DB インスタンスを参照してください。
これで、すべてのロールとネットワークアクセスが設定されました。ただし、データベースに接続するように管理アプリケーションを構成する必要があります。この記事では、このアプリケーションが EC2 インスタンスで実行されていると仮定します。ロールのセットアップ中に、pg-mgmt-role
にデータベースアカウントの pg-monitor-role
を引き継ぎ、信頼関係を設定する権限を与えました。SDK を使用している場合、通常、STS 呼び出しを行ってターゲットロールの認証情報を取得し、それらの認証情報を使用して作業を実行します。EC2 では、最初の例で説明したように、インスタンスプロファイルを使用してロールを引き受けることが容易になります。
管理 AWS アカウントで実行する手順
- 管理アカウントで EC2 インスタンスにログインし、
.aws/config
にロールの新しいプロファイルを作成します。次のコマンド例では、DB アカウントのpg-monitor-role
ロールに切り替えるinstancecrossaccount
プロファイルを作成します。
- これで設定が完了しました。次に、EC2 アカウントから DB アカウントで実行されている Aurora クラスターに接続します。
このプロファイルが呼び出されると、AWS CLI は EC2 インスタンスプロファイルメタデータの認証情報を使用して、
pg-monitor-role
の認証情報をリクエストします。
.
次のクエリを実行することにより、10 秒ごとにpg_stat_activity
をクエリしてデータベース内の現在のアクティビティを特定できるようになりました。この記事の例では、EC2 クライアントを利用しました。AWS Lambda などのサーバーレスアプリケーションを介して IAM 認証を使用することもできます。詳細については、サーバーレスアプリケーションから Amazon Aurora への IAM ロールベース認証を参照してください。
運用上のベストプラクティス
ベストプラクティスを使用して IAM ポリシーとロールを実装することを強くお勧めします。詳細については、IAM ベストプラクティスを参照してください。
DB インスタンスパラメータグループで log_connections
(1 に設定) を有効にすることにより、IAM を介してデータベースのログイン接続を監視できます。次のコードは、ログからの出力例です。
ログインに失敗すると、次のようなエラーが報告されます。
クロスアカウントアクセスモニタリングの場合、AWS CloudTrail ログを使用してデータベース接続のソースを特定することもできます。これは、管理アカウントが AWS STS AssumeRole API を使用しているため可能になります。DB アカウントで CloudTrail ログが有効になっていることを確認します。詳細については、AWS CloudTrail ログのクエリを参照してください。
Amazon Athena 経由でログをクエリすることもできます。たとえば、次のクエリを使用して詳細を特定できます。
<DBaccountID> を監視対象のアカウントに置き換えます。
次のスクリーンショットは、4934 と 1026 で終わるアカウントから 2 つのリクエストを受信したことを示しています。また、ソースを識別できる sourceipaddress
も提供しています。
DBA と IT オペレーターでは、IAM 認証アクセスポリシーとデータベースユーザーが各クラスターに対して適切に同期されていることを確認する必要があります。たとえば、データベースユーザーを削除または変更する場合は、対応する IAM ポリシーを更新してください。また、IAM アクセスアドバイザー API を使用して権限を定期的に確認してください。たとえば、特定の IAM ロールまたはユーザーからのアクティビティがない場合、rds-db:connect
アクセスの取り消しを検討できます。詳細については、IAM アクセスアドバイザー API を使用した権限分析の自動化を参照してください。
まとめ
この記事では、IAM 認証を使用してデータベースアクセスを管理できるシナリオと、監視に関連するベストプラクティスについて説明しました。各 DB クラスターで個別にアクセスを管理する代わりに、IAM 認証を使用してデータベースリソースへのアクセスを一元管理できます。AWS は、常にご意見・ご感想をお待ちしております。コメントや質問を残してください。
著者について
Gowri Balasubramanian は、アマゾン ウェブ サービスのプリンシパルデータベースソリューションアーキテクトです。 彼は、AWS を使用している場合にソリューションの価値を向上させる手助けとなるために、AWS のお客様と協力してリレーショナルデータベースと NoSQL データベースサービスの両方の指導や技術支援を行っています。
Amit Bansal は、アマゾン ウェブ サービスでプロフェッショナルサービスチームのシニアコンサルタントを務めています。彼は、AWS へのデータベース移行に焦点を当て、AWS RDS、Aurora、Redshift のアーキテクチャを設計および実装するために顧客と協力しています。