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 セキュリティグループの 拡張機能を設定する前に、次のものがあることを確認してください。
-
PostgreSQL DB クラスターの Kerberos 認証をセットアップします。詳細については、「PostgreSQL DB クラスターの Kerberos 認証のセットアップ」を参照してください。
注記
AD セキュリティグループの場合は、この設定手順の「ステップ 7: Kerberos プリンシパルの PostgreSQL ユーザーを作成する」をスキップします。
ドメイン内の DB クラスターの管理。詳細については、「ドメインでの DB クラスターの管理」を参照してください。
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
拡張機能をセットアップするには
AWS Management Console にサインインし、Amazon RDS コンソール (https://console.aws.amazon.com/rds/
) を開きます。 -
ナビゲーションペインで、Aurora PostgreSQL DB クラスターのライターインスタンスを選択します。
-
Aurora PostgreSQL DB クラスターライターインスタンスの [設定] タブを開きます。インスタンスの詳細の中から、パラメータグループのリンクを見つけてください。
-
リンクを選択して、Aurora PostgreSQL DB クラスターに関連するカスタムパラメータを開きます。
-
[Parameters] (パラメータ) 検索フィールドに
shared_pre
と入力し、shared_preload_libraries
パラメータを検索します。 -
プロパティ値にアクセスするには、[Edit parameters] (パラメータの編集) を選択します。
-
[Values] (値) フィールドのリストに
pg_ad_mapping
を追加します。値のリスト内の項目を区切るにはカンマを使用します。 Aurora PostgreSQL DB クラスターのライターインスタンスを再起動して、
shared_preload_libraries
パラメータの変更を有効にします。インスタンスが使用可能になったら、
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;
psql
セッションを終了します。labdb=>
\q
pg_ad_mapping をセットアップするには
AWS CLI を使用して pg_ad_mapping をセットアップするには、次の手順に示すように、modify-db-parameter-group オペレーションを呼び出して、カスタムパラメータグループにこのパラメータを追加します。
次の 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" \ --regionaws-region
-
次の AWS CLI コマンドを使用して Aurora PostgreSQL DB クラスターのライターインスタンスを再起動し、pg_ad_mapping ライブラリを初期化します。
aws rds reboot-db-instance \ --db-instance-identifier
writer-instance
\ --regionaws-region
インスタンスが使用可能になると、
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;
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 databaseaccounts-db
toaccounts-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)