組織政策可讓您透過程式輔助,集中控管組織的資源。組織政策管理員可以為整個組織設定政策,享有下列優勢:
- 集中控管,設定貴組織資源的使用限制。
- 為開發團隊定義及建立防護機制,確保團隊遵守法規。
- 協助專案擁有者和團隊快速行動,同時遵守法規。
Google Distributed Cloud (GDC) 實體隔離方案不提供控制台 UI 或專屬 CLI,無法建立及管理組織政策。您必須使用 Kubernetes API 或 kubectl CLI。
與身分與存取權管理的差異
身分與存取權管理 (IAM) 和組織政策可提供互補的存取權和管理功能:
- IAM 著重於授予權限。定義誰 (使用者、群組或服務帳戶等成員) 可對哪些資源 (資源範圍) 執行哪些動作 (角色)。透過 IAM 角色授予的權限會累加,且沒有拒絕規則。
- 組織政策著重於建立防護機制。管理員可以透過這類政策,為整個組織的資源設定程式輔助限制,例如停用特定服務,或使用屬性式存取控管 (ABAC),根據主體屬性限制資源修改。即使成員具備 IAM 角色,組織政策仍會優先封鎖作業。
事前準備
設定組織政策前,您必須要求必要權限並準備環境。
要求 IAM 角色
請與 IAM 機構組織管理員聯絡,根據您需要執行的工作,要求下列 IAM 角色:
- 受限服務政策管理員 (
gdchrestrictedservice-policy-admin):建立、更新及刪除受限服務政策。 - Restrict By Attributes Policy Admin (
gdchrestrictbyattributes-policy-admin):建立、更新及刪除以屬性為準的存取控管政策。
準備環境
產生 kubeconfig 檔案,設定 kubectl CLI 存取權。
設定政策
您可以在 GDC 設定兩種類型的組織政策:
- 受限服務政策 (
GDCHRestrictedService):限制您可以在叢集中使用或修改哪些服務。 - 以屬性為準的存取控管政策 (
GDCHRestrictByAttributes):根據從識別資訊提供者對應的主體屬性,有條件地限制叢集中的資源存取權。
設定受限服務政策
GDCHRestrictedService 政策類型可讓您封鎖特定 API,限制可在叢集中使用或修改的服務,例如將服務限制在特定專案,或在測試新服務時封鎖存取權。請在與服務資源相同的叢集中建立這項政策。您可以在叢集中為不同服務或專案建立多個政策執行個體。
GDCHRestrictedService 支援 CREATE、UPDATE 和 DELETE 作業。如要限制 GET 和 LIST 讀取作業,請使用 IAM 角色繫結授予及撤銷存取權。
設定受限服務政策:
定義政策資訊清單:
apiVersion: constraints.gatekeeper.sh/v1beta1 kind: GDCHRestrictedService metadata: name: POLICY_NAME spec: match: kinds: - apiGroups: - "API_GROUP" kinds: - "KIND" parameters: disabledOperations: - DISABLED_OPERATION更改下列內容:
POLICY_NAME:組織政策的名稱。API_GROUP:要限制的服務 API 群組,如下方支援的服務表格所示。KIND:要限制的資源種類,請參閱下方支援的服務表格。DISABLED_OPERATION:這項政策封鎖的作業群組。可以使用的值為CREATE、UPDATE和DELETE。disabledOperations欄位的預設值為*。如要完全停用服務,請列出CREATE、UPDATE和DELETE(並指定所有類型)。
根據預設,這項政策會套用至叢集中的所有命名空間。如要將政策範圍限定在特定命名空間或專案,請參閱「定義叢集內組織政策的範圍」。
GDCHRestrictedService政策支援 GDC 上的下列服務子集:服務 API 群組 種類 Marketplace marketplace.gdc.googMarketplaceServiceVertex AI Workbench aiplatform.gdc.googNotebook資料庫服務 - Postgres postgresql.dbadmin.gdc.googDBClusterBackupPlanImportRestore
Transfer Appliance system.gpc.gke.ioTransferApplianceRequest備份 backup.gdc.googBackupRepositoryManagerDataproc Container for Spark (Marketplace 服務) sparkoperator.k8s.ioSparkApplication如果服務在表格中列出多個種類 (例如資料庫服務),您可以只指定要限制的個別種類。舉例來說,您可以封鎖
Restore作業,但繼續允許DBCluster作業。以下範例會限制市集服務的更新:
apiVersion: constraints.gatekeeper.sh/v1beta1 kind: GDCHRestrictedService metadata: name: no-update-to-marketplace-service spec: match: kinds: - apiGroups: - "marketplace.gdc.goog" kinds: - MarketplaceService parameters: disabledOperations: - "UPDATE"使用 kubectl CLI 套用政策:
kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f POLICY_NAME.yaml更改下列內容:
CLUSTER_KUBECONFIG:要套用政策的叢集 kubeconfig 檔案POLICY_NAME:組織政策檔案的名稱
設定屬性式存取控管政策
GDCHRestrictByAttributes 政策類型可讓您建立 ABAC 政策,根據主體屬性有條件地限制資源存取權。舉例來說,您可以使用這類政策限制 Storage bucket 的寫入或修改作業,只有具備特定身分屬性 (例如 citizenship=USA 或 citizenship=UK) 的使用者或服務帳戶才能執行這些作業。
請在資源所在的叢集建立這項政策。您可以在叢集中為不同資源或專案建立多個政策執行個體。
設定屬性式存取控管政策:
建立修補 JSON 檔案,對應
IdentityProviderConfig資源的自訂身分屬性:cat <<EOF > attributeMapping-patch.json { "CUSTOM_ATTRIBUTE": "assertion[\"CUSTOM_ATTRIBUTE\"]" } EOF將
CUSTOM_ATTRIBUTE替換為要對應的身分屬性名稱,例如citizenship。修補
platform命名空間中的IdentityProviderConfig資源:kubectl --kubeconfig CLUSTER_KUBECONFIG patch \ IdentityProviderConfig IDENTITY_PROVIDER_CONFIG_NAME \ -n platform --type=json \ -p '[{"op":"add","path":"/spec/oidc/attributeMapping", "value": '"$(cat attributeMapping-patch.json)"'}]'更改下列內容:
CLUSTER_KUBECONFIG:識別資訊提供者所在叢集的 kubeconfig 檔案IDENTITY_PROVIDER_CONFIG_NAME:IdentityProviderConfig資源的名稱
定義政策資訊清單:
apiVersion: constraints.global.gatekeeper.sh/v1beta1 kind: GDCHRestrictByAttributes metadata: name: POLICY_NAME spec: match: kinds: - apiGroups: - "API_GROUP" kinds: - "KIND" parameters: attributes: - CUSTOM_ATTRIBUTE attributeValues: - ALLOWED_ATTRIBUTE_VALUE更改下列內容:
POLICY_NAME:組織政策的名稱。API_GROUP:要限制的資源 API 群組,例如object.gdc.goog。KIND:要限制的資源種類,例如Bucket。CUSTOM_ATTRIBUTE:從識別資訊提供者對應的自訂主體屬性,例如citizenship。ALLOWED_ATTRIBUTE_VALUE:自訂屬性的允許值,例如USA。如果主體的屬性不符合任何允許的值,要求就會遭到拒絕。
根據預設,這項政策會套用至叢集中的所有命名空間。如要將政策範圍限定在特定命名空間或專案,請參閱「定義叢集內組織政策的範圍」。
以下範例會限制只有具備
citizenship=USA或citizenship=UK屬性的主體,才能修改project-foo命名空間中的Bucket資源:apiVersion: constraints.global.gatekeeper.sh/v1beta1 kind: GDCHRestrictByAttributes metadata: name: restrict-by-citizenship spec: match: scope: Namespaced kinds: - apiGroups: - "object.gdc.goog" kinds: - Bucket namespaces: - project-foo parameters: attributes: - "citizenship" attributeValues: - "USA" - "UK"使用 kubectl CLI 套用政策:
kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f POLICY_NAME.yaml更改下列內容:
CLUSTER_KUBECONFIG:要套用政策的叢集 kubeconfig 檔案POLICY_NAME:組織政策檔案的名稱
定義叢集內組織政策的範圍
定義組織政策時,請決定政策應影響所有命名空間、僅影響特定命名空間,還是影響指定清單以外的所有命名空間。如要達到這個目的,請結合使用政策定義的 .spec.match.excludedNamespaces、.spec.match.namespaceSelector、.spec.match.namespaces 和 .spec.match.scope 參數。
如要進一步瞭解這些參數,請參閱組織政策比對部分頁面。舉例來說,如要只允許在具有 owner: dba-team 標籤的命名空間中建立資料庫,請建立下列政策:
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: GDCHRestrictedService
metadata:
name: db-restricted-to-dbas
spec:
match:
scope: Namespaced
namespaceSelector:
matchExpressions:
# We are restricting the use of the service in namespaces that
# don't have the owner: dba-team label
- key: owner
operator: NotIn
values:
- dba-team
kinds:
- apiGroups:
- "postgresql.dbadmin.gdc.goog"
kinds:
- DBCluster
- BackupPlan
- Import
- Restore
parameters:
disabledOperations:
- "UPDATE"
- "CREATE"
- "DELETE"
復原現有政策
如要停止強制執行現有政策,請使用 kubectl CLI 刪除政策。使用 kubeconfig 檔案,存取定義政策的叢集,以及與政策類型對應的 IAM 角色 (例如 gdchrestrictedservice-policy-admin 或 gdchrestrictbyattributes-policy-admin)。
刪除組織政策:
kubectl --kubeconfig CLUSTER_KUBECONFIG delete \
POLICY_TYPE/POLICY_NAME
更改下列內容:
CLUSTER_KUBECONFIG:組織政策所在叢集的 kubeconfig 檔案POLICY_TYPE:要刪除的組織政策類型,例如GDCHRestrictedService或GDCHRestrictByAttributesPOLICY_NAME:要刪除的組織政策名稱
在稽核模式中測試政策
您可以測試政策,而不強制執行。在推出政策前,請先測試政策,確保政策不會破壞現有系統,或預估行為的普及程度。如要新增測試,請在政策定義中新增 enforcementAction。這個參數有三個可能的值:
deny:強制執行政策。這是預設設定。dryrun:允許執行動作,但您可以在稽核記錄和政策審查狀態中看到違反政策。使用kubectl --kubeconfig CLUSTER_KUBECONFIG get POLICY_TYPE/POLICY_NAME檢查違規情形。warn:與dryrun相同,但測試也會針對觸發違反政策的要求顯示警告。
舉例來說,如要測試停用 Marketplace 的政策,請建立下列政策:
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: GDCHRestrictedService
metadata:
name: disable-marketplace-service-project-alice
spec:
enforcementAction: warn
match:
kinds:
- apiGroups: ["marketplace.gdc.goog"]
kinds: ["MarketplaceService"]