GKE Autopilot 安全防護措施

本頁面說明 Google Kubernetes Engine (GKE) Autopilot 模式的安全防護功能、設定和設定。本文資訊適用於資安專員,協助他們瞭解 Google 在 Autopilot 模式中套用的安全限制,以及 Autopilot 提供的安全防護功能。如要進一步瞭解 Google Cloud 內容中提及的常見角色和工作範例,請參閱「常見的 GKE 使用者角色和工作」。

閱讀本頁面之前,請先熟悉下列內容:

術語

在 GKE 中,您可以建立 Autopilot 叢集,或在任何 Standard 叢集的 Autopilot ComputeClass 中執行工作負載,藉此使用 Autopilot。本頁面說明 Autopilot 在這兩種情況下的安全措施,並使用下列術語:

Autopilot 叢集
整個叢集都使用 Autopilot 模式。
Standard 叢集中的 Autopilot 工作負載
叢集使用標準模式,您則透過 ComputeClass 在 Autopilot 中執行特定工作負載。

Autopilot 的安全措施

在 Autopilot 模式下,GKE 預設會套用多項安全性最佳做法和設定,包括安全性總覽和「強化叢集安全性」中的許多建議。

在 Autopilot 叢集中,GKE 預設會嚴格執行本頁的所有措施。這項預設設定讓 Autopilot 叢集成為使用 GKE 的建議方式。對於 Standard 叢集中的 Autopilot 工作負載,GKE 會盡可能強制執行下列各節所述的安全措施。

強制執行 Kubernetes Pod 安全性標準

Kubernetes 專案有一組名為 Pod 安全性標準的安全指南,定義了下列政策:

  • Privileged:沒有存取限制。不適用於 Autopilot。
  • 基準:防止已知的提權路徑。可讓大多數工作負載在不大幅變更的情況下執行。
  • 受限:最高安全等級。需要大幅變更大部分工作負載。

在 Autopilot 模式下,GKE 會使用 Kubernetes 許可控制器,強制執行 Pod 安全性限制。預設的 Autopilot Pod 許可政策包含 Pod 安全性標準基準層級的所有建議,並針對可用性進行一些修改。此外,預設許可政策包含 Pod 安全性標準受限制層級的多項限制,但會避免限制導致大部分工作負載無法執行。

如要套用額外限制,以符合完整的「受限」政策,您可以選擇在特定命名空間中使用 PodSecurity 許可控制器。

下表說明預設 Autopilot 許可政策中的控制項,與 Pod 安全性標準的基準和受限制層級控制項有何差異。如要進一步瞭解下表中的各項控制項,請參閱「Pod 安全性標準」中的對應項目。

評估法規遵循時,我們會考量限制如何套用至您的工作負載。這不包括經過驗證的 Google Cloud 合作夥伴工作負載,以及需要特定權限才能運作的系統工作負載。

控制項 基準政策遵循 遵守限制政策 其他資訊
HostProcess Autopilot 會封鎖 HostProcess。
主機命名空間 Autopilot 會封鎖主機命名空間。已驗證合作夥伴的部分容器可以使用主機命名空間。
特殊權限容器 Autopilot 預設會封鎖特殊權限容器。Autopilot 允許來自已驗證合作夥伴的特殊權限容器,用於執行安全性和監控工具等用途。
Linux 功能

根據預設,Autopilot 工作負載只能存取基準 Pod 安全性標準中指定的功能。

您可以手動啟用下列功能:

  • NET_RAW 用於連線偵測 (ping),SYS_PTRACE 用於偵錯:新增至 Pod SecurityContext
  • Istio 等服務網格的 NET_ADMIN:在叢集建立指令中指定 --workload-policies=allow-net-admin。

Autopilot 也允許部分經過驗證的合作夥伴工作負載設定捨棄的功能。

HostPath 磁碟區 部分符合 部分符合 Autopilot 允許容器要求 /var/log 的唯讀存取權,以便進行偵錯,但會拒絕所有其他讀取或寫入存取權。
HostPorts 禁止設定特定主機通訊埠,可減少部分排程問題,並防止服務意外或刻意直接公開網路。您可以從已知範圍手動設定隨機主機通訊埠指派,以支援遊戲伺服器等直接連線網路應用程式。
AppArmor AppArmor docker-default 安全性設定檔會自動套用至 Container-Optimized OS。
SELinux 由於已套用 AppArmor,因此不會套用 SELinux。Pod 安全性標準也未強制要求使用 SELinux。
/proc 種放置方式 在 GKE 1.33 以上版本中,如果 Pod securityContext 將 procMount 設為 Unmasked,Autopilot 會拒絕 Pod。在 1.33 之前的版本中,Autopilot 會自動將 procMount 欄位中的值覆寫為 Default。
seccomp 設定檔 Autopilot 會將 RuntimeDefault seccomp 設定檔套用至所有工作負載。如要手動覆寫特定工作負載的這項設定,請在 Pod 規格中將設定檔設為 Unconfined。
sysctls GKE 不會設定 --allowed-unsafe-sysctls kubelet 旗標,因此無法排定含有不安全 sysctl 的 Pod。為提供額外保護,自 2023 年 7 月 11 日起,新的 1.27 以上版本叢集也設有政策規則,可強制執行 securityContext 設定,並拒絕使用不安全 sysctl 的 Pod。
磁碟區類型 Autopilot 僅允許受限政策中的磁碟區類型,並新增下列項目:可唯讀存取 /var/log 以進行偵錯的 HostPath 磁碟區、Compute Engine 永久磁碟的 gcePersistentDisk,以及網路檔案系統磁碟區的 nfs。
提權 這項設定只會保護非以 root 身分執行的容器。產業調查顯示,76% 的容器是以 root 身分執行,因此 Autopilot 允許以 root 身分執行,以便啟用大多數工作負載。這項設定也可用於將工作負載降級為非根層級,方法是允許使用檔案系統功能,解決 Kubernetes 根層級功能處理方式的不足之處。
以非超級使用者身分執行 產業調查顯示,76% 的容器是以超級使用者身分執行,因此 Autopilot 允許以超級使用者身分執行,以便啟用大多數工作負載。
以非超級使用者身分執行 容器可以將 runAsUser 設為 0。業界調查顯示,76% 的容器是以超級使用者身分執行,因此 Autopilot 允許以超級使用者身分執行,以便啟用大多數工作負載

內建安全性設定

除了 Pod 安全性標準外,Google 也會根據業界最佳做法和我們的專業知識,在 Autopilot 中套用多項安全性設定。Autopilot 叢集會嚴格套用這些內建安全性設定。

在 Standard 叢集中,GKE 會自動將許多這類設定套用至叢集中的 Autopilot 工作負載,並盡可能確保這些設定生效。您可以選擇為 Standard 叢集啟用所有 Autopilot 政策,在該叢集中套用所有這些設定,強制 Standard 叢集中的所有工作負載使用 Autopilot 模式。

下表說明 Autopilot 套用的部分安全性設定:

設定 說明
主辦人選項
  • 沒有 hostNetwork,因為 GKE 會管理您的節點。
  • 隨機指派 hostPort。
  • 沒有寫入模式的 hostPath 磁碟區。您可以在讀取模式下,將 hostPath 磁碟區用於 /var/log/ 路徑前置字元。
  • 沒有主機命名空間。
Linux 功能

您可以使用下列 Linux 功能:

"SETPCAP", "MKNOD", "AUDIT_WRITE", "CHOWN", "DAC_OVERRIDE", "FOWNER", "FSETID", "KILL", "SETGID", "SETUID", "NET_BIND_SERVICE", "SYS_CHROOT", "SETFCAP", "SYS_PTRACE"

您也可以手動啟用下列功能:

  • NET_RAW 進行連線偵測 (ping):新增至 Pod SecurityContext。
  • SYS_PTRACE 偵錯:新增至 Pod SecurityContext。
  • Istio 等服務網格的 NET_ADMIN:建立叢集或更新現有叢集時,請使用 --workload-policies=allow-net-admin。接著,將功能新增至 Pod SecurityContext。
特殊權限容器 除非容器是由Google Cloud 合作夥伴部署,否則無法在特殊權限模式下執行。特殊權限容器可以變更基礎節點,例如變更 kubelet。這項存取權可能會增加 Pod 遭入侵的影響。
GKE 代管命名空間 為確保安全,Autopilot 不允許在 GKE 代管的命名空間 (例如 kube-system) 部署工作負載。
容器隔離

Autopilot 會對容器強制執行下列限制,以限制容器跳脫安全漏洞的影響。

Linux 功能和核心安全性

  • Autopilot 會將 RuntimeDefault seccomp 設定檔套用至叢集中的所有 Pod,除非 Pod 使用 GKE Sandbox。GKE Sandbox 會強制隔離主機,並忽略 Pod 資訊清單中指定的 seccomp 規則。沙箱是 GKE Sandbox Pod 的安全邊界。
  • Autopilot 會捨棄所有容器的 CAP_NET_RAW Linux 功能。這項權限不常使用,且曾多次發生逃逸漏洞。由於這項功能已遭捨棄,容器內的 ping 指令可能會失敗。您可以在 Pod SecurityContext 中設定這項功能,手動重新啟用。
  • Autopilot 會捨棄所有容器的 CAP_NET_ADMIN Linux 功能。如要重新啟用這項功能,請在叢集建立或更新指令中指定 --workload-policies=allow-net-admin 旗標。Istio 等部分工作負載需要 NET_ADMIN。
  • Autopilot 叢集會啟用 Workload Identity Federation for GKE,防止 Pod 存取節點上的機密中繼資料。
  • Autopilot 會封鎖設定 spec.externalIPs 欄位的 Kubernetes Service,防範 CVE-2020-8554。
  • Autopilot 僅允許下列磁碟區類型:

    "configMap", "csi", "downwardAPI", "emptyDir", "gcePersistentDisk", "nfs", "persistentVolumeClaim", "projected", "secret"

    其他類型的磁碟區需要節點權限,因此會遭到封鎖。 HostPath 磁碟區預設為封鎖狀態,但容器可以要求 /var/log 路徑的唯讀存取權,以便偵錯。

Pod 層級安全性政策強制執行 Autopilot 支援 Pod 層級安全性政策的強制執行機制,例如 PodSecurity 許可控制器、Gatekeeper 或 Policy Controller。不過,如果本頁所述的內建安全性設定已符合您的需求,您可能就不需要使用這些設定。
透過 SSH 連線至節點

Autopilot 會封鎖節點的 SSH 存取權。GKE 會處理節點的所有作業層面,包括節點健康狀態和節點上執行的所有 Kubernetes 元件。

您仍可使用 Kubernetes exec 功能,從遠端連線至執行中的容器,在容器中執行指令進行偵錯,包括連線至互動式殼層,例如使用 kubectl exec -it deploy/YOUR_DEPLOYMENT -- sh。

使用者身分模擬

Autopilot 支援所有使用者定義的使用者和群組的使用者身分模擬。

只有在 Autopilot 叢集中,系統使用者和群組 (例如 kube-apiserver 使用者和 system:masters 群組) 無法模擬。由於使用者身分模擬限制是在控制層中發生,因此即使工作負載使用 Autopilot ComputeClass,Standard 叢集也不會強制執行這項限制。我們強烈建議您不要在 GKE 中模擬系統使用者和群組。

變更動態許可 Webhook

僅限 Autopilot 叢集:GKE 會修改變動中的 Webhook,排除代管命名空間 (例如 kube-system) 中的資源,以免遭到攔截。由於准入控制是在叢集控制層中進行,因此即使工作負載使用 Autopilot ComputeClass,Standard 叢集也不會強制執行這項限制。

Autopilot 也會拒絕指定下列一或多項資源,以及這些資源的任何子資源的 Webhook。

- group: ""
  resource: nodes
- group: ""
  resource: persistentVolumes
- group: certificates.k8s.io
  resource: certificatesigningrequests
- group: authentication.k8s.io
  resource: tokenreviews

您無法使用星號 (*) 萬用字元,為資源或群組略過這項限制。

ValidatingAdmissionPolicies

僅限 Autopilot 叢集:GKE 會修改 ValidatingAdmissionPolicy 物件,排除代管命名空間 (例如 kube-system) 中的資源,避免遭到攔截。由於准入控制是在叢集控制層中進行,因此即使工作負載使用 Autopilot ComputeClass,Standard 叢集也不會強制執行這項限制。

Autopilot 也會拒絕指定下列一或多項資源,以及這些資源的任何子資源的 ValidatingAdmissionPolicy 物件。

- group: ""
  resource: nodes
- group: ""
  resource: persistentVolumes
- group: certificates.k8s.io
  resource: certificatesigningrequests
- group: authentication.k8s.io
  resource: tokenreviews

您無法使用星號 (*) 萬用字元,為資源或群組略過這項限制。

MutatingAdmissionPolicies

僅限 Autopilot 叢集:GKE 會修改 MutatingAdmissionPolicy 物件,排除代管命名空間 (例如 kube-system) 中的資源,避免遭到攔截。由於准入控制是在叢集控制層中進行,因此即使工作負載使用 Autopilot ComputeClass,Standard 叢集也不會強制執行這項限制。

Autopilot 也會拒絕指定下列一或多項資源,以及這些資源的任何子資源的 MutatingAdmissionPolicy 物件。

- group: ""
  resource: nodes
- group: ""
  resource: persistentVolumes
- group: certificates.k8s.io
  resource: certificatesigningrequests
- group: authentication.k8s.io
  resource: tokenreviews

您無法使用星號 (*) 萬用字元,為資源或群組略過這項限制。

憑證簽署要求 您可以在 Autopilot 中建立 CertificateSigningRequests,建立由叢集憑證授權單位簽署的憑證。為避免干擾系統元件,Autopilot 叢集會拒絕已知特殊權限身分 (例如系統群組、系統代理程式或 Google 代管的 IAM 服務代理程式) 的 CertificateSigningRequest。這項限制不適用於標準叢集,您可以在標準叢集中為已知具備特殊權限的身分建立 CertificateSigningRequests。
GKE 安全防護功能 Autopilot 叢集會為您啟用建議的 GKE 安全防護功能。如需已啟用和選用的安全防護功能清單,請參閱「Autopilot 的安全防護功能」。
節點作業系統 Autopilot 會使用含有 containerd 的 Container-Optimized OS 做為節點作業系統。Container-Optimized OS 由 Google 建立及管理。
GKE 版本升級 Autopilot 叢集建立後會註冊 GKE 發布版本,且一律啟用自動升級功能。Google 會在特定時間點,自動將控制層和節點升級至發布管道中的最新合格版本。

Autopilot 的安全界限

Autopilot 提供 Kubernetes API 的存取權,但會移除使用某些高權限 Kubernetes 功能 (例如特殊權限 Pod) 的權限。目標是限制存取、修改或直接控制節點虛擬機器 (VM) 的能力。Autopilot 會實施這些限制,防止工作負載對節點 VM 進行低階存取,以便Google Cloud 提供完整的節點管理功能,以及 Pod 層級的服務水準協議。

我們的目的是防止他人意外存取節點 VM。我們接受透過 Google 安全漏洞檢舉計畫 (VRP) 提交的相關報告,並會根據 Google VRP 獎勵小組的裁量,提供獎勵。

根據設計,叢集管理員等特殊權限使用者可完整控管任何 GKE 叢集。基於安全性最佳做法,建議您避免廣泛授予強大的 GKE 或 Kubernetes 權限,並盡可能按照多用戶群指南所述,使用命名空間管理員委派功能。

Autopilot 會在專案中佈建單一租戶 VM,供您專用。在每個 VM 上,Autopilot 工作負載可能會一起執行,共用經過安全強化的核心。由於共用核心代表單一安全性邊界,如果您需要強大的隔離功能 (例如高風險或不受信任的工作負載),建議您在 GKE Sandbox Pod 上執行工作負載,以提供多層安全性防護。

依用途提供的安全性建議

下列各節提供連結和建議,協助您根據用途規劃、實作及管理 Autopilot 叢集的安全性。

規劃叢集安全性

用途 資源
瞭解 GKE 平台如何處理安全性
瞭解您在強化環境安全方面扮演的角色 瞭解共同責任模式。
查看 Google 建議的強化措施和事件應變做法
瞭解 GKE 如何實作稽核記錄

驗證與授權

設定 Autopilot 叢集後,您可能需要驗證使用者和應用程式,才能使用 Kubernetes API 或 Google Cloud API 等資源。

用途 資源
向叢集 API 伺服器驗證使用者或應用程式
  • 如要驗證使用者,請參閱「驗證使用者」。
  • 如要驗證應用程式,請參閱「驗證應用程式」,瞭解如何驗證相同叢集、其他 Google Cloud 環境或外部環境中的應用程式。
驗證應用程式對 Google Cloud API 和服務的存取權 Autopilot 叢集可讓您使用 Workload Identity Federation for GKE,將 Kubernetes 服務帳戶設為 IAM 服務帳戶,安全地向 Google Cloud API 驗證工作負載。如需操作說明,請參閱「設定應用程式以使用 Workload Identity Federation for GKE」。
在專案層級授權動作 如要在專案層級授權跨叢集動作,請使用 IAM。您可以使用 IAM 角色和權限,授予或拒絕特定 GKE 和 Kubernetes API 資源的存取權。如需操作說明,請參閱「建立 IAM 政策」。
在叢集層級授權動作 如要授權對特定叢集中的 Kubernetes API 資源執行動作,請使用內建的 Kubernetes 角色式存取控管 (RBAC) 機制。如需操作說明,請參閱「使用 RBAC 授權叢集中的動作」。
在組織層級授權動作 您可以使用 Google Cloud 組織政策服務,對整個 Google Cloud組織中 GKE 資源的特定作業強制執行限制。如需操作說明,請參閱「使用自訂組織政策限制 GKE 資源動作」。

強化叢集和工作負載

如果您有特殊的隔離或強化需求,超出預設的 Autopilot 措施,請考慮下列資源:

用途 資源
限制叢集端點的公開存取權 設定 Autopilot 叢集的網路隔離,並停用叢集控制層的外部端點。如需操作說明,請參閱「設定控制層存取權」。
限制叢集存取特定網路 使用控制層授權網路,指定可存取叢集的 IP 位址範圍。
將機密資訊儲存在叢集外部 將機密資料儲存在已啟用版本管理功能的外部加密儲存空間供應商,是常見的法規遵循要求和最佳做法。使用 Secret Manager 儲存資料,並透過 Workload Identity Federation for GKE 從 Autopilot 叢集存取資料。如需操作說明,請參閱「使用 Workload Identity Federation for GKE 存取儲存在 GKE 叢集外的 Secret」。
先驗證容器映像檔,再部署至叢集 在部署時,使用二進位授權檢查 Pod 資訊清單中參照的容器映像檔完整性。如需操作說明,請參閱「使用二進位授權在部署時驗證容器映像檔」。

監控資安態勢

設定叢集並部署工作負載後,請設定監控和記錄功能,以便觀測叢集的資安態勢。建議您採取下列所有做法:

後續步驟