在 Autopilot 模式中控管特殊權限工作負載的許可

如要在 Google Kubernetes Engine (GKE) Autopilot 模式中執行特殊權限工作負載,請在叢集中安裝這些工作負載的許可清單。本文說明如何執行下列工作:

  • 設定 GKE,在 Autopilot 模式中僅執行特定特殊權限工作負載。
  • 為特殊權限工作負載安裝許可清單。

本文適用於下列角色:

  • 資安工程師:確保第三方工作負載必須加入許可清單,才能在叢集上執行,且來源必須經 GKE 核准。
  • 平台工程師:希望在叢集上啟用第三方工作負載,讓應用程式團隊順利運作。

您應該已熟悉下列概念:

關於 Autopilot 中的特殊權限工作負載

Autopilot 模式會對工作負載強制執行一組預設限制,以提升資安態勢。您可以安裝與這些工作負載對應的許可清單,修改這些限制,以執行特定特殊權限工作負載。根據預設,Autopilot 可讓您安裝 Autopilot 合作夥伴和特定開放原始碼專案的許可清單。符合資格的 GKE 客戶也可以建立許可清單,允許上傳至 Cloud Storage bucket 的客戶自有特殊權限工作負載。

每個許可清單都是一個檔案,與特定特殊權限工作負載相符。如要執行特殊權限工作負載,請按照下列步驟操作:

  1. 設定叢集,允許從特定路徑安裝許可清單。根據預設,系統支援 Autopilot 合作夥伴和已核准開放原始碼專案的所有許可清單。
  2. 在叢集中建立 AllowlistSynchronizer,以便安裝許可清單並保持最新狀態。

特殊權限工作負載和許可清單的錯誤和功能要求

特殊權限工作負載的擁有者負責建立、開發及維護工作負載和許可清單。如果遇到錯誤,或想針對特殊權限工作負載或許可清單提出功能要求,請與對應的擁有者聯絡。

事前準備

開始之前,請確認您已執行下列工作:

  • 啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果先前已安裝 gcloud CLI,請執行 gcloud components update 指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文件中的指令。

需求條件

  • AllowlistSynchronizer 自訂資源需要 GKE 1.32.2-gke.1652000 以上版本。
  • 您必須知道要在叢集中執行哪些特殊權限工作負載。
  • 如要修改叢集的許可清單路徑設定,叢集必須執行 GKE 1.35 以上版本。

設定叢集的許可清單路徑

本節說明如何設定叢集,支援從一組核准的路徑安裝許可清單。根據預設,Autopilot 支援安裝 GKE 合作夥伴和核准開放原始碼專案的許可清單。您可以修改個別叢集的預設設定。您也可以使用組織政策,為整個組織、資料夾或專案指定核准的許可清單來源。

  1. 找出要新增至叢集的許可清單檔案路徑。建立或更新叢集時,您可以指定多個路徑。您也可以指定空字串 (而非路徑),禁止從任何來源安裝許可清單。如要進一步瞭解可指定的路徑,請參閱「許可清單路徑」。

  2. 如要控管叢集核准的許可清單來源,請在建立或更新 Autopilot 或 Standard 叢集時,使用 --autopilot-privileged-admission 旗標,如以下指令所示:

    gcloud container clusters create-auto CLUSTER_NAME \
        --location=LOCATION \
        --autopilot-privileged-admission=ALLOWLIST1_PATH,ALLOWLIST2_PATH,...
    

    更改下列內容:

    • CLUSTER_NAME:新叢集的名稱。
    • LOCATION:叢集控制層的位置,例如 us-central1。
    • ALLOWLIST1_PATH,ALLOWLIST2_PATH,...:逗號分隔的清單,用於將檔案或目錄加入許可清單。例如:gke://*,gs://my-agent/privileged-logging-agent.yaml。您也可以指定空字串 (""),禁止從任何來源安裝許可清單。

如果您更新現有叢集,但未指定 --autopilot-privileged-admission 旗標,該叢集的現有路徑設定不會變更。每次更新叢集時,不一定要指定這個旗標。

叢集建立或更新作業完成後,您可以建立 AllowlistSynchronizer,從指定路徑安裝許可清單。

建立新的 AllowlistSynchronizer

如要執行具特殊權限的工作負載,請將對應許可清單檔案的路徑,新增至 YAML 檔案中的 AllowlistSynchronizer 規格。接著,將 AllowlistSynchronizer 部署至叢集。

  1. 在文字編輯器中建立新的 YAML 檔案。
  2. 在 YAML 檔案中加入下列內容:

    apiVersion: auto.gke.io/v1
    kind: AllowlistSynchronizer
    metadata:
      name: ALLOWLIST_SYNCHRONIZER_NAME
    spec:
      allowlistPaths:
      - ALLOWLIST1_PATH
      - ALLOWLIST2_PATH
    

    更改下列內容:

    • ALLOWLIST_SYNCHRONIZER_NAME:新同步器的名稱。請選擇描述性名稱,以便識別許可清單支援的工作負載或團隊。
    • ALLOWLIST1_PATH, ALLOWLIST2_PATH, ...:要安裝的許可清單檔案或目錄的路徑清單,例如下列 GKE 核准的許可清單範例:

      allowlistPaths:
      - Gke-Org/accelerators/*
      - Wiz/wiz-sensor/v1/wiz-sensor-v1.yaml
      

      或在下列客戶擁有的許可清單範例中:

      allowlistPaths:
      - my-agent/log-collector/*
      - my-agent/privileged-logging-agent.yaml
      

      叢集設定必須支援您指定的路徑,如「設定叢集的許可清單路徑」一節所述。此外,每個 AllowlistSynchronizer 必須僅包含 GKE 核准的許可清單,或僅包含客戶擁有的許可清單。

  3. 如果您是從 客戶擁有的 Cloud Storage bucket 安裝許可清單,請將 spec.projectNumber 和 spec.bucketName 欄位新增至 AllowlistSynchronizer。詳情請參閱 AllowlistSynchronizer CustomResourceDefinition。

  4. 將 YAML 檔案部署至叢集:

    kubectl apply -f PATH_TO_YAML_FILE
    

    將 PATH_TO_YAML_FILE 替換為您在上一個步驟中建立的 YAML 檔案路徑。

    AllowlistSynchronizer 控制器會從叢集中的指定路徑安裝許可清單檔案。

  5. 等待同步器回報 Ready 狀態:

    kubectl wait --for=condition=Ready allowlistsynchronizer/ALLOWLIST_SYNCHRONIZER_NAME \
        --timeout=60s
    

您也可以將許可清單安裝和特殊權限工作負載部署作業,整合至持續整合和持續部署 (CI/CD) 管道。請將工作流程設為等待許可清單安裝成功,再部署對應的工作負載。

更新現有的 AllowlistSynchronizer

您可以更新現有的 AllowlistSynchronizer,新增或移除許可清單檔案。在下列情況下,您可能需要更新現有的同步器:

  • 工作負載擁有者新增名稱不同的許可清單檔案。
  • 您想將新的工作負載許可清單,新增至現有同步器,該同步器會將相關許可清單分組。
  • 您不想再使用對應的工作負載,因此想從同步器中移除許可清單。

如要更新現有的 AllowlistSynchronizer 物件,請按照下列步驟操作:

  1. 列出叢集中的現有同步器:

    kubectl get allowlistsynchronizer
    
  2. 在文字編輯器中開啟要更新的同步器規格。

  3. 更新 spec.allowlistPaths 欄位,新增、修改或移除許可清單檔案路徑。

  4. 儲存並關閉文字編輯器。

  5. 將更新後的設定套用至叢集:

    kubectl apply -f PATH_TO_YAML_FILE
    

    將 PATH_TO_YAML_FILE 替換為您在上一個步驟中更新的 YAML 檔案路徑。

部署更新後的同步器設定時,AllowlistSynchronizer 物件狀態中的 managedAllowlistStatus.generation 欄位會遞增一。AllowlistSynchronizer 控制器會套用變更。

監控許可清單同步處理狀態

安裝 AllowlistSynchronizer 或更新現有同步器後,即可監控同步狀態。您可以透過狀態追蹤許可清單檔案的安裝、移除或修改情形,以及可能發生的任何錯誤。

如要監控同步作業的一般狀態,請執行下列指令:

kubectl get allowlistsynchronizer ALLOWLIST_SYNCHRONIZER_NAME -o yaml

輸出結果會與下列內容相似:

...
status:
  conditions:
  - type: Ready
    status: "False"
    reason: "SyncError"
    message: "some allowlists failed to sync: example-allowlist-1.yaml"
    lastTransitionTime: "2024-10-12T10:00:00Z"
    observedGeneration: 2
  managedAllowlistStatus:
    - filePath: "gs://path/to/example-allowlist-2.yaml"
      generation: 1
      phase: Installed
      lastSuccessfulSync: "2024-10-10T10:00:00Z"
    - filePath: "gs://path/to/example-allowlist-1.yaml"
      phase: Failed
      lastError: "Initial install failed: invalid contents"
      lastSuccessfulSync: "2024-10-08T10:00:00Z"

在這個輸出範例中,example-allowlist-1.yaml 許可清單無法同步,example-allowlist-2.yaml 許可清單則已成功安裝。如需這些欄位的說明,請參閱「AllowlistSynchronizer 狀態」。

確認叢集中有許可清單

如要確認叢集中是否存在許可清單,請執行下列指令:

kubectl get workloadallowlist

輸出內容會列出叢集中已安裝的許可清單。確認輸出內容包含您要使用的許可清單。

部署具特殊權限的工作負載

成功安裝許可清單後,您可以在叢集中部署對應的工作負載。工作負載擁有者也應提供工作負載的安裝操作說明。如需 Autopilot 合作夥伴清單和說明文件連結,請參閱「Autopilot 合作夥伴」。

使用私人映像檔鏡像存放區

您可以將特殊權限工作負載的容器映像檔,鏡像至您擁有的私人存放區。如要在工作負載中執行這些鏡像映像檔,必須符合下列所有條件:

  • 鏡像映像檔的 SHA-256 摘要必須與公開工作負載的映像檔摘要相符。
  • 您指定的 SHA-256 映像檔摘要必須存在於同步至叢集的 WorkloadAllowlist 物件中。

如果工作負載支援鏡像映像檔,該工作負載的許可清單規格會包含映像檔摘要清單,列在許可清單規格的 containers.imageDigests 欄位中。一般來說,這個欄位會為容器映像檔的每個可用版本提供個別摘要。如要查看這個映像檔摘要清單,請按照下列步驟操作:

  1. 確認叢集中有許可清單。
  2. 取得已安裝許可清單的規格:

    kubectl get workloadallowlist ALLOWLIST_NAME -o yaml
    

    將 ALLOWLIST_NAME 替換為已安裝許可清單的名稱。例如:company-name-solution-v1.0.0。

    如果工作負載支援這項功能,輸出內容會大致如下。imageDigests 欄位會列出允許的摘要。

    # lines omitted for clarity
    - containerName: pause-container1
      imageDigests:
      - cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229
      - 932ea160d395f3d7f76c0c17a52a63c4cfe1836a900f1058b6bc20b16fd10d23
    

    如果輸出內容不含 imageDigests 欄位,或清單中沒有您要使用的版本摘要,請直接與工作負載擁有者聯絡,要求對方更新許可清單。工作負載擁有者將映像檔摘要新增至許可清單後,叢集中的許可清單同步器會自動安裝更新後的許可清單。

  3. 在工作負載資訊清單中,新增其中一個支援的映像檔摘要。

舉例來說,請參考以下合作夥伴公開 Pod 規格中的圖片:

...
  containers:
  - name: pause-container1
    image: partner-repo/pause1@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229
    securityContext:
      privileged: true

如果摘要與公開摘要相符,您可以使用鏡像映像檔,例如:

...
  containers:
  - name: pause-container1
    image: my-private-repo/pause1@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229
    securityContext:
      privileged: true

您必須在圖片欄位中加入 SHA-256 摘要,如前例所示。如果摘要不相符,鏡像映像檔就不會執行。如要在鏡像合作夥伴映像檔時保留映像檔摘要,建議使用 crane、ORAS 或 skopeo 等工具。

刪除特殊權限工作負載

如要停止允許特殊權限工作負載在叢集中執行,請從 AllowlistSynchronizer 移除對應許可清單的路徑。同步器會解除安裝許可清單。

如果您從叢集刪除 WorkloadAllowlist 物件,而不是更新同步器,同步器會重新安裝許可清單。請務必從 AllowlistSynchronizer 中移除路徑。

如要解除安裝許可清單,請按照下列步驟操作:

  1. 在管理許可清單的 AllowlistSynchronizer YAML 資訊清單中,移除要解除安裝的許可清單路徑。如需操作說明,請參閱「更新現有的 AllowlistSynchronizer」一節。
  2. 如要確認許可清單已解除安裝,請取得叢集中的 WorkloadAllowlist 物件清單:

    kubectl get workloadallowlist
    

    在輸出內容中,確認要移除的許可清單並未顯示。

  3. 從叢集刪除工作負載。如需操作說明,請參閱工作負載供應商的說明文件。

禁止在叢集中安裝許可清單

如要防止在特定叢集中安裝特殊權限工作負載許可清單,請在建立或更新叢集時,在 --autopilot-privileged-admission 旗標中指定空字串 ("")。

  • 如要停用叢集的特定許可清單路徑,請在建立或更新叢集時,省略這些許可清單的路徑:

    gcloud container clusters update CLUSTER_NAME \
        --location=LOCATION \
        --autopilot-privileged-admission=ALLOWLIST1_PATH,ALLOWLIST2_PATH,...
    

    將 ALLOWLIST1_PATH,ALLOWLIST2_PATH,... 替換為以逗號分隔的清單,列出要加入許可清單的來源路徑。省略要停用的路徑。

  • 如要停用現有叢集中的所有許可清單,請將核准的路徑指定為空字串:

    gcloud container clusters update CLUSTER_NAME \
        --location=LOCATION \
        --autopilot-allowlist-paths=""
    

疑難排解

如果同步處理或工作負載部署作業失敗,請參閱「排解部署特殊權限 Autopilot 工作負載的問題」。

後續步驟