關於 GKE 中的 seccomp


本頁面提供 Google Kubernetes Engine (GKE) 中 Linux 安全運算模式 (seccomp) 的相關資訊。您可以根據這項資訊,瞭解容器化應用程式可在支援節點的主機虛擬機器 (VM) 上執行哪些動作。

本頁內容適用於安全專家,他們在機構的安全策略中採用 seccomp,並想瞭解 GKE 如何與 seccomp 設定檔互動。如要進一步瞭解 Google Cloud 內容中提及的常見角色和範例工作,請參閱常見的 GKE Enterprise 使用者角色和工作

什麼是 seccomp?

安全運算模式 (或 seccomp) 是 Linux 的安全防護功能,可限制程序向 Linux 核心發出的系統呼叫 (syscall)。

根據預設,GKE 節點會使用 containerd 容器執行階段搭配 Container-Optimized OS 作業系統。containerd 會將允許的 Linux 功能限制為預設清單,進一步限制允許的系統呼叫,藉此保護 Linux 核心。您可以使用 seccomp 設定檔,containerd 也有可用的預設 seccomp 設定檔。GKE 是否會套用預設 seccomp 設定檔,取決於您使用的叢集模式,如下所示:

  • Autopilot (建議): GKE 會自動將 containerd 預設 seccomp 設定檔套用至所有工作負載。
  • 標準: GKE 不會自動將 containerd 預設 seccomp 設定檔套用至所有工作負載。建議您將預設 seccomp 設定檔或自訂 seccomp 設定檔套用至工作負載。

預設 containerd seccomp 設定檔可提供基本強化功能,同時維持與大多數工作負載的相容性。如要查看 containerd 的完整 seccomp 設定檔定義,請前往 GitHub

Linux 功能和系統呼叫

在 Linux 系統上執行的非根程序可能需要特定權限,才能以根使用者身分執行動作。Linux 會使用「功能」將可用權限劃分成多個群組,讓非根程序執行特定動作時,不必取得所有權限。如要讓程序順利執行特定系統呼叫,程序必須具備功能授予的對應權限。

如需所有 Linux 功能的清單,請參閱功能

預設 GKE seccomp 設定檔中遭拒的系統呼叫

containerd 預設 seccomp 設定檔會封鎖所有系統呼叫,然後選擇性地允許特定系統呼叫,其中有些系統呼叫取決於節點 VM 的 CPU 架構和核心版本。DefaultProfile 函式中的 syscalls 變數會列出所有架構允許的系統呼叫。

預設 seccomp 設定檔會封鎖可用於規避容器隔離界線的系統呼叫,並允許節點或其他容器的特殊權限存取。下表說明預設 seccomp 設定檔拒絕的部分重要系統呼叫:

遭拒的系統呼叫
mountumountumount2fsmountmount_setattr

限制程序存取或操控容器邊界外的節點檔案系統。

此外,由於 CAP_SYS_ADMIN 功能 已停用,因此也遭到拒絕。

bpf

限制程序在核心中建立 eBPF 程式,這可能會導致節點上的權限提升。舉例來說,CVE-2021-3490 使用了 bpf 系統呼叫。此外,由於 CAP_SYS_ADMIN 功能 已停用,因此也遭到拒絕。

cloneclone3unshare

限制程序在新命名空間中建立新程序,這些命名空間可能位於容器的受限命名空間之外。這些新程序可能具有更高的權限和功能。舉例來說,CVE-2022-0185 使用了 unshare 系統呼叫。此外,由於 CAP_SYS_ADMIN 功能 已停用,因此也遭到拒絕。

reboot

限制程序重新啟動節點。

遭拒,因為 CAP_SYS_BOOT 功能已遭捨棄。

open_by_handle_atname_to_handle_at

限制存取容器外的檔案。這些系統呼叫是其中一個最早的 Docker 容器逸出漏洞所使用的呼叫。此外,由於系統捨棄了 CAP_DAC_READ_SEARCH 功能CAP_SYS_ADMIN 功能,因此也遭到拒絕。

如何在 GKE 中使用 seccomp

在 Autopilot 叢集中,GKE 會自動將 containerd 預設 seccomp 設定檔套用至所有工作負載。您不須採取其他行動。嘗試發出受限制的系統呼叫會失敗。Autopilot 不允許自訂 seccomp 設定檔,因為節點是由 GKE 管理。

在標準叢集中,您必須手動套用 seccomp 設定檔。 GKE 不會為您套用設定檔。

在標準叢集中啟用 seccomp

如要手動套用 seccomp 設定檔,請使用 Pod 規格中的 spec.securityContext.seccompProfile 欄位,設定 Pod 或容器的安全性環境,如下列範例所示。除非您的用途需要使用任何受限的系統呼叫,否則強烈建議您為工作負載使用 seccomp 設定檔。支援的 seccompProfile 類型如下:

  • RuntimeDefault:containerd 執行階段指定的預設設定檔。
  • Localhost自訂設定檔定義

以下範例資訊清單會將 seccomp 設定檔設為執行階段預設設定檔:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
  labels:
    app: default-pod
spec:
  replicas: 3
  selector:
    matchLabels:
      app: default-pod
  template:
    metadata:
      labels:
        app: default-pod
    spec:
      securityContext:
        seccompProfile:
          type: RuntimeDefault
      containers:
      - name: seccomp-test
        image: nginx

部署這個資訊清單時,如果 Pod 中的容器嘗試發出違反執行階段預設 seccomp 設定檔的系統呼叫,Pod 或工作負載可能會發生非預期行為。舉例來說,如果 Pod 在啟動期間發出受限的系統呼叫,就會無法啟動。如果應用程式在 Pod 執行期間嘗試發出受限的系統呼叫,您可能會在容器中發現錯誤。失敗的系統呼叫嚴重程度取決於應用程式處理錯誤的方式。

在標準叢集中使用自訂 seccomp 設定檔

如果執行階段預設 seccomp 設定檔對應用程式而言過於嚴格 (或不夠嚴格),您可以將自訂 seccomp 設定檔套用至 Standard 叢集中的 Pod。這個程序需要存取節點上的檔案系統。如需載入及使用自訂 seccomp 設定檔的教學課程,請參閱「使用 seccomp 限制容器的系統呼叫」。

後續步驟