GKE Autopilot 安全防護措施


本頁面說明 Google Kubernetes Engine (GKE) Autopilot 的安全性功能、設定和選項。GKE Autopilot 叢集會為您實作許多安全性設定,因此建議您使用 Autopilot 執行 GKE。

本頁面適用於安全專家,可協助他們瞭解 Google 專門對 Autopilot 叢集套用的安全限制,以及 Autopilot 提供的安全功能。如要進一步瞭解 Google Cloud 內容中提及的常見角色和範例工作,請參閱常見的 GKE Enterprise 使用者角色和工作

閱讀本頁面之前,請先熟悉下列概念:

Autopilot 的安全措施

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

如要根據用途取得建議資源,請跳至「依用途分類的安全資源」。以下各節說明 Autopilot 為您套用的安全性政策。

強制執行 Kubernetes Pod 安全性標準

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

  • 已授權:沒有存取限制。Autopilot 不會使用這項設定。
  • 基準:防止已知的權限提升路徑。可讓大多數工作負載在無須大幅變更的情況下執行。
  • 權限受限的使用者:安全防護等級最高。需要大幅變更大部分工作負載。

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

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

下表說明預設 Autopilot 准入政策中的控制項,與 Pod 安全性標準的 Baseline 和 Restricted 層級控制項相比,有何差異。如要瞭解下表中各項控制項的說明,請參閱 Pod 安全性標準中的對應項目。

評估是否符合規定時,我們會考量限制對您工作負載的影響。這不包括已驗證的合作夥伴工作負載,以及需要特定權限才能運作的系統工作負載。 Google Cloud

控制項 基本政策遵循 受限制的政策規範 其他資訊
HostProcess Autopilot 會封鎖 HostProcess。
主機命名空間 Autopilot 會封鎖主機命名空間。部分已驗證合作夥伴的容器可使用主機命名空間。
特殊權限容器 Autopilot 預設會封鎖特殊權限容器。 Autopilot 可讓經過驗證的合作夥伴使用具備特殊權限的容器,執行安全和監控工具等作業。
Linux 功能

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

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

  • NET_RAW 用於 Ping,SYS_PTRACE 用於偵錯: 新增至 Pod SecurityContext
  • NET_ADMIN 適用於 Istio 等服務網格:在叢集建立指令中指定 --workload-policies=allow-net-admin。適用於執行 GKE 1.27 以上版本的新叢集和升級的現有叢集。

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

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

內建安全性設定

Google 會根據業界最佳做法和專業知識,為 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
  • NET_ADMIN 適用於 Istio 等服務網格:建立叢集或更新現有叢集時,請使用 --workload-policies=allow-net-admin。接著,將功能新增至 Pod SecurityContext。適用於 GKE 1.27 以上版本。

在 1.21 之前的 GKE 版本中,系統不支援 "SYS_PTRACE" 功能。

特殊權限容器 除非容器是由Google Cloud 合作夥伴部署,否則容器無法在特權模式中執行。具備權限的容器可以變更基礎節點,例如變更 kubelet。這項存取權可能會擴大 Pod 遭入侵的影響。
GKE 管理的命名空間 為確保安全性,Autopilot 不允許在 GKE 管理的命名空間 (例如 kube-system) 中部署工作負載。
容器隔離

Autopilot 會對容器強制執行下列限制,以降低容器逸出安全漏洞的影響。

Linux 功能和核心安全性

  • 除非 Pod 使用 GKE Sandbox,否則 Autopilot 會將 RuntimeDefault seccomp 設定檔套用至叢集中的所有 Pod。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 旗標。NET_ADMIN 是 Istio 等部分工作負載的必要條件。
  • Autopilot 會啟用 Workload Identity Federation for GKE,防止 Pod 存取節點上的機密中繼資料。
  • 為防範 CVE-2020-8554,Autopilot 會封鎖將 spec.externalIPs 欄位設為 的 Kubernetes Service。
  • Autopilot 僅允許下列磁碟區類型

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

    其他類型的磁碟區需要節點權限,因此遭到封鎖。 根據預設,系統會封鎖 HostPath 磁碟區,但容器可以要求對 /var/log 路徑的唯讀存取權,以進行偵錯。

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

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

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

模擬使用者身分 GKE 1.22.4-gke.1501 以上版本支援所有使用者定義的使用者和群組的使用者模擬。系統使用者和群組 (例如 kube-apiserver 使用者和 system:masters 群組) 無法模擬。
變更動態准入 Webhook

Autopilot 會修改變更 Webhook,排除代管命名空間 (例如 kube-system) 中的資源,避免遭到攔截。

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

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

您無法使用 * 萬用字元略過這項限制。

ValidatingAdmissionPolicies

Autopilot 會修改 ValidatingAdmissionPolicy 物件,排除代管命名空間中的資源 (例如 kube-system),避免遭到攔截。

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

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

您無法使用 * 萬用字元略過這項限制。

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

Autopilot 中的安全界限

Autopilot 可存取 Kubernetes API,但會移除使用部分高權限 Kubernetes 功能的權限,例如具備高權限的 Pod。目標是限制存取、修改或直接控制節點虛擬機器 (VM) 的能力。Autopilot 會實施這些限制,避免工作負載取得節點 VM 的低階存取權,以便Google Cloud 全面管理節點,並提供 Pod 層級的SLA

我們的目的是防止他人未經授權存取節點 VM。我們接受透過 Google 安全漏洞獎勵計畫 (VRP) 提交的相關報告,並由 Google VRP 獎勵委員會決定是否給予獎勵。

根據設計,叢集管理員等具備權限的使用者,可完全控管任何 GKE 叢集。為確保安全性,建議您避免廣泛授予強大的 GKE 或 Kubernetes 權限,並盡可能使用命名空間管理員委派,如多租戶指南所述。

Autopilot 會在專案中佈建單一用戶群 VM,供您專屬使用。在每個個別 VM 上,Autopilot 工作負載可能會一起執行,共用經過安全強化處理的 Kernel。由於共用核心代表單一安全邊界,因此我們建議您在需要嚴密隔離時 (例如高風險或不受信任的工作負載),在 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 儲存資料,並透過 GKE 適用的工作負載身分聯盟,從 Autopilot 叢集存取資料。如需操作說明,請參閱「使用 Workload Identity Federation for GKE 存取儲存在 GKE 叢集外的密碼」。
先驗證容器映像檔,再部署至叢集 在部署時,使用二進位授權檢查 Pod 資訊清單中參照的容器映像檔完整性。如需操作說明,請參閱「使用二進位授權在部署時驗證容器映像檔」。

監控安全防護機制

設定叢集並部署工作負載後,您應設定及配置監控和記錄功能,以便觀察叢集安全防護機制。建議您採取下列所有做法:

  • GKE 安全防護機制資訊主頁中註冊叢集,稽核工作負載是否有問題,例如安全設定有問題,或是容器作業系統套件中存在安全漏洞,並取得可執行的緩解資訊。
  • 使用叢集通知,接收新的安全性公告和升級事件通知。
  • 使用 Cloud Monitoring 中的 GKE 資訊主頁,或 GKE 中的「可觀測性」分頁,監控叢集。
  • 瞭解如何在 Cloud Logging 中查看管理 GKE 稽核記錄。

後續步驟