GKE Sandbox


本頁面說明當 Pod 中的容器執行未知或不受信任的程式碼時,GKE Sandbox 如何保護節點上的主機核心。例如,軟體即服務 (SaaS) 供應商這類的多用戶群叢集通常會執行使用者提交的未知程式碼。GKE Sandbox 也是執行高價值容器時,實用的縱深防禦措施。

本頁內容適用於安全專家,可瞭解 GKE Sandbox 的優點。如要進一步瞭解 Google Cloud 內容中提及的常見角色和範例工作,請參閱常見的 GKE Enterprise 使用者角色和工作

閱讀本頁內容前,請先熟悉 gVisor 官方文件,這是 GKE Sandbox 使用的開放原始碼專案。

如要瞭解如何啟用及使用 GKE Sandbox,請參閱「設定 GKE Sandbox」。

總覽

GKE Sandbox 提供額外的安全防護層,可防止不受信任的程式碼影響叢集節點上的主機核心。在討論 GKE Sandbox 的運作方式前,建議您先瞭解使用 GKE Sandbox 有助於降低潛在風險的性質。

在容器程序與節點上執行的核心之間,容器執行階段 (例如 containerd) 會提供某種程度的隔離。 不過,容器執行階段通常是以節點上的特權使用者身分執行,而且可以存取主機核心的大多數系統呼叫。

潛在威脅

使用多用戶群叢集及叢集容器執行不受信任的工作負載時,會比其他叢集更容易受到安全漏洞的威脅。範例包括 SaaS 供應商、網站代管供應商或允許使用者上傳及執行程式碼的其他機構。容器執行階段或主機核心中的缺陷也許會導致容器內執行的程序「逸出」容器並影響節點的核心,進而可能導致節點無法運作。

惡意用戶群也可能會利用這種缺陷,存取並竊取記憶體中或磁碟上另一個用戶群的資料。

最後,不受信任的工作負載則可能會存取其他 Google Cloud服務或叢集中繼資料。

GKE Sandbox 如何降低潛在威脅

gVisor 不需要進階權限就可以在使用者空間中重新實作 Linux 核心 API。與容器執行階段 (例如containerd) 一起使用的話,使用者空間核心會重新實作大多數系統呼叫,並代表主機核心執行這些呼叫。限制直接存取主機核心。如要瞭解這項作業如何運作的詳細資訊,請參閱 gVisor 架構指南。從容器的角度來看,gVisor 幾乎是透明公開的,不需要對容器化應用程式進行任何變更。

在 Autopilot 叢集的 Pod 中要求 GKE Sandbox 時,GKE 會在沙箱中執行該 Pod。在 GKE Standard 中,如果您在節點上啟用 GKE Sandbox,在這些節點上執行的所有 Pod 都會在沙箱中執行。

每個沙箱都會使用自己的使用者空間核心。有鑑於此,您可以根據所需的隔離程度和應用程式特性,決定如何將容器分成不同 Pod。

GKE Sandbox 特別適合以下類型的應用程式。如需協助您決定讓哪些應用程式使用沙箱的詳細資訊,請參閱限制一節。

  • 使用 Rust、Java、Python、PHP、Node.js 或 Golang 等執行階段的不受信任或第三方應用程式
  • 網路伺服器前端、快取或 Proxy
  • 使用 CPU 處理外部媒體或資料的應用程式
  • 使用 CPU 的機器學習工作負載
  • 耗用大量 CPU 或記憶體的應用程式

AI/ML 工作負載或服務通常需要更快速地部署至正式環境。gVisor 的設計宗旨是防範整類常見的 Linux 安全漏洞。使用 GKE Sandbox,您就能提升 GPU 和 TPU 密集型工作負載的安全性,不必大幅變更程式碼。GKE Sandbox 適用於 AI/機器學習工作負載的常見主要用途:

  • 需要大量 GPU 和 TPU 的工作負載。
  • 接受及執行不受信任使用者程式碼的服務。
  • 處理任意使用者輸入內容的服務。
  • 處理大型第三方資料集和模型的工作負載。
  • 使用第三方程式庫的應用程式。

如要進一步瞭解加速器存取權的設計和安全性,請參閱 gVisor 的 GPUTPU 指南。

其他安全性建議

使用 GKE Sandbox 時,建議您同時採用下列建議:

  • 對沙箱中執行的所有容器指定資源限制。這可防止有缺陷或惡意的應用程式耗盡節點資源,以及對節點上執行的其他應用程式或系統程序造成負面影響等風險。

  • 如果您使用 Workload Identity Federation for GKE,請使用網路政策封鎖叢集中繼資料存取權,禁止存取 169.254.169.254。這樣一來,惡意應用程式就無法存取專案 ID、節點名稱和區域等潛在私人資料,有助於防範風險。GKE Autopilot 叢集一律會啟用 Workload Identity Federation for GKE。

限制

GKE Sandbox 適用於許多應用程式,但並非全部都適用。本節將進一步說明目前 GKE Sandbox 的限制。

GKE Sandbox 中的 GPU

在 GKE 1.29.2-gke.1108000 以上版本中,GKE Sandbox 支援使用 NVIDIA GPU。

GKE Sandbox 中的硬體加速工作負載現已正式發布,適用於下列版本:

  • 1.29.15-gke.1134000
  • 1.30.11-gke.1093000
  • 1.31.7-gke.1149000
  • 1.32.2-gke.1182003 以上版本

GKE Sandbox 無法防範所有 NVIDIA 驅動程式漏洞,但仍可防範 Linux 核心漏洞。如要進一步瞭解 gVisor 專案如何保護 GPU 工作負載,請參閱 GPU 支援指南

下列限制適用於 GKE Sandbox 中的 GPU 工作負載:

  • 僅支援 CUDA 工作負載。
  • 支援的 GPU 型號包括:nvidia-tesla-t4、nvidia-tesla-a100、nvidia-a100-80gb、nvidia-l4 和 nvidia-h100-80gb。
  • gVisor 僅支援特定 NVIDIA 驅動程式版本。GKE Sandbox 可確保各 GKE 版本支援的 GPU,其 latestdefault 驅動程式都相容。其他驅動程式不保證能正常運作。
  • 部分 GPU 功能無法以原生方式運作 (例如 RDMA 或 IMEX)。我們會根據客戶需求,逐案提供 GPU 功能支援。提交支援案件,或在 gVisor 的 GitHub 問題上回報錯誤。

您可以免費將 GKE Sandbox 用於 GPU 工作負載。

GKE Sandbox 中的 TPU

在 GKE 1.31.3-gke.1111001 以上版本中,GKE Sandbox 支援使用 TPU。

GKE Sandbox 無法降低所有 TPU 驅動程式安全漏洞,但仍可防範 Linux 核心安全漏洞。如要瞭解 gVisor 專案如何保護 TPU 工作負載,請參閱 TPU 支援指南

支援的 TPU 硬體版本包括:V4pod、V4lite、V5litepod、V5pod 和 V6e。

您可免費將 GKE Sandbox 搭配 TPU 工作負載使用。

節點集區設定

適用於 Standard 叢集

  • 您無法在 Windows Server 節點集區上使用 GKE Sandbox。
  • 您無法在預設節點集區中啟用 GKE Sandbox,藉此將在預設節點集區中執行的系統服務,與使用 GKE Sandbox 的不受信任工作負載區隔開來。
  • 使用 GKE Sandbox 時,叢集中必須至少有兩個節點集區。 至少維持有一個停用 GKE Sandbox 的節點集區。 這個節點集區必須至少包含一個節點,即使您的所有工作負載都已採用沙箱機制。
  • 1.24.2-gke.300 之前的 GKE 版本不支援 e2-micro、e2-small 和 e2-medium 機器類型。GKE 1.24.2-gke.300 以上版本支援這些機器類型。
  • 節點必須使用 Container-Optimized OS with containerd (cos_containerd) 節點映像檔。

存取叢集中繼資料

適用於 Autopilot 和 Standard 叢集

  • 執行沙箱 Pod 的節點無法存取節點上作業系統層級的叢集中繼資料。
  • 在 GKE Standard 中,您可以在已啟用 GKE Sandbox 的節點上執行一般 Pod。但根據預設,這些一般 Pod 無法存取 Google Cloud 服務或叢集中繼資料。
  • 使用 Workload Identity Federation for GKE 授予 Pod 對 Google Cloud 服務的存取權。

SMT 可能已停用

適用於 Autopilot 和 Standard 叢集

多執行緒並行 (SMT) 設定可用於防範側通道安全漏洞,這類安全漏洞會利用共用核心狀態的執行緒,例如微架構資料取樣 (MDS) 安全漏洞

在 GKE 1.25.5-gke.2500 以上版本和 1.26.0-gke.2500 以上版本中,gVisor 會設定為使用 Linux Core Scheduling,以減輕側通道攻擊。SMT 設定與預設值相同。核心排程僅適用於透過 gVisor 執行的工作負載。

從 GKE 1.24.2-gke.300 版開始,系統會根據機器容易受到 MDS 攻擊的程度,依據機器類型設定 SMT,如下所示:

在 1.24.2-gke.300 之前的版本中,所有機器類型都會停用 SMT。

啟用 SMT

適用於 Standard 叢集

在 GKE Standard 叢集中,如果所選機器類型停用 SMT,您可以啟用 SMT。無論您是否開啟 SMT,系統都會針對每個 vCPU 收費。如需定價資訊,請參閱 Compute Engine 定價

GKE 1.24.2-gke.300 以上版本

建立 GKE Sandbox 節點集區時,請設定 --threads-per-core 旗標:

gcloud container node-pools create smt-enabled \
  --cluster=CLUSTER_NAME \
  --machine-type=MACHINE_TYPE \
  --threads-per-core=2 \
  --sandbox type=gvisor
  • CLUSTER_NAME:現有叢集的名稱。
  • MACHINE_TYPE機器類型

如要進一步瞭解 --threads-per-core,請參閱「設定每個核心的執行緒數量」。

1.24.2-gke.300 之前的 GKE 版本

  1. 在叢集中使用節點標籤 cloud.google.com/gke-smt-disabled=false 建立一個新的節點集區:

    gcloud container node-pools create smt-enabled \
        --cluster=CLUSTER_NAME \
        --machine-type=MACHINE_TYPE \
        --node-labels=cloud.google.com/gke-smt-disabled=false \
        --image-type=cos_containerd \
        --sandbox type=gvisor
    
  2. 將 DaemonSet 部署到節點集區。DaemonSet 只會在具有 cloud.google.com/gke-smt-disabled=false 標籤的節點上執行。

    kubectl create -f \
        https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-node-tools/master/disable-smt/gke/enable-smt.yaml
    
  3. 確認 DaemonSet pod 處於執行狀態。

    kubectl get pods --selector=name=enable-smt -n kube-system
    

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

    NAME               READY     STATUS    RESTARTS   AGE
    enable-smt-2xnnc   1/1       Running   0          6m
    
  4. 請檢查 pod 中的記錄是否顯示 SMT has been enabled

    kubectl logs enable-smt-2xnnc enable-smt -n kube-system
    

功能

適用於 Standard 叢集

根據預設,容器無法開啟原始 socket 以減少潛在的惡意攻擊。部分網路相關工具 (例如 pingtcpdump) 會建立原始 socket 做為其核心作業。如要啟用原始 socket,您必須在容器的安全性內容中明確加入 NET_RAW 功能:

spec:
  containers:
  - name: my-container
    securityContext:
      capabilities:
        add: ["NET_RAW"]

如果您使用 GKE Autopilot,系統會 Google Cloud 禁止您將 NET_RAW 權限新增至容器,因為這項功能會造成安全疑慮。

外部依附元件

適用於 Autopilot 和 Standard 叢集

在沙箱中執行的不受信任程式碼,可能可以連線至外部服務,例如資料庫伺服器、API、其他容器和 CSI 驅動程式。這些服務會在沙箱邊界外執行,因此需要個別保護。攻擊者可能會試圖利用這些服務中的安全漏洞,突破沙箱限制。您必須考量沙箱內執行的程式碼可存取這些服務的風險和影響,並採取必要措施來保護這些服務。

這包括容器磁碟區的檔案系統實作項目,例如 ext4 和 CSI 驅動程式。CSI 驅動程式會在沙箱隔離區外執行,且可能具備主機和服務的專屬存取權。這些驅動程式中的安全漏洞可能會影響主機核心,並導致整個節點遭到入侵。建議您在具備最低必要權限的容器中執行 CSI 驅動程式,以減少遭到攻擊的風險。GKE Sandbox 支援使用 Compute Engine 永久磁碟 CSI 驅動程式

不相容的功能

您無法將 GKE Sandbox 與下列 Kubernetes 功能一起使用:

工作負載特性

適用於 Autopilot 和 Standard 叢集

為了存取節點核心而額外增加間接層,會造成效能上的取捨。隔離對於大型多用戶群叢集至為重要,因此 GKE Sandbox 可為您帶來最實質的好處。使用 GKE Sandbox 測試工作負載時,請牢記以下準則。

系統呼叫

適用於 Autopilot 和 Standard 叢集

工作負載會產生大量低負載的系統呼叫 (如大量的小型 I/O 作業),因此在沙箱中執行時可能需要更多系統資源,因此您可能需要使用功能更強大的節點,或在叢集中新增額外的節點。

直接存取硬體或虛擬化服務

適用於 Autopilot 和 Standard 叢集

如果您的工作負載需要下列任一項,則可能不適合使用 GKE Sandbox,否則無法直接存取節點上的主機核心:

  • 直接存取節點的硬體
  • 核心層級虛擬化功能
  • 特殊權限容器

後續步驟