Aurora PostgreSQL アクセスコントロールへの AD セキュリティグループの使用 - Amazon Aurora

Aurora PostgreSQL アクセスコントロールへの AD セキュリティグループの使用

Aurora PostgreSQL 14.10 および 15.5 バージョンから、Aurora PostgreSQL アクセスコントロールは AWS Directory Service for Microsoft Active Directory (AD) セキュリティグループを使用して管理できます。Aurora PostgreSQL の以前のバージョンでは、個人ユーザーに対してのみ AD による Kerberos ベースの認証がサポートされていました。各 AD ユーザーは、アクセスできるように DB クラスターに明示的にプロビジョニングされる必要がありました。

ビジネスニーズに基づいて各 AD ユーザーを DB クラスターに明示的にプロビジョニングする代わりに、以下で説明するように AD セキュリティグループを活用できます。

  • AD ユーザーは、Active Directory のさまざまな AD セキュリティグループのメンバーです。これらは DB クラスター管理者によって指示されるのではなく、ビジネス要件に基づいており、AD 管理者によって処理されます。

  • DB クラスター管理者は、ビジネス要件に基づいて DB インスタンスに DB ロールを作成します。これらの DB ロールには、異なるアクセス許可または権限がある場合があります。

  • DB クラスター管理者は、DB クラスターごとに AD セキュリティグループから DB ロールへのマッピングを設定します。

  • DB ユーザーは、AD 認証情報を使用して DB クラスターにアクセスできます。アクセスは AD セキュリティグループのメンバーシップに基づいています。AD ユーザーは、AD グループのメンバーシップに基づいて自動的にアクセスを取得または喪失します。

前提条件

AD セキュリティグループの 拡張機能を設定する前に、次のものがあることを確認してください。

pg_ad_mapping 拡張機能のセットアップ

Aurora PostgreSQL では、Aurora PostgreSQL クラスターの AD セキュリティグループと DB ロール間のマッピングを管理するための pg_ad_mapping 拡張機能が提供されるようになりました。pg_ad_mapping で提供される関数の詳細については、pg_ad_mapping 拡張機能の関数の使用 を参照してください。

Aurora PostgreSQL DB クラスターに pg_ad_mapping 拡張機能を設定するには、Aurora PostgreSQL DB クラスター用のカスタム DB クラスターのパラメータグループの共有ライブラリに pg_ad_mapping を追加します。カスタム DB クラスターパラメータグループの作成の詳細については、「Amazon Aurora のパラメータグループ」を参照してください。次に、pg_ad_mapping 拡張機能をインストールします。このセクションの手順で、方法を示します。AWS Management Console または AWS CLI を使用できます。

これらすべてのタスクを実行するには、rds_superuser ロールとして権限が必要です。

以下のステップでは、Aurora PostgreSQL DB クラスター がカスタム DB クラスターパラメータグループに関連付けられていることを前提としています。

pg_ad_mapping 拡張機能をセットアップするには
  1. AWS Management Console にサインインし、Amazon RDS コンソール (https://console.aws.amazon.com/rds/) を開きます。

  2. ナビゲーションペインで、Aurora PostgreSQL DB クラスターのライターインスタンスを選択します。

  3. Aurora PostgreSQL DB クラスターライターインスタンスの [設定] タブを開きます。インスタンスの詳細の中から、パラメータグループのリンクを見つけてください。

  4. リンクを選択して、Aurora PostgreSQL DB クラスターに関連するカスタムパラメータを開きます。

  5. [Parameters] (パラメータ) 検索フィールドに shared_pre と入力し、shared_preload_libraries パラメータを検索します。

  6. プロパティ値にアクセスするには、[Edit parameters] (パラメータの編集) を選択します。

  7. [Values] (値) フィールドのリストに pg_ad_mapping を追加します。値のリスト内の項目を区切るにはカンマを使用します。

    pgAudit が追加された shared_preload_libaries パラメータの画像。
  8. Aurora PostgreSQL DB クラスターのライターインスタンスを再起動して、shared_preload_libraries パラメータの変更を有効にします。

  9. インスタンスが使用可能になったら、pg_ad_mapping が初期化されていることを確認します。psql を使用して Aurora PostgreSQL DB クラスターのライターインスタンスに接続し、次のコマンドを実行します。

    SHOW shared_preload_libraries; shared_preload_libraries -------------------------- rdsutils,pg_ad_mapping (1 row)
  10. pg_ad_mapping を初期化すると、拡張機能を作成できるようになりました。この拡張機能が提供する関数の使用を開始するには、ライブラリを初期化した後に拡張機能を作成する必要があります。

    CREATE EXTENSION pg_ad_mapping;
  11. psql セッションを終了します。

    labdb=> \q
pg_ad_mapping をセットアップするには

AWS CLI を使用して pg_ad_mapping をセットアップするには、次の手順に示すように、modify-db-parameter-group オペレーションを呼び出して、カスタムパラメータグループにこのパラメータを追加します。

  1. 次の AWS CLI コマンドを使用してshared_preload_librariesパラメータに pg_ad_mapping を追加します。

    aws rds modify-db-parameter-group \ --db-parameter-group-name custom-param-group-name \ --parameters "ParameterName=shared_preload_libraries,ParameterValue=pg_ad_mapping,ApplyMethod=pending-reboot" \ --region aws-region
  2. 次の AWS CLI コマンドを使用して Aurora PostgreSQL DB クラスターのライターインスタンスを再起動し、pg_ad_mapping ライブラリを初期化します。

    aws rds reboot-db-instance \ --db-instance-identifier writer-instance \ --region aws-region
  3. インスタンスが使用可能になると、pg_ad_mapping が初期化されていることを確認できます。psql を使用して Aurora PostgreSQL DB クラスターのライターインスタンスに接続し、次のコマンドを実行します。

    SHOW shared_preload_libraries; shared_preload_libraries -------------------------- rdsutils,pg_ad_mapping (1 row)

    pg_ad_mapping を初期化すると、拡張機能を作成できるようになりました。

    CREATE EXTENSION pg_ad_mapping;
  4. AWS CLI を使用できるように psql セッションを終了します。

    labdb=> \q

PowerShell での Active Directory グループ SID の取得

セキュリティ識別子 (SID) は、セキュリティプリンシパルまたはセキュリティグループを一意に識別するために使用されます。Active Directory でセキュリティグループまたはアカウントを作成するたびに、SID が割り当てられます。Active Directory から AD セキュリティグループ SID を取得するには、その Active Directory ドメインに参加している Windows クライアントマシンから Get-ADGroup コマンドレットを使用できます。ID パラメータは、対応する SID を取得するための Active Directory グループ名を指定します。

次の例では、AD グループ adgroup1 の SID を返します。

C:\Users\Admin> Get-ADGroup -Identity adgroup1 | select SID SID ----------------------------------------------- S-1-5-21-3168537779-1985441202-1799118680-1612

AD セキュリティグループによる DB ロールのマッピング

データベース内の AD セキュリティグループを PostgreSQL DB ロールとして明示的にプロビジョニングする必要があります。少なくとも 1 つのプロビジョニングされた AD セキュリティグループに属する AD ユーザーは、データベースにアクセスできます。AD グループのセキュリティベースの DB ロールに rds_ad role を付与しないでください。セキュリティグループの Kerberos 認証は、user1@example.com などのドメイン名サフィックスを使用してトリガーされます。この DB ロールは、パスワードまたは IAM 認証を使用してデータベースにアクセスすることはできません。

注記

rds_ad ロールが付与されたデータベースに対応する DB ロールを持つ AD ユーザーは、AD セキュリティグループの一部としてログインできません。個人ユーザーとして DB ロールを通じてアクセスできるようになります。

例えば、accounts-group は、Aurora PostgreSQL でこのセキュリティグループを accounts-role としてプロビジョニングする AD のセキュリティグループです。

AD セキュリティグループ PosgreSQL DB ロール
accounts-group accounts-role

DB ロールを AD セキュリティグループにマッピングするときは、DB ロールに LOGIN 属性が設定され、必要なログインデータベースへの CONNECT 権限があることを確認する必要があります。

postgres => alter role accounts-role login; ALTER ROLE postgres => grant connect on database accounts-db to accounts-role;

管理者は AD セキュリティグループと PostgreSQL DB ロール間のマッピングの作成に進むことができるようになりました。

admin=>select pgadmap_set_mapping('accounts-group', 'accounts-role', <SID>, <Weight>);

AD セキュリティグループの SID の取得については、「PowerShell での Active Directory グループ SID の取得」を参照してください。

AD ユーザーが複数のグループに属している場合があります。その場合、AD ユーザーは DB ロールの権限を継承します。この権限は、最も高い重みでプロビジョニングされます。2 つのロールの重みが同じ場合、AD ユーザーは最近追加されたマッピングに対応する DB ロールの権限を継承します。個々の DB ロールの相対的なアクセス許可/権限を反映する重みを指定することをお勧めします。DB ロールのアクセス許可または権限が高いほど、マッピングエントリに関連付ける必要がある重みが高くなります。これにより、同じ重みを持つ 2 つのマッピングのあいまいさを回避できます。

次の表は、AD セキュリティグループから Aurora PostgreSQL DB ロールへのマッピングの例を示しています。

AD セキュリティグループ PosgreSQL DB ロール (重量)
accounts-group accounts-role 7
sales-group sales-role 10
dev-group dev-role 7

次の例では、user1 はより高い重みをもつため sales-role の権限を継承します。一方、user2 はこのコードのマッピングが accounts-role と同じ重みを共有する accounts-role の後に作成されたため、dev-role の権限を継承します。

ユーザーネーム セキュリティグループのメンバーシップ
user1 accounts-group sales-group
user2 accounts-group dev-group

マッピングを確立、一覧表示、およびクリアするための psql コマンドを以下に示します。現在、単一のマッピングエントリを変更することはできません。既存のエントリを削除し、マッピングを再作成する必要があります。

admin=>select pgadmap_set_mapping('accounts-group', 'accounts-role', 'S-1-5-67-890', 7); admin=>select pgadmap_set_mapping('sales-group', 'sales-role', 'S-1-2-34-560', 10); admin=>select pgadmap_set_mapping('dev-group', 'dev-role', 'S-1-8-43-612', 7); admin=>select * from pgadmap_read_mapping(); ad_sid | pg_role | weight | ad_grp -------------+----------------+--------+--------------- S-1-5-67-890 | accounts-role | 7 | accounts-group S-1-2-34-560 | sales-role | 10 | sales-group S-1-8-43-612 | dev-role | 7 | dev-group (3 rows)

AD ユーザー ID のログ記録/監査

現在のユーザーまたはセッションユーザーによって継承されたデータベースロールを確認するには、次のコマンドを使用します。

postgres=>select session_user, current_user; session_user | current_user -------------+-------------- dev-role | dev-role (1 row)

AD セキュリティプリンシパル ID を確認するには、次のコマンドを使用します。

postgres=>select principal from pg_stat_gssapi where pid = pg_backend_pid(); principal ------------------------- user1@example.com (1 row)

現在、AD ユーザー ID は監査ログに表示されません。log_connections パラメータを有効にすると、DB セッションの確立をログに記録できます。詳細については、「log_connections」を参照してください。この出力には、次に示すように AD ユーザー ID が含まれます。この出力に関連付けられたバックエンド PID は、属性アクションを実際の AD ユーザーに戻すのに役立ちます。

pgrole1@postgres:[615]:LOG: connection authorized: user=pgrole1 database=postgres application_name=psql GSS (authenticated=yes, encrypted=yes, principal=Admin@EXAMPLE.COM)

制限事項

  • Azure Active Directory として知られる Microsoft Entra ID はサポートされていません。

pg_ad_mapping 拡張機能の関数の使用

提供される pg_ad_mapping 拡張機能は、次の関数をサポートしています。

pgadmap_set_mapping

この関数は、AD セキュリティグループとデータベースロール間のマッピングを関連する重みで確立します。

構文

pgadmap_set_mapping( ad_group, db_role, ad_group_sid, weight)

引数

Parameter 説明
ad_group AD グループの名前。値を NULL または空の文字列にすることはできません。
db_role 指定された AD グループにマッピングされるデータベースロール。値を NULL または空の文字列にすることはできません。
ad_group_sid AD グループを一意に識別するために使用されるセキュリティ識別子。値は「S-1-」で始まり、NULL または空の文字列にすることはできません。詳しくは、「PowerShell での Active Directory グループ SID の取得」を参照してください。
weight データベースロールに関連付けられた重み。重みが最も高いロールは、ユーザーが複数のグループのメンバーである場合に優先されます。重みのデフォルト値は 1 です。

戻り型

None

使用に関する注意事項

この関数は、AD セキュリティグループからデータベースロールに新しいマッピングを追加します。DB クラスターのプライマリ DB インスタンスで実行できるのは、rds_superuser 権限を持つユーザーのみです。

postgres=> select pgadmap_set_mapping('accounts-group','accounts-role','S-1-2-33-12345-67890-12345-678',10); pgadmap_set_mapping (1 row)

pgadmap_read_mapping

この関数は、pgadmap_set_mapping 関数を使用して設定された AD セキュリティグループと DB ロール間のマッピングを一覧表示します。

構文

pgadmap_read_mapping()

引数

None

戻り型

Parameter 説明
ad_group_sid AD グループを一意に識別するために使用されるセキュリティ識別子。値は「S-1-」で始まり、NULL または空の文字列にすることはできません。詳細については、「PowerShell での Active Directory グループ SID の取得.accounts-role@example.com」を参照してください。
db_role 指定された AD グループにマッピングされるデータベースロール。値を NULL または空の文字列にすることはできません。
weight データベースロールに関連付けられた重み。重みが最も高いロールは、ユーザーが複数のグループのメンバーである場合に優先されます。重みのデフォルト値は 1 です。
ad_group AD グループの名前。値を NULL または空の文字列にすることはできません。

使用に関する注意事項

この関数を呼び出して、AD セキュリティグループと DB ロール間で使用可能なすべてのマッピングを一覧表示します。

postgres=> select * from pgadmap_read_mapping(); ad_sid | pg_role | weight | ad_grp ------------------------------------+---------------+--------+------------------ S-1-2-33-12345-67890-12345-678 | accounts-role | 10 | accounts-group (1 row) (1 row)

pgadmap_reset_mapping

この関数は、pgadmap_set_mapping 関数を使用して設定された 1 つまたはすべてのマッピングをリセットします。

構文

pgadmap_reset_mapping( ad_group_sid, db_role, weight)

引数

Parameter 説明
ad_group_sid AD グループを一意に識別するために使用されるセキュリティ識別子。
db_role 指定された AD グループにマッピングされるデータベースロール。
weight データベースロールに関連付けられた重み。

引数を指定しない場合、AD グループと DB ロール間のマッピングはすべてリセットされます。すべての引数を指定するか、何も指定しないかのいずれかにします。

戻り型

None

使用に関する注意事項

この関数を呼び出して、特定の AD グループから DB ロールへのマッピングを削除するか、すべてのマッピングをリセットします。この関数は、DB クラスターのプライマリ DB インスタンスで実行できるのは、rds_superuser 権限を持つユーザーのみです。

postgres=> select * from pgadmap_read_mapping(); ad_sid | pg_role | weight | ad_grp --------------------------------+--------------+-------------+------------------- S-1-2-33-12345-67890-12345-678 | accounts-role| 10 | accounts-group S-1-2-33-12345-67890-12345-666 | sales-role | 10 | sales-group (2 rows) postgres=> select pgadmap_reset_mapping('S-1-2-33-12345-67890-12345-678', 'accounts-role', 10); pgadmap_reset_mapping (1 row) postgres=> select * from pgadmap_read_mapping(); ad_sid | pg_role | weight | ad_grp --------------------------------+--------------+-------------+--------------- S-1-2-33-12345-67890-12345-666 | sales-role | 10 | sales-group (1 row) postgres=> select pgadmap_reset_mapping(); pgadmap_reset_mapping (1 row) postgres=> select * from pgadmap_read_mapping(); ad_sid | pg_role | weight | ad_grp --------------------------------+--------------+-------------+-------------- (0 rows)