このページでは、Kubernetes にデプロイされた AlloyDB Omni で Active Directory グループベースの認証と認可を設定して管理する方法について説明します。Active Directory グループベースのサポートにより、Active Directory のユーザーのグループ メンバーシップに基づいて PostgreSQL ロールのメンバーシップの管理が自動化されます。これにより、ユーザー管理が効率化され、権限が同期されます。詳細については、Active Directory の概要をご覧ください。
このドキュメントは、Kubernetes マニフェスト ファイルの適用と kubectl コマンドライン ツールの使用に精通していることを前提としています。詳細については、コマンドライン ツール(kubectl)をご覧ください。
Active Directory 統合ワークフロー
Active Directory 統合は、次のワークフローで PostgreSQL 拡張機能(google_pg_auth
)を使用して実装されます。
- ユーザーのログイン: ユーザーは、Generic Security Services Application Programming Interface(GSSAPI)を使用して、標準の Active Directory 認証情報で AlloyDB Omni に対して認証を行います。
- ロールの自動作成: ユーザーに対応する PostgreSQL ロールが存在しない場合、システムは自動的にロールを作成します(例:
CREATE ROLE "user@REALM" WITH LOGIN;
)。 - LDAP グループ チェック: システムは LDAP を使用して Active Directory に安全に接続し、ユーザーの現在のグループ メンバーシップを取得します。
メンバーシップの同期: システムは、ユーザーの Active Directory グループと構成されたマッピングを比較します。
- ユーザーがマッピングされた Active Directory グループに属しているものの、対応する PostgreSQL グループに属していない場合は、ユーザーにメンバーシップが付与されます。
- ユーザーがマッピングされた Active Directory グループに属していないものの、対応する PostgreSQL グループに属している場合、ユーザーのメンバーシップは取り消されます。
ログイン完了: ユーザーの接続が完了し、データベースにログインしています。ユーザーの権限は、ユーザーが属する PostgreSQL ロールによって決定されます。このロールは、Active Directory グループのステータスと同期されます。
この同期はユーザーがログインするたびに自動的に行われるため、PostgreSQL のアクセス権は Active Directory の現在の状態を確実に反映します。
始める前に
Active Directory グループのサポートを AlloyDB Omni と統合する前に、次の要件を満たしていることを確認してください。
- GSSAPI 認証: AlloyDB Omni インスタンスで GSSAPI ベースの認証が構成され、動作している必要があります。詳細については、Active Directory と AlloyDB Omni を統合するをご覧ください。
PostgreSQL グループロール: 次の例に示すように、Active Directory グループにマッピングする PostgreSQL グループロールを手動で作成する必要があります。
CREATE ROLE "postgres_developers"; CREATE ROLE "postgres_read_only";
権限: これらの PostgreSQL グループロールにデータベース権限(
SELECT
やINSERT
など)を手動で割り当てる必要があります。この統合ではメンバーシップのみが管理されます。次の例に示すように、グループ自体の権限は管理されません。GRANT SELECT ON ALL TABLES IN SCHEMA sales TO postgres_read_only; GRANT USAGE ON SCHEMA finance TO postgres_developers; GRANT USAGE ON SCHEMA sales TO postgres_read_only; GRANT SELECT, INSERT ON finance.transactions TO postgres_developers;
Active Directory グループのサポートを構成する
Active Directory グループのサポートを構成するには、既存のデータベース クラスタに UserDefinedAuthentication
カスタム リソースを適用する必要があります。
LDAP サーバーの認証情報を使用して AlloyDB Omni を構成します。次のユーザー定義の認証カスタム リソース マニフェストを適用します。
apiVersion: alloydbomni.dbadmin.goog/v1 kind: UserDefinedAuthentication metadata: name: USER_DEFINED_AUTHENTICATION_NAME namespace: DB_CLUSTER_NAMESPACE spec: dbclusterRef: name: DB_CLUSTER_NAME keytabSecretRef: name: KEYTAB_SECRET_NAME pgHbaEntries: PG_HBA_ENTRIES pgIdentEntries: PG_IDENT_ENTRIES ldapConfiguration: enableGroupMapping: true ldapURI: LDAP_URI ldapBaseDN: LDAP_BASE_DN ldapBindDN: LDAP_BIND_DN cacheTTLSeconds: CACHE_TTL_SECONDS ldap_connection_timeout_ms: LDAP_CONNECTION_TIMEOUT ldapBindPasswordSecretRef: name: LDAP_PASSWORD_SECRET_REF ldapsCertificateSecretRef: name: LDAPS_CERT_SECRET_REF
次のように置き換えます。
USER_DEFINED_AUTHENTICATION_NAME
: UserDefinedConfiguration の名前(例:DB_CLUSTER_NAME-ad-auth
)。DB_CLUSTER_NAMESPACE
: このバックアップ プランの Kubernetes Namespace。Namespace は、データベース クラスタの Namespace と一致する必要があります。DB_CLUSTER_NAME
: データベース クラスタの名前。作成時に割り当てたものです。LDAP_URI
: LDAP サーバーの URI(例:ldaps://ad.example.com:636
)。LDAP_BASE_DN
: LDAP 検索のベース DN(例: DC=ad,DC=alloydb,DC=COM)。LDAP_BIND_DN
: LDAP バインド ユーザーの識別名(DN)。LDAP_PASSWORD_SECRET_REF
: LDAP パスワードによる Kubernetes Secret への参照。この Secret のキーはpassword
である必要があります。LDAPS_CERT_SECRET_REF
: (省略可)LDAPS 証明書による Kubernetes Secret への参照。この Secret のキーはldap.crt
である必要があります。CACHE_TTL_SECONDS
: (省略可)LDAP グループ メンバーシップの同期をトリガーするまでの最大待機時間(秒単位)。デフォルト値は 3,600 秒です。LDAP_CONNECTION_TIMEOUT
: (省略可)LDAP 接続のタイムアウト時間(ミリ秒単位)。デフォルトは 5,000 ms です。
次の例をご覧ください。
apiVersion: v1 kind: Secret metadata: name: ldaps-secret type: Opaque data: ldap.crt: LDAPS_CERTIFICATE_CONTENT_BASE64_ENCODED --- apiVersion: v1 kind: Secret metadata: name: ldap-password-dbcluster-sample type: Opaque data: password: LDAPS_PASSWORD_CONTENT_BASE64_ENCODED --- apiVersion: v1 kind: Secret metadata: name: db-pw-dbcluster-sample type: Opaque data: dbcluster-sample: POSTGRES_PASSWORD --- apiVersion: alloydbomni.dbadmin.goog/v1 kind: DBCluster metadata: name: dbcluster-sample spec: databaseVersion: 16.8.0 primarySpec: adminUser: passwordRef: name: db-pw-dbcluster-sample resources: memory: 5Gi cpu: 1 disks: - name: DataDisk size: 10Gi --- apiVersion: v1 kind: Secret metadata: name: db-keytab-dbcluster-sample type: Opaque data: krb5.keytab: | DUMMY_KEYTAB --- apiVersion: alloydbomni.dbadmin.goog/v1 kind: UserDefinedAuthentication metadata: name: dbcluster-sample-ad-auth spec: dbclusterRef: name: dbcluster-sample keytabSecretRef: name: db-keytab-dbcluster-sample pgHbaEntries: - hostgssenc all all 0.0.0.0/0 gss - hostgssenc all all ::1/128 gss - hostssl all all 0.0.0.0/0 scram-sha-256 - hostssl all all ::/0 scram-sha-256 ldapConfiguration: enableGroupMapping: true ldapURI: ldaps://ad.alloydb.com:636 ldapBaseDN: DC=ad,DC=alloydb,DC=COM ldapBindDN: read-only-admin@ad.alloydb.com cacheTTLSeconds: 60 ldapBindPasswordSecretRef: name: ldap-password-dbcluster-sample ldapsCertificateSecretRef: name: ldaps-secret
グループ マッピングを管理する
SQL 関数を使用して、Active Directory グループと PostgreSQL ロール間のマッピングを作成して管理できます。
クラスタにログインして拡張機能を読み込む
Kubernetes で実行されている AlloyDB Omni に接続する
export DBPOD=`kubectl get pod --selector=alloydbomni.internal.dbadmin.goog/dbcluster=DB_CLUSTER_NAME,alloydbomni.internal.dbadmin.goog/task-type=database -n DB_CLUSTER_NAMESPACE -o jsonpath='{.items[0].metadata.name}'` kubectl exec -ti $DBPOD -n DB_CLUSTER_NAMESPACE -c database -- psql -h localhost -U postgres postgres=# CREATE EXTENSION google_pg_auth; CREATE EXTENSION
グループ マッピングを作成する
Active Directory グループを作成済みの PostgreSQL グループロールにマッピングするには、map_ad_group()
関数を使用します。
SELECT google_pg_auth.map_ad_group(ad_group_name TEXT, ad_group_sid TEXT, pg_role_name TEXT);
次の例では、Active Directory グループ ad-developers
が PostgreSQL ロール pg-developers
にマッピングされています。
SELECT google_pg_auth.map_ad_group('ad-developers', 'S-1-5-21-.....', 'postgres_read_only');
Active Directory の特定のグループの SID を取得するには、Active Directory サーバーで次のコマンドを使用します。
C:\Users\Admin> Get-ADGroup -Identity ad-developers | select SID SID ----------------------------------------------- S-1-5-21-3168537779-1985441202-1799118680-1612
グループ マッピングを削除する
既存のマッピングを削除するには、unmap_ad_group()
関数を使用します。この関数は、対象のグループの同期を停止します。unmap_ad_group()
関数は、ユーザーがすでにメンバーである場合、PostgreSQL グループからユーザーを削除しません。
SELECT google_pg_auth.unmap_ad_group(ad_group_sid TEXT, pg_role_name TEXT);
次の例をご覧ください。
SELECT google_pg_auth.unmap_ad_group('S-1-5-21-.....', ''postgres_read_only'');
ユーザー マッピングを作成する
個別の Active Directory ユーザーを作成済みの PostgreSQL ロールにマッピングするには、map_ad_user()
関数を使用します。
SELECT google_pg_auth.map_ad_user(ad_username TEXT, pg_role_name TEXT);
たとえば、Active Directory ユーザー quinn@google.com
を PostgreSQL ロール pg-developers
にマッピングするには、次の操作を行います。
SELECT google_pg_auth.map_ad_user('quinn@google.com', ''postgres_read_only'');
ユーザー マッピングを削除する
既存のマッピングを削除するには、unmap_ad_user()
関数を使用します。
SELECT google_pg_auth.unmap_ad_user(ad_username TEXT, pg_role_name TEXT);
たとえば、Active Directory ユーザー quinn@google.com
の PostgreSQL ロール pg-developers
へのマッピングを解除するには、次の操作を行います。
SELECT google_pg_auth.unmap_ad_user('quinn@google.com', ''postgres_read_only'');
AlloyDB Omni データベースに接続する
Active Directory ユーザーを使用して AlloyDB Omni データベースにログインします。接続するクライアントで kinit
が有効になっている必要があります。
次の例では、postgres-client
Pod に kinit
と psql
がインストールされて、psql
クライアントを使用して AlloyDB Omni クラスタに接続するように構成されています。
root@postgres-client:/# kinit AD_USER_NAME Password for user1REALM: root@postgres-client:/# psql -h ALLOYDB_SERVER_HOST_NAME -U AD_USER_NAME -d postgres psql (16.6 (Ubuntu 16.6-0ubuntu0.24.04.1), server 16.3) GSSAPI-encrypted connection Type "help" for help. user1=#
AlloyDB Omni データベースでのアクセス権は、次の条件に基づいて自動的に決定されます。
- Active Directory グループの現在のメンバーシップ。
- 管理者が定義した Active Directory グループと PostgreSQL ロールのマッピング。
- 管理者がこれらの PostgreSQL ロールに付与した権限。
初めて接続する場合は、PostgreSQL ユーザーロール(your_ad_user@YOURDOMAIN.COM
)が自動的に作成されます。
ログインするたびに、システムは現在の Active Directory グループ メンバーシップを確認し、対応する PostgreSQL ロール メンバーシップを一致するように更新します。この同期を行うために、特別な操作を行う必要はありません。
データベース接続の例
次の例では、ユーザー Quinn は ad_developers
という名前の Active Directory グループに属しています。管理者は ad_developers
を postgres_read_only
という名前の postgres ロールにマッピングしました。このロールには、sales
という名前のテーブルに対する読み取りアクセス権が付与されています。ユーザーがログインすると、テーブルにアクセスできます。
root@postgres-client:/# kinit quinnREALM Password for quinn@YOUR.REALM: root@postgres-client:/# psql -h ALLOYDB_SERVER_HOST_NAME -U quinnREALM -d postgres psql (16.6 (Ubuntu 16.6-0ubuntu0.24.04.1), server 16.3) GSSAPI-encrypted connection Type "help" for help. postgres=# select * from sales; // Query will be run successfully
次の例では、Quinn が Active Directory の ad_developers
グループから削除されています。
root@postgres-client:/# kinit quinnREALM Password for quinn@YOUR.REALM: root@postgres-client:/# psql -h ALLOYDB_SERVER_HOST_NAME -U quinnREALM -d postgres psql (16.6 (Ubuntu 16.6-0ubuntu0.24.04.1), server 16.3) GSSAPI-encrypted connection Type "help" for help. postgres=# select * from sales; // Query will fail
制限事項
- グループと権限の手動管理: この機能は、既存の PostgreSQL グループのユーザー メンバーシップのみを自動化します。これらのグループの作成と権限の付与は、手動での管理作業です。
- 同期の遅延: メンバーシップはユーザーがログインしたときにのみ同期されます。Active Directory でユーザーのグループ メンバーシップを変更しても、AlloyDB Omni に反映されるのは、ユーザーが次にログインしたときのみです。
- パフォーマンス: LDAP 検索により、ユーザーの初回ログイン プロセスにわずかにレイテンシが発生します。キャッシュ保存によって、構成された有効期間(
auth_cache_ttl_sec
)内の後続のログインでこのレイテンシを軽減できます。 - エラー処理: LDAP サーバーにアクセスできない場合や、同期プロセス中に他のエラーが発生した場合、AlloyDB Omni はエラーをログに記録します。ただし、GSSAPI 認証は成功しているため、ユーザーのログインは成功します。そのセッションのグループ メンバーシップの同期のみが失敗します。
次のステップ
- Active Directory グループのサポートを AlloyDB Omni と統合する。
- Active Directory ユーザーのサポートを AlloyDB Omni と統合する。
- Kubernetes で Active Directory ユーザーのサポートを統合する。
- AlloyDB Omni での Active Directory 統合のトラブルシューティング。