本頁說明如何設定及管理在 Kubernetes 上部署的 AlloyDB Omni 中,以 Active Directory 群組為基礎的驗證和授權。Active Directory 群組支援功能可根據使用者在 Active Directory 中的群組成員資格,自動管理 PostgreSQL 角色成員資格,簡化使用者管理作業,並確保權限同步。詳情請參閱「Active Directory 總覽」。
本文假設您已熟悉如何套用 Kubernetes 資訊清單檔案,以及如何使用 kubectl 指令列工具。詳情請參閱「指令列工具 (kubectl)」。
Active Directory 整合工作流程
Active Directory 整合功能是透過 PostgreSQL 擴充功能 (google_pg_auth
) 實作,工作流程如下:
- 使用者登入:使用者透過一般安全性服務應用程式設計介面 (GSSAPI),使用標準 Active Directory 憑證向 AlloyDB Omni 進行驗證。
- 自動建立角色:如果使用者沒有對應的 PostgreSQL 角色,系統會自動建立一個,例如
CREATE ROLE "user@REALM" WITH LOGIN;
。 - LDAP 群組檢查:系統會使用 LDAP 安全地連線至 Active Directory,擷取使用者目前的群組成員資格。
成員資格同步處理:系統會比較使用者的 Active Directory 群組與您設定的對應。
- 如果使用者位於對應的 Active Directory 群組中,但不在對應的 PostgreSQL 群組中,系統會授予使用者成員資格。
- 如果使用者不在對應的 PostgreSQL 群組中,但屬於已對應的 Active Directory 群組,系統會撤銷該使用者的成員資格。
登入完成:使用者連線完成,並登入資料庫。使用者的權限取決於所屬的 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";
權限:您必須手動將資料庫權限 (例如
SELECT
和INSERT
) 指派給這些 PostgreSQL 群組角色。這項整合功能只會管理成員資格,但不會管理群組本身的權限,如下例所示: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 命名空間。 命名空間必須與資料庫叢集的命名空間相符。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
:參照 Kubernetes 密碼,其中包含 LDAP 密碼。這個密鑰的金鑰必須是password
。LDAPS_CERT_SECRET_REF
:(選用) 參照具有 LDAPS 憑證的 Kubernetes 密碼。這個密鑰的鍵必須是ldap.crt
。CACHE_TTL_SECONDS
:(選用) 觸發 LDAP 群組成員資格同步處理前,等待的最長時間 (以秒為單位)。預設值為 3600 秒。LDAP_CONNECTION_TIMEOUT
:(選用) LDAP 連線逾時時間 (以毫秒為單位)。預設值為 5000 毫秒。
請參閱以下範例:
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);
在下列範例中,ad-developers
Active Directory 群組會對應至 pg-developers
PostgreSQL 角色:
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()
函式,停止該群組的同步處理。如果使用者已是 PostgreSQL 群組的成員,unmap_ad_group()
函式不會將他們從群組中移除。
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);
舉例來說,如要將 quinn@google.com
Active Directory 使用者對應至 pg-developers
PostgreSQL 角色,請執行下列操作:
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);
舉例來說,如要取消將 quinn@google.com
Active Directory 使用者對應至 pg-developers
PostgreSQL 角色,請執行下列操作:
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 整合問題。