Mengintegrasikan dukungan grup Active Directory di Kubernetes

Pilih versi dokumentasi:

Halaman ini menjelaskan cara menyiapkan dan mengelola autentikasi dan otorisasi berbasis grup Active Directory di AlloyDB Omni yang di-deploy di Kubernetes. Dukungan berbasis grup Active Directory mengotomatiskan pengelolaan keanggotaan peran PostgreSQL berdasarkan keanggotaan grup pengguna di Active Directory Anda, yang menyederhanakan pengelolaan pengguna dan memastikan izin disinkronkan. Untuk mengetahui informasi selengkapnya, lihat Ringkasan Active Directory.

Dokumen ini mengasumsikan bahwa Anda sudah memahami cara menerapkan file manifes Kubernetes dan menggunakan alat command line kubectl. Untuk mengetahui informasi selengkapnya, lihat Alat command line (kubectl).

Alur kerja integrasi Active Directory

Integrasi Active Directory diimplementasikan menggunakan ekstensi PostgreSQL (google_pg_auth) dalam alur kerja berikut:

  1. Login pengguna: pengguna melakukan autentikasi ke AlloyDB Omni menggunakan kredensial Active Directory standar mereka menggunakan Generic Security Services Application Programming Interface (GSSAPI).
  2. Pembuatan peran otomatis: jika peran PostgreSQL yang sesuai untuk pengguna tidak ada, sistem akan membuatnya secara otomatis—misalnya, CREATE ROLE "user@REALM" WITH LOGIN;.
  3. Pemeriksaan grup LDAP: sistem terhubung dengan aman ke Active Directory Anda menggunakan LDAP untuk mengambil keanggotaan grup pengguna saat ini.
  4. Sinkronisasi keanggotaan: sistem membandingkan grup Active Directory pengguna dengan pemetaan yang Anda konfigurasi.

    • Jika pengguna berada di grup Active Directory yang dipetakan, tetapi tidak berada di grup PostgreSQL yang sesuai, pengguna akan diberi keanggotaan.
    • Jika pengguna tidak berada dalam grup Active Directory yang dipetakan, tetapi berada dalam grup PostgreSQL yang sesuai, keanggotaan pengguna akan dicabut.
  5. Login selesai: koneksi pengguna telah diselesaikan, dan pengguna telah login ke database. Izin pengguna ditentukan oleh peran PostgreSQL yang menjadi anggotanya, yang disinkronkan dengan status grup Active Directory-nya.

    Sinkronisasi ini terjadi secara otomatis pada setiap login pengguna, yang memastikan hak akses PostgreSQL mencerminkan status Active Directory Anda saat ini.

Sebelum memulai

Sebelum mengintegrasikan dukungan grup Active Directory dengan AlloyDB Omni, pastikan Anda memenuhi persyaratan berikut.

  • Autentikasi GSSAPI: Anda harus mengonfigurasi dan mengoperasikan autentikasi berbasis GSSAPI untuk instance AlloyDB Omni Anda. Untuk mengetahui informasi selengkapnya, lihat Mengintegrasikan Active Directory dengan AlloyDB Omni.
  • Peran grup PostgreSQL: Anda harus membuat peran grup PostgreSQL secara manual yang ingin dipetakan ke grup Active Directory, seperti yang ditunjukkan dalam contoh berikut:

    CREATE ROLE "postgres_developers";
    CREATE ROLE "postgres_read_only";
    
  • Izin: Anda harus menetapkan izin database secara manual—misalnya, SELECT dan INSERT—ke peran grup PostgreSQL ini. Integrasi hanya mengelola keanggotaan, tetapi tidak mengelola hak istimewa grup itu sendiri, seperti yang ditunjukkan dalam contoh berikut:

    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;
    

Mengonfigurasi dukungan grup Active Directory

Untuk mengonfigurasi dukungan grup Active Directory, Anda harus menerapkan UserDefinedAuthentication Resource Kustom di cluster database yang ada.

  1. Konfigurasi AlloyDB Omni menggunakan kredensial server LDAP. Terapkan manifes resource kustom autentikasi yang ditentukan pengguna berikut:

    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
    

    Lakukan penggantian berikut:

    • USER_DEFINED_AUTHENTICATION_NAME: nama UserDefinedConfiguration—misalnya, DB_CLUSTER_NAME-ad-auth.
    • DB_CLUSTER_NAMESPACE: namespace Kubernetes untuk rencana cadangan ini. Namespace harus cocok dengan namespace cluster database.
    • DB_CLUSTER_NAME: nama cluster database Anda, yang Anda tetapkan saat membuatnya.
    • LDAP_URI: URI server LDAP—misalnya—ldaps://ad.example.com:636.
    • LDAP_BASE_DN: DN dasar untuk penelusuran LDAP. (misalnya, DC=ad,DC=alloydb,DC=COM)
    • LDAP_BIND_DN: Distinguished Name (DN) untuk pengguna bind LDAP.
    • LDAP_PASSWORD_SECRET_REF: referensi ke secret Kubernetes dengan sandi LDAP. Kunci rahasia ini harus berupa password.
    • LDAPS_CERT_SECRET_REF: (Opsional) Referensi ke secret Kubernetes dengan sertifikat LDAPS. Kunci rahasia ini harus berupa ldap.crt.
    • CACHE_TTL_SECONDS: (Opsional) Waktu maksimum untuk menunggu sebelum memicu sinkronisasi keanggotaan grup LDAP dalam hitungan detik. Defaultnya adalah 3.600 detik.
    • LDAP_CONNECTION_TIMEOUT: (Opsional) Waktu tunggu koneksi LDAP dalam milidetik. Defaultnya adalah 5.000 md.

    Lihat contoh berikut:

    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
    

Mengelola pemetaan grup

Anda dapat membuat dan mengelola pemetaan antara grup Active Directory dan peran PostgreSQL menggunakan fungsi SQL.

Login ke cluster dan muat ekstensi

  • Hubungkan ke AlloyDB Omni yang berjalan di Kubernetes.

    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
    

Membuat pemetaan grup

Untuk memetakan grup Active Directory ke peran grup PostgreSQL yang sudah Anda buat, gunakan fungsi map_ad_group().

SELECT google_pg_auth.map_ad_group(ad_group_name TEXT, ad_group_sid TEXT, pg_role_name TEXT);

Dalam contoh berikut, grup Active Directory ad-developers dipetakan ke peran PostgreSQL pg-developers:

SELECT google_pg_auth.map_ad_group('ad-developers', 'S-1-5-21-.....', 'postgres_read_only');

Untuk mengambil SID grup tertentu di Active Directory, gunakan perintah berikut di server Active Directory Anda:

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

Menghapus pemetaan grup

Untuk menghapus pemetaan yang ada, gunakan fungsi unmap_ad_group(), yang menghentikan sinkronisasi untuk grup tersebut. Fungsi unmap_ad_group() tidak menghapus pengguna dari grup PostgreSQL jika mereka sudah menjadi anggota.

SELECT google_pg_auth.unmap_ad_group(ad_group_sid TEXT, pg_role_name TEXT);

Lihat contoh berikut:

SELECT google_pg_auth.unmap_ad_group('S-1-5-21-.....', ''postgres_read_only'');

Membuat pemetaan pengguna

Untuk memetakan pengguna Active Directory individual ke peran PostgreSQL yang telah Anda buat, gunakan fungsi map_ad_user().

SELECT google_pg_auth.map_ad_user(ad_username TEXT, pg_role_name TEXT);

Misalnya, untuk memetakan pengguna Active Directory quinn@google.com ke peran PostgreSQL pg-developers, lakukan hal berikut:

SELECT google_pg_auth.map_ad_user('quinn@google.com', ''postgres_read_only'');

Menghapus pemetaan pengguna

Untuk menghapus pemetaan yang ada, gunakan fungsi unmap_ad_user().

SELECT google_pg_auth.unmap_ad_user(ad_username TEXT, pg_role_name TEXT);

Misalnya, untuk membatalkan pemetaan pengguna Active Directory quinn@google.com dari peran PostgreSQL pg-developers, lakukan hal berikut:

SELECT google_pg_auth.unmap_ad_user('quinn@google.com', ''postgres_read_only'');

Terhubung ke database AlloyDB Omni

Login ke database AlloyDB Omni menggunakan pengguna Active Directory. Anda harus mengaktifkan kinit di klien tempat Anda terhubung.

Dalam contoh berikut, pod postgres-client telah menginstal kinit dan psql serta dikonfigurasi untuk terhubung ke cluster AlloyDB Omni menggunakan klien psql.

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=# 

Akses Anda di database AlloyDB Omni ditentukan secara otomatis berdasarkan hal berikut:

  • Keanggotaan Anda saat ini di grup Active Directory.
  • Pemetaan yang ditentukan oleh administrator antara grup Active Directory tersebut dan peran PostgreSQL.
  • Izin yang diberikan oleh administrator ke peran PostgreSQL tersebut.

Jika ini adalah pertama kalinya Anda terhubung, peran pengguna PostgreSQL Anda (your_ad_user@YOURDOMAIN.COM) akan dibuat secara otomatis.

Setiap kali Anda login, sistem akan memeriksa keanggotaan grup Active Directory Anda saat ini dan memperbarui keanggotaan peran PostgreSQL yang sesuai agar cocok. Anda tidak perlu melakukan tindakan khusus apa pun agar sinkronisasi ini terjadi.

Contoh koneksi database

Dalam contoh berikut, pengguna Quinn adalah bagian dari grup Active Directory bernama ad_developers. Administrator memetakan ad_developers ke peran postgres bernama postgres_read_only. Peran ini memiliki akses baca ke tabel bernama sales. Saat pengguna login, mereka dapat mengakses tabel.

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

Dalam contoh berikut, Quinn dihapus dari grup ad_developers di Active Directory.

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

Batasan

  • Pengelolaan grup dan izin secara manual: fitur ini hanya mengotomatiskan keanggotaan pengguna dalam grup PostgreSQL yang ada. Pembuatan grup tersebut dan pemberian izinnya adalah tugas administratif manual.
  • Latensi sinkronisasi: keanggotaan hanya disinkronkan saat pengguna login. Perubahan apa pun yang dilakukan pada keanggotaan grup pengguna di Active Directory hanya akan ditampilkan di AlloyDB Omni pada sesi login pengguna berikutnya.
  • Performa: pencarian LDAP menambahkan sedikit latensi ke proses login pengguna awal. Caching membantu mengurangi latensi ini untuk login berikutnya dalam waktu aktif (auth_cache_ttl_sec) yang dikonfigurasi.
  • Penanganan error: jika server LDAP tidak dapat dijangkau atau jika terjadi error lain selama proses sinkronisasi, AlloyDB Omni akan mencatat error tersebut. Namun, login pengguna akan tetap berhasil karena autentikasi GSSAPI berhasil. Hanya sinkronisasi keanggotaan grup untuk sesi tersebut yang akan gagal.

Langkah berikutnya