設定機構政策

組織政策可讓您透過程式輔助,集中控管組織的資源。組織政策管理員可以為整個組織設定政策,享有下列優勢:

  • 集中控管,設定貴組織資源的使用限制。
  • 為開發團隊定義及建立防護機制,確保團隊遵守法規。
  • 協助專案擁有者和團隊快速行動,同時遵守法規。

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):建立、更新及刪除以屬性為準的存取控管政策。

準備環境

設定政策

您可以在 GDC 設定兩種類型的組織政策:

  • 受限服務政策 (GDCHRestrictedService):限制您可以在叢集中使用或修改哪些服務。
  • 以屬性為準的存取控管政策 (GDCHRestrictByAttributes):根據從識別資訊提供者對應的主體屬性,有條件地限制叢集中的資源存取權。

設定受限服務政策

GDCHRestrictedService 政策類型可讓您封鎖特定 API,限制可在叢集中使用或修改的服務,例如將服務限制在特定專案,或在測試新服務時封鎖存取權。請在與服務資源相同的叢集中建立這項政策。您可以在叢集中為不同服務或專案建立多個政策執行個體。

GDCHRestrictedService 支援 CREATE、UPDATE 和 DELETE 作業。如要限制 GET 和 LIST 讀取作業,請使用 IAM 角色繫結授予及撤銷存取權。

設定受限服務政策:

  1. 定義政策資訊清單:

    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.goog MarketplaceService
    Vertex AI Workbench aiplatform.gdc.goog Notebook
    資料庫服務 - Postgres postgresql.dbadmin.gdc.goog
    • DBCluster
    • BackupPlan
    • Import
    • Restore
    Transfer Appliance system.gpc.gke.io TransferApplianceRequest
    備份 backup.gdc.goog BackupRepositoryManager
    Dataproc Container for Spark (Marketplace 服務) sparkoperator.k8s.io SparkApplication

    如果服務在表格中列出多個種類 (例如資料庫服務),您可以只指定要限制的個別種類。舉例來說,您可以封鎖 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"
    
  2. 使用 kubectl CLI 套用政策:

    kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f POLICY_NAME.yaml
    

    更改下列內容:

    • CLUSTER_KUBECONFIG:要套用政策的叢集 kubeconfig 檔案
    • POLICY_NAME:組織政策檔案的名稱

設定屬性式存取控管政策

GDCHRestrictByAttributes 政策類型可讓您建立 ABAC 政策,根據主體屬性有條件地限制資源存取權。舉例來說,您可以使用這類政策限制 Storage bucket 的寫入或修改作業,只有具備特定身分屬性 (例如 citizenship=USA 或 citizenship=UK) 的使用者或服務帳戶才能執行這些作業。

請在資源所在的叢集建立這項政策。您可以在叢集中為不同資源或專案建立多個政策執行個體。

設定屬性式存取控管政策:

  1. 建立修補 JSON 檔案,對應 IdentityProviderConfig 資源的自訂身分屬性:

    cat <<EOF > attributeMapping-patch.json
    {
      "CUSTOM_ATTRIBUTE": "assertion[\"CUSTOM_ATTRIBUTE\"]"
    }
    EOF
    

    將 CUSTOM_ATTRIBUTE 替換為要對應的身分屬性名稱,例如 citizenship。

  2. 修補 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 資源的名稱
  3. 定義政策資訊清單:

    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"
    
  4. 使用 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 或 GDCHRestrictByAttributes

  • POLICY_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"]