在 Standard 叢集中強制執行 Autopilot 安全性政策

Google Kubernetes Engine (GKE) Autopilot 叢集會強制執行各種安全性政策,防止許多常見的攻擊路徑。本文說明平台管理員如何在標準叢集中強制執行部分或所有 Autopilot 政策。您無法在 Autopilot 叢集中停用叢集政策強制執行功能,因為 Autopilot 叢集是為了提供更高的 GKE 安全防護機制基準而設計。

在 Standard 叢集中,您可以隨時啟用及停用特定政策。組織管理員可以在組織、資料夾或專案中強制執行自訂限制,控管是否可停用特定 Autopilot 政策。您可以使用這些預先定義的政策,強制執行安全性最佳做法,不必編寫複雜的 RBAC 角色和繫結。即使您對叢集或工作負載使用 Autopilot 模式沒有興趣,許多叢集層級政策仍有助於提升叢集安全性。如要進一步瞭解可用的 Autopilot 叢集政策,請參閱「支援的政策」一節。

強制執行 Autopilot 叢集政策的注意事項

Autopilot 叢集一律會強制執行這些政策,但標準叢集通常有現有的工作負載和節點集區,可能會違反您強制執行的政策。在叢集中強制執行或停用政策前,請先詳閱下列注意事項:

  • 變更只會套用至新的工作負載:啟用適用於工作負載的政策後,變更只會套用至您啟用該政策後建立或修改的 Pod。違反政策的現有 Pod 仍可繼續執行。啟用政策前,請先檢查叢集中的現有工作負載,確認這些工作負載符合政策的限制。
  • 節點集區政策適用於所有節點:啟用適用於 Standard 叢集節點集區的政策時,限制會套用至新舊節點集區。如果現有節點集區違反政策,叢集更新作業就會失敗。舉例來說,如果您嘗試在含有現有使用者管理節點集區的叢集中啟用 no-standard-node-pools 政策,作業就會失敗。啟用節點集區政策前,請先檢查叢集中的現有節點集區。
  • 啟用所有政策即可啟用 Autopilot 模式:如果您啟用所有可用的 Autopilot 政策 (包括禁止使用者管理節點集區的政策),叢集中的所有工作負載就只能在 Autopilot 模式下執行。也就是說,所有工作負載都必須符合 Autopilot 安全性限制和所有叢集政策。這種做法可讓您在 Autopilot 模式下執行整個 Standard 叢集,並視需要停用特定政策。

事前準備

開始之前,請務必先完成下列工作:

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

在叢集中啟用特定 Autopilot 政策

建立或更新標準叢集時,請使用 gcloud CLI 或 GKE API 啟用特定政策。如要將特定 Autopilot 叢集政策新增至 GKE 在叢集中強制執行的政策清單,請使用 --autopilot-cluster-policies 旗標搭配 gcloud container clusters create 指令或 gcloud container clusters update 指令。

以下範例說明如何在現有叢集中啟用政策:

gcloud container clusters update CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --autopilot-cluster-policies=AUTOPILOT_POLICIES

更改下列內容:

  • CLUSTER_NAME:標準叢集的名稱。
  • CONTROL_PLANE_LOCATION:叢集控制層所在的區域或可用區,例如 us-central1us-central1-a
  • AUTOPILOT_POLICIES:以半形逗號分隔的 Autopilot 叢集政策清單,可在叢集中開始強制執行,例如 no-system-mutation,no-system-impersonation。您必須指定一或多個支援的政策。您指定的政策會附加至 GKE 已在叢集中強制執行的政策清單。如要停用政策強制執行功能,請參閱「在叢集中停用特定 Autopilot 政策」一節。

如果指令失敗且畫面上出現開頭為 Bad value [invalid policy]: 的錯誤訊息,請確認您指定的所有政策名稱都在支援的政策清單中。

確認政策強制執行

啟用特定政策後,您可以嘗試建立違反該政策的資源,確認強制執行作業是否正常運作。舉例來說,如果您啟用 no-system-mutation 政策,可以嘗試在 kube-system 命名空間中建立 Pod。GKE 會封鎖 Pod 建立作業,並顯示類似下列內容的錯誤訊息:

Error from server (Forbidden): pods is forbidden: User cannot create resource "pods" in API group "" in the namespace "kube-system": GKE Warden authz [denied by managed-namespaces-limitation]: the namespace "kube-system" is managed and the request's verb "create" is denied

在叢集中停用特定 Autopilot 政策

您隨時可以停用任何 Autopilot 叢集政策。 如果安全性需求有變,或啟用政策後現有工作流程中斷,即可停用政策。如要從 GKE 在叢集中強制執行的政策清單中移除政策,請搭配 gcloud container clusters update 指令使用 --remove-autopilot-cluster-policies 旗標:

gcloud container clusters update CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --remove-autopilot-cluster-policies=AUTOPILOT_POLICIES

您必須為 --remove-autopilot-cluster-policies 旗標指定至少一個值。如果您指定這個旗標但未提供值,作業就會失敗。

如果指令失敗且畫面上出現開頭為 Bad value [invalid policy]: 的錯誤訊息,請確認您指定的所有政策名稱都在支援的政策清單中。

在機構中強制執行 Autopilot 叢集政策

機構管理員可以使用自訂機構政策限制,在機構、專案或資料夾中強制使用這些叢集政策。這項額外措施有助於防止從叢集中未經授權或非預期地移除必要叢集政策。在自訂限制中使用 ClusterPolicyConfig 欄位,如下例所示:

name: organizations/ORGANIZATION_ID/customConstraints/custom.autopilotClusterPolicies
resourceTypes:
-   container.googleapis.com/Cluster
methodTypes:
-   CREATE
-   UPDATE
condition: "resource.ClusterPolicyConfig.no_system_mutation == true && resource.ClusterPolicyConfig.no_system_impersonation == true"
actionType: ALLOW
displayName: Autopilot policies in Standard clusters.
description: For all new and existing Standard clusters, enable the no_system_mutation and no_system_impersonation Autopilot cluster policies. For more information, see https://docs.cloud.google.com/kubernetes-engine/security/autopilot-cluster-policies-standard.

支援的原則

Standard 叢集提供的每項 Autopilot 政策,都會在叢集層級實作一或多項安全防護最佳做法。即使您不想使用 Autopilot 模式,no-system-mutationno-system-impersonationno-unsafe-webhooks 等政策也有助於提升任何 GKE 叢集的安全性。

下表說明可在標準叢集中啟用的 Autopilot 政策,並協助您準備強制執行政策:

政策名稱 說明 啟用前的準備工作
no-system-mutation 禁止在 GKE 系統命名空間 (例如 kube-system) 中建立或修改資源。 將 Pod 從系統命名空間移至您自己的命名空間。
no-system-impersonation 禁止嘗試模擬系統使用者,並防止使用系統主體建立 CertificateSigningRequests。 尋找為系統身分產生的任何未經授權 CertificateSigningRequests。如果發現任何未經授權的 CertificateSigningRequests 獲得核准,請輪替叢集憑證,使憑證失效。
no-unsafe-webhooks 防止准入 Webhook 和政策攔截重要系統資源,例如 Node 物件、PersistentVolume 或 CertificateSigningRequest。 使用 Recommender 服務找出攔截系統資源的 Webhook。如果發現任何 Webhook,請修改 Webhook 設定。 詳情請參閱「使用 Webhook 時確保控制層穩定性」。
no-standard-node-pools 防止叢集中存在任何由使用者管理的節點集區,包括手動建立和自動建立的節點集區。叢集中只能有 Autopilot 節點集區。 刪除所有現有的非 Autopilot 節點集區,包括隨叢集建立的預設節點集區。

後續步驟