在 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.projectNumberspec.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 欄位會遞增 1。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 許可清單已成功安裝。如需這些欄位的說明,請參閱「允許清單同步器狀態」。

確認叢集中有許可清單

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

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 摘要,類似於先前的範例。如果摘要不相符,鏡像圖片就不會執行。 如要在鏡像合作夥伴圖片時保留圖片摘要,請考慮使用 craneORASskopeo 等工具。

刪除具備存取權的工作負載

如要停止允許特權工作負載在叢集中執行,請從 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 工作負載時發生的問題」。

後續步驟