Kubernetes で Active Directory グループのサポートを統合する

ドキュメントのバージョンを選択します。

このページでは、Kubernetes にデプロイされた AlloyDB Omni で Active Directory グループベースの認証と認可を設定して管理する方法について説明します。Active Directory グループベースのサポートにより、Active Directory のユーザーのグループ メンバーシップに基づいて PostgreSQL ロールのメンバーシップの管理が自動化されます。これにより、ユーザー管理が効率化され、権限が同期されます。詳細については、Active Directory の概要をご覧ください。

このドキュメントは、Kubernetes マニフェスト ファイルの適用と kubectl コマンドライン ツールの使用に精通していることを前提としています。詳細については、コマンドライン ツール(kubectl)をご覧ください。

Active Directory 統合ワークフロー

Active Directory 統合は、次のワークフローで PostgreSQL 拡張機能(google_pg_auth)を使用して実装されます。

  1. ユーザーのログイン: ユーザーは、Generic Security Services Application Programming Interface(GSSAPI)を使用して、標準の Active Directory 認証情報で AlloyDB Omni に対して認証を行います。
  2. ロールの自動作成: ユーザーに対応する PostgreSQL ロールが存在しない場合、システムは自動的にロールを作成します(例: CREATE ROLE "user@REALM" WITH LOGIN;)。
  3. LDAP グループ チェック: システムは LDAP を使用して Active Directory に安全に接続し、ユーザーの現在のグループ メンバーシップを取得します。
  4. メンバーシップの同期: システムは、ユーザーの Active Directory グループと構成されたマッピングを比較します。

    • ユーザーがマッピングされた Active Directory グループに属しているものの、対応する PostgreSQL グループに属していない場合は、ユーザーにメンバーシップが付与されます。
    • ユーザーがマッピングされた Active Directory グループに属していないものの、対応する PostgreSQL グループに属している場合、ユーザーのメンバーシップは取り消されます。
  5. ログイン完了: ユーザーの接続が完了し、データベースにログインしています。ユーザーの権限は、ユーザーが属する 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 グループロールにデータベース権限(SELECTINSERT など)を手動で割り当てる必要があります。この統合ではメンバーシップのみが管理されます。次の例に示すように、グループ自体の権限は管理されません。

    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 カスタム リソースを適用する必要があります。

  1. 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 に kinitpsql がインストールされて、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_developerspostgres_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 認証は成功しているため、ユーザーのログインは成功します。そのセッションのグループ メンバーシップの同期のみが失敗します。

次のステップ