PostgreSQL DB インスタンスの Kerberos 認証のセットアップ
AWS Directory Service for Microsoft Active Directory (AWS Managed Microsoft AD) を使用して、PostgreSQL DB インスタンスに Kerberos 認証をセットアップします。Kerberos 認証をセットアップするには、次のステップに従います。
トピック
ステップ 1: AWS Managed Microsoft AD を使用してディレクトリを作成する
Directory Service はフルマネージド型の Active Directory を AWS クラウド内に作成します。AWS Managed Microsoft AD ディレクトリを作成すると、Directory Service が 2 つのドメインコントローラーと DNS サーバーを作成します。ディレクトリサーバーは、VPC 内の異なるサブネットで作成されます。この冗長性によって、障害が発生してもディレクトリにアクセス可能な状態を維持できます。
AWS Managed Microsoft AD ディレクトリを作成すると、AWS Directory Service がユーザーに代わって次のタスクを実行します。
-
VPC 内に Active Directory を設定します。
-
ユーザー名
Adminと指定されたパスワードを使用してディレクトリ管理者アカウントを作成します。このアカウントを使用してディレクトリを管理します。重要
このパスワードは必ず保管してください。Directory Service にはこのパスワードは保存されず、復元やリセットもできません。
-
ディレクトリコントローラー用セキュリティグループを作成します。セキュリティグループは、PostgreSQL DB インスタンスとの通信を許可する必要があります。
AWS Directory Service for Microsoft Active Directory を起動すると、AWS は組織単位 (OU) を作成します。OU にはディレクトリのオブジェクトがすべて含まれています。この OU はドメインルートにあります。OU にはディレクトリを作成する際に入力した NetBIOS 名があります。ドメインルートは AWS が所有し、管理します。
Admin ディレクトリに作成された AWS Managed Microsoft AD アカウントには、OU に対して頻繁に実行される管理行為の権限が含まれています。
-
ユーザーを作成、更新、削除する
-
ファイルやプリントサーバーなどのドメインにリソースを追加して、追加したリソースへのアクセス許可を OU のユーザーとグループに割り当てる
-
追加の OU やコンテナを作成する
-
権限を委譲する
-
削除されたオブジェクトを Active Directory のごみ箱から元に戻す
-
Active Directory Web Service で Windows PowerShell 用の Active Directory と Domain Name Service (DNS) モジュールを実行する。
Admin アカウントには、ドメイン全体に関係するアクティビティを実行する権限もあります。
-
DNS 設定 (レコード、ゾーン、フォワーダーの追加、削除、更新) を管理する
-
DNS イベントログを参照する
-
セキュリティイベントログを参照する
AWS Managed Microsoft AD でディレクトリを作成するには
-
Directory Serviceコンソール
のナビゲーションペインで、[ディレクトリ]、[ディレクトリのセットアップ] の順に選択します。 -
AWS Managed Microsoft AD を選択します。現在、 Amazon RDS での使用では AWS Managed Microsoft AD のオプションのみがサポートされています。
-
[次へ] を選択します。
-
[ディレクトリ情報の入力] ページに、以下の情報を指定します。
- エディション
-
目的の要件を満たすエディションを選択します。
- ディレクトリの DNS 名
-
ディレクトリの完全修飾名 (例:
corp.example.com)。 - ディレクトリの NetBIOS 名
-
ディレクトリの短縮名 (例:
CORP)。 - ディレクトリの説明
-
必要に応じて、ディレクトリの説明。
- 管理者パスワード
-
ディレクトリ管理者のパスワードです。ディレクトリの作成プロセスでは、ユーザー名
Adminとこのパスワードを使用して管理者アカウントが作成されます。ディレクトリ管理者のパスワードには、「admin」の単語を含めることはできません。パスワードは大文字と小文字を区別し、8-64 文字にします。また、以下の 4 つのカテゴリうち 3 つから少なくとも 1 文字を含める必要があります。
-
小文字 (a~z)
-
大文字 (A~Z)
-
数字 (0~9)
-
英数字以外の文字 (~!@#$%^&*_-+=`|\(){}[]:;"'<>,.?/)
-
- パスワードを確認
-
管理者のパスワードをもう一度入力します。
重要
このパスワードは必ず保管してください。Directory Service にはこのパスワードは保存されず、復元やリセットもできません。
-
[次へ] を選択します。
-
[VPC とサブネットの選択] ページで、以下の情報を指定します。
- VPC
-
ディレクトリ用の VPC を選択します。PostgreSQL DB インスタンスは、この同じ VPC または異なる VPC で作成できます。
- Subnets
-
ディレクトリサーバーのサブネットを選択します。2 つのサブネットは、異なるアベイラビリティーゾーンに存在している必要があります。
-
[次へ] を選択します。
-
ディレクトリの情報を確認します。変更が必要な場合は、[戻る] を選択し、変更を行います。情報が正しい場合は、[Create directory (ディレクトリの作成)] を選択します。
ディレクトリが作成されるまで、数分かかります。正常に作成されると、[Status] 値が [Active] に変わります。
ディレクトリに関する情報を表示するには、ディレクトリの一覧で、そのディレクトリ ID を選択します。ディレクトリ ID 値を書き留めます。PostgreSQL DB インスタンスを作成または変更する場合は、この値が必要です。
ステップ 2: (オプション) オンプレミスの Active Directory と Directory Service との間の信頼関係を作成する
独自のオンプレミスの Microsoft Active Directory を使用する予定がない場合は、ステップ 3: Amazon RDS が Directory Service にアクセスするための IAM ロールを作成する に進みます。
オンプレミスの Active Directory を使用して Kerberos 認証を取得するには、オンプレミスの Microsoft Active Directory と (AWS Managed Microsoft AD で作成された) ステップ 1: AWS Managed Microsoft AD を使用してディレクトリを作成する ディレクトリとの間に、フォレストの信頼を使用して、信頼するドメイン関係を作成する必要があります。信頼は一方向にすることができます。この場合、AWS Managed Microsoft AD ディレクトリはオンプレミスの Microsoft Active Directory を信頼します。信頼は、両方の Active Directory が相互に信頼する双方向にすることもできます。Directory Service を使用して信頼関係を設定する方法の詳細については、「AWS Directory Service 管理ガイド」の「信頼関係を作成する場合」を参照してください。
注記
オンプレミスの Microsoft Active Directory を使用している場合、Windows クライアントは rds.amazonaws.com の代わりにエンドポイント内の Directory Service のドメイン名を使用して接続します。詳細についてはPostgreSQL を Kerberos 認証と接続するを参照してください。
オンプレミスの Microsoft Active Directory ドメイン名に、新しく作成された信頼関係に対応する DNS サフィックスルーティングが含まれていることを確認してください。次のスクリーンショットは、例を示しています。
ステップ 3: Amazon RDS が Directory Service にアクセスするための IAM ロールを作成する
Amazon RDS が Directory Service を呼び出すには、AWS アカウントにマネージド IAM ポリシー AmazonRDSDirectoryServiceAccess を使用する IAM ロールが必要です。このロールにより、Amazon RDS は Directory Service を呼び出すことが可能になります。
the console を使用して DB インスタンスを作成し、コンソールユーザーが iam:CreateRole アクセス許可を持っている場合、コンソールは必要な IAM ロールを自動的に作成します。この場合、ロール名は rds-directoryservice-kerberos-access-role です。それ以外の場合は、IAM ロールを手動で作成する必要があります。IAM ロールを作成する場合、[Directory Service] を選択し、それに AWS マネージドポリシー AmazonRDSDirectoryServiceAccess をアタッチします。
サービス用の IAM ロールを作成する方法の詳細については、「IAM ユーザーガイド」の「AWS のサービスにアクセス許可を委任するロールの作成」を参照してください。
注記
RDS for Microsoft SQL Server の Windows 認証に使用される IAM ロールは、Amazon RDS for PostgreSQL に使用できません。
AmazonRDSDirectoryServiceAccess マネージドポリシーを使用する代わりに、必要なアクセス許可を使用してポリシーを作成することもできます。これを行うには、IAM ロールに次の IAM 信頼ポリシーが必要です。
また、ロールには、以下の IAM ロールポリシーも必要です。
オプトインの AWS リージョンの場合は、IAM ロールの信頼ポリシーでリージョン固有のサービスプリンシパルを使用します。これらのリージョンでサービスの信頼ポリシーを作成するときは、サービスプリンシパルでリージョンコードを指定します。
次の例では、リージョン固有のサービスプリンシパルを含む信頼ポリシーを示します。
REGION-CODE を、特定のリージョンのコードに置き換えます。例えば、アジアパシフィック (メルボルン) リージョンでは、次のサービスプリンシパルを使用します。
"Service": [ "directoryservice.rds.ap-southeast-4.amazonaws.com", "rds.ap-southeast-4.amazonaws.com" ]
ステップ 4: ユーザーを作成して設定する
Active Directory ユーザーとコンピューターツールを使用してユーザーを作成できます。これは Active Directory Domain Services ツールおよび Active Directory Lightweight Directory Services ツールの 1 つです。詳細については、Microsoft のドキュメントの「ユーザーとコンピュータを Active Directory ドメインに追加する
Directory Service ディレクトリにユーザーを作成するには、Directory Service ディレクトリのメンバーである Windows ベースの Amazon EC2 インスタンスに接続している必要があります。同時に、ユーザーを作成する権限を持つユーザーとしてログインしていなければなりません。詳細については、AWS Directory Service 管理ガイドの「ユーザーの作成」を参照してください。
ステップ 5: ディレクトリと DB インスタンスの間のクロス VPC トラフィックを有効にする
同じ VPC 内にディレクトリおよび DB インスタンスを配置する場合は、このステップをスキップして ステップ 6: PostgreSQL DB インスタンスを作成または変更する に進みます。
ディレクトリと DB インスタンスを別の VPC に配置する場合は、VPC ピア接続または AWS Transit Gateway を使用してクロス VPC トラフィックを設定します。
次の手順では、VPC ピア接続を使用して VPC 間のトラフィックを有効にします。Amazon Virtual Private Cloud ピアリング接続ガイドの「VPC ピア機能とは」の手順に従います。
VPC ピア接続を使用してクロス VPC トラフィックを有効にするには
-
適切な VPC ルーティングを設定し、ネットワークトラフィックが双方向にフローするようにします。
-
DB インスタンスのセキュリティグループが、ディレクトリのセキュリティグループからインバウンドトラフィックを受信できることを確認します。
-
トラフィックをブロックするネットワークのアクセス制御リスト (ACL) ルールがないことを確認します。
別の AWS アカウントがディレクトリを所有している場合は、ディレクトリを共有する必要があります。
AWS アカウント間でディレクトリを共有するには
-
DB インスタンスを作成する AWS アカウントとの間でディレクトリの共有をスタートするには、AWS 管理ガイドの「チュートリアル: Directory Service マネージド Microsoft AD ディレクトリを共有して、シームレスに EC2 ドメインを結合する」の手順を実行します。
-
DB インスタンスのアカウントを使用して、Directory Service コンソールにサインインし、続行する前にドメインが必ず
SHAREDステータスであることを確認します。 -
DB インスタンスのアカウントを使用して Directory Service コンソールにサインインしている間に、[ディレクトリ ID] の値を書き留めておきます。このディレクトリ ID は、DB インスタンスをドメインに結合するために使用します。
ステップ 6: PostgreSQL DB インスタンスを作成または変更する
ディレクトリで使用する PostgreSQL DB インスタンスを作成または変更します。コンソール、CLI、RDS API を使用して DB インスタンスとディレクトリを関連付けることができます。これには以下の 2 つの方法があります。
-
コンソール、create-db-instance CLI コマンド、または CreateDBInstance RDS API オペレーションを使用して新しい PostgreSQL DB インスタンスを作成します。手順については、「Amazon RDS DB インスタンスの作成」を参照してください。
-
コンソール、modify-db-instance CLI コマンド、または ModifyDBInstance RDS API オペレーションを使用して、既存の PostgreSQL DB インスタンスを変更します。手順については、「Amazon RDS DB インスタンスを変更する」を参照してください。
-
コンソール、DB スナップショットから DB インスタンスを復元する CLI コマンド、または RestoreDBInstanceFromDBSnapshot RDS API オペレーションを使用して、DB スナップショットから PostgreSQL DB インスタンスを復元します。手順については、「DB インスタンスへの復元」を参照してください。
-
コンソール、restore-db-instance-to-point-in-time CLI コマンド、または RestoreDBInstanceToPointInTime RDS API オペレーションを使用して、PostgreSQL インスタンスをポイントインタイムに復元します。手順については、「Amazon RDS の DB インスタンスを特定の時点に復元する」を参照してください。
Kerberos 認証は、VPC 内の PostgreSQL DB インスタンスでのみサポートされています。DB インスタンスは、ディレクトリと同じ VPC または異なる VPC 内にあります。DB インスタンスがディレクトリと通信する場合、そのインスタンスは、ディレクトリの VPC 内での送受信を許可するセキュリティグループを使用する必要があります。
DB インスタンスを作成、変更、復元するためにコンソールを使用する場合は、データベースの認証セクションの [パスワードと Kerberos 認証] を選択します。次に、[ディレクトリのブラウジング] を選択します。Directory Service を使用するには、ディレクトリを選択するか、[新しいディレクトリの作成] を選択します。
AWS CLI を使用する場合は、DB インスタンスが、作成したディレクトリを使用できるように、以下のパラメータが必要です。
-
--domainパラメータには、ディレクトリの作成時に生成されたドメイン識別子 ("d-*" 識別子) を使用します。 -
--domain-iam-role-nameパラメータには、マネージド IAM ポリシーAmazonRDSDirectoryServiceAccessを使用する作成済みのロールを使用します。
例えば、以下の CLI コマンドはディレクトリを使用するように DB インスタンスを変更します。
aws rds modify-db-instance --db-instance-identifiermydbinstance--domain d-Directory-ID--domain-iam-role-namerole-name
重要
DB インスタンスを変更して Kerberos 認証を有効にした場合、変更後、その DB インスタンスを再起動します。
ステップ 7: Kerberos プリンシパル用の PostgreSQL ユーザーを作成する
この時点で、 RDS for PostgreSQL DB インスタンスが AWS Managed Microsoft AD ドメインに参加しました。 ステップ 4: ユーザーを作成して設定する のディレクトリに作成したユーザーを PostgreSQL データベースユーザーとして設定し、データベースにログインする権限を付与する必要があります。そのためには、rds_superuser 権限を持つデータベースユーザーとしてサインインします。例えば、RDS for PostgreSQL DB インスタンス、の作成時にデフォルト値を受け入れた場合は、次のステップに示すように postgres を使用します。
Kerberos プリンシパル用の PostgreSQL データベースユーザーを作成するには
-
psqlを使用して、の RDS for PostgreSQL DB インスタンスのエンドポイントにpsqlを使用して接続します。次の例では、postgresロールにデフォルトのrds_superuserアカウントを使用しています。psql --host=cluster-instance-1.111122223333.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password -
データベースにアクセスする Kerberos プリンシパル (Active Directory ユーザー名) ごとにデータベースユーザー名を作成します。Active Directory インスタンスで定義されている正規のユーザー名 (ID) を使用します。つまり、そのユーザー名には、小文字
alias(Active Directory 内のユーザー名) と Active Directory ドメインの大文字の名前を使用します。Active Directory ユーザー名は外部認証されたユーザーなので、次に示すように名前を引用符で囲んでください。postgres=>CREATE USER "username@CORP.EXAMPLE.COM" WITH LOGIN;CREATE ROLE -
データベースユーザーに
rds_adロールを付与します。postgres=>GRANT rds_ad TO "username@CORP.EXAMPLE.COM";GRANT ROLE
Active Directory ユーザー ID のすべての PostgreSQL ユーザーの作成が完了すると、ユーザーは Kerberos 認証情報を使用して RDS for PostgreSQL DB インスタンス にアクセスできます。
Kerberos を使用して認証するデータベースユーザーは、Active Directory ドメインのメンバーであるクライアントマシンから認証を行う必要があります。
rds_ad ロールを付与されたデータベースユーザーもその rds_iam ロールを持つことはできません。これは、ネストされたメンバーシップにも適用されます。詳細については、「MariaDB、MySQL、および PostgreSQL の IAM データベース認証」を参照してください。
ステップ 8: PostgreSQL クライアントを設定する
PostgreSQL クライアントを設定するには、次のステップを実行します。
-
ドメインを指す krb5.conf ファイル (または同等) を作成します。
-
クライアントホストと Directory Service 間でトラフィックが流れることを確認します。次の目的で Netcat などのネットワークユーティリティを使用します。
-
ポート 53 の DNS 経由のトラフィックを確認します。
-
ポート 53 および Kerberos の TCP/UDP 上のトラフィックを確認します。これには、Directory Service の場合ポート 88 および 464 が含まれます。
-
-
データベースポートを介してクライアントホストと DB インスタンス間でトラフィックが流れることを確認します。例えば、psql を使用してデータベースに接続し、アクセスします。
以下は、AWS Managed Microsoft AD 向けの krb5.conf の内容のサンプルです 。
[libdefaults] default_realm = EXAMPLE.COM [realms] EXAMPLE.COM = { kdc = example.com admin_server = example.com } [domain_realm] .example.com = EXAMPLE.COM example.com = EXAMPLE.COM
以下は、オンプレミスの Microsoft Active Directory 向けの krb5.conf の内容のサンプルです。
[libdefaults] default_realm = EXAMPLE.COM [realms] EXAMPLE.COM = { kdc = example.com admin_server = example.com } ONPREM.COM = { kdc = onprem.com admin_server = onprem.com } [domain_realm] .example.com = EXAMPLE.COM example.com = EXAMPLE.COM .onprem.com = ONPREM.COM onprem.com = ONPREM.COM .rds.amazonaws.com = EXAMPLE.COM .amazonaws.com.cn = EXAMPLE.COM .amazon.com = EXAMPLE.COM