存取機密 GKE 節點中的 vTPM 和驗證資訊

在機密 Google Kubernetes Engine 節點上執行的工作負載,可以存取及使用平台完整性和安全防護功能,例如虛擬信任平台模組 (vTPM) 和機密運算認證報告。本文說明安全工程師如何讓 GKE 工作負載可見 vTPM 和硬體式裝置,以執行遠端認證、密碼封存和隨機數產生等工作。

您應該已熟悉下列資源:

您使用的具體機密運算技術,取決於貴機構的威脅模型和安全需求。詳情請參閱「機密運算技術」。

機密運算工作

您可以從在機密 GKE 節點上執行的 Pod 存取 vTPM 和硬體模組。您可以使用這些模組執行加密編譯作業,例如密封密鑰或進行遠端認證。用於這些工作的特定模組取決於節點使用的機密運算技術,如下所示:

  • 密鑰封存:在所有機密運算技術中,工作負載都可以使用 Shielded VM vTPM 做為密鑰封存的信任根。
  • 遠端驗證:工作負載可使用下列其中一個模組進行遠端驗證:

    • AMD SEV:Shielded VM vTPM。
    • AMD SEV-SNP:以硬體為基礎的 AMD 安全處理器。
    • Intel TDX:以硬體為基礎的 Intel TDX 模組。

    如要進一步瞭解這些機密運算技術的遠端認證運作方式,請參閱「認證者架構和證據」。

事前準備

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

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

需求條件

在下列情況下,您可以使用機密 GKE 節點:

  • 視要存取的機密運算模組而定,叢集和節點集區必須執行下列其中一個版本:

    • vTPMs:任何 GKE 版本。
    • AMD SEV-SNP 硬體型裝置:GKE 1.33.5-gke.1350000 以上版本或 1.34.1-gke.2037000 以上版本。
    • Intel TDX 硬體型裝置:GKE 1.33.5-gke.1697000 以上版本,或 1.34.1-gke.2909000 以上版本。
  • 節點集區必須位於具有相應機器類型的 Compute Engine 位置。如要進一步瞭解區域可用性,請參閱「機器類型、CPU 和可用區」。

  • 節點必須使用 Container-Optimized OS 節點映像檔

安裝裝置外掛程式

如要讓 GKE Pod 顯示完整性和安全性資訊,請安裝裝置外掛程式。如要使用 DaemonSet 安裝外掛程式,請按照下列步驟操作:

  1. 連線至叢集:

    gcloud container clusters get-credentials CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION
    

    更改下列內容:

    • CLUSTER_NAME:叢集名稱。
    • CONTROL_PLANE_LOCATION:叢集控制層的區域或可用區,例如 us-central1us-central1-a
  2. 建立 cc-device-plugin DaemonSet:

    kubectl create -f https://raw.githubusercontent.com/google/cc-device-plugin/main/manifests/cc-device-plugin.yaml
    

建立 DaemonSet 後,機密 GKE 節點上的任何機密運算裝置,都會對在這些節點上執行的 Pod 顯示。

從 Pod 存取機密運算裝置

建立 DaemonSet 來安裝裝置外掛程式後,您就可以從 Pod 存取 vTPM 和硬體型裝置,方式與在 Kubernetes 中要求其他擴充資源類似。以下各節說明如何從任何 Pod 存取 vTPM,以及如何在 AMD SEV-SNP 和 Intel TDX 節點中存取硬體式模組。

從 Pod 存取 vTPM

如要從在機密 GKE 節點上執行的任何 Pod 存取 Shielded VM vTPM,請將 google.com/cc 裝置新增至容器資源限制。下列步驟會要求存取範例 Pod 中的 vTPM:

  1. 將下列 Pod 資訊清單儲存為 example-vtpm-pod.yaml

    apiVersion: v1
    kind: Pod
    metadata:
    name: my-vtpm-pod
    spec:
    containers:
    - name: test-vtpm
      image: ubuntu
      command: ["/bin/sh", "-c", "ls -l /dev/tpmrm0; sleep 3600"]
      ports:
      - containerPort: 8080
        name: http
      resources:
        limits:
          google.com/cc: 1
    
  2. 建立 Pod:

    kubectl apply -f example-vtpm-pod.yaml
    

    Pod 會取得「/dev/tpmrm0」裝置的存取權。

  3. 如要確認 Pod 能存取 vTPM,請檢查 Pod 記錄:

    kubectl logs my-vtpm-pod
    

    如果輸出內容包含檔案資訊,表示 Pod 可以存取裝置。

您可以透過應用程式程式碼與裝置互動。舉例來說,您可以使用 Go-TPM 程式庫與 vTPM 通訊,並執行密封等工作。如果您使用 AMD SEV,也可以使用 vTPM 對機密 VM 執行個體進行遠端認證。

從 Pod 存取硬體型模組

如果您使用 AMD SEV-SNP 或 Intel TDX,也可以在 Pod 中存取對應的硬體式模組,方法是在容器資源限制中指定對應的選取器。您必須使用這些模組,對採用 AMD SEV-SNP 和 Intel TDX 的節點執行遠端認證,因為 vTPM 並非這些技術中測量的信任根。

如要要求存取 AMD 安全處理器或 Intel TDX 模組,請按照下列步驟操作:

  1. 儲存下列其中一個 Pod 範例:

    • 要求 AMD SEV-SNP 裝置

      apiVersion: v1
      kind: Pod
      metadata:
        name: snp-test-pod
      spec:
        containers:
        - name: test-container
          image: alpine
          command: ["/bin/sh", "-c"]
          args:
            - |
              echo "Checking for SEV-SNP device..."
              ls -l /dev/sev-guest
              echo "SNP container started successfully"
              sleep 3600
          resources:
            limits:
              amd.com/sev-snp: "1"
            requests:
              amd.com/sev-snp: "1"
        nodeSelector:
          cloud.google.com/gke-confidential-nodes-instance-type: SEV_SNP

    • 要求 Intel TDX 裝置

      apiVersion: v1
      kind: Pod
      metadata:
        name: tdx-test-pod
      spec:
        containers:
        - name: test-container
          image: alpine
          command: ["/bin/sh", "-c"]
          args:
            - |
              echo "Checking for TDX device..."
              ls -l /dev/tdx*
              echo "TDX container started successfully"
              sleep 3600
          resources:
            limits:
              intel.com/tdx: "1"
            requests:
              intel.com/tdx: "1"
        nodeSelector:
          cloud.google.com/gke-confidential-nodes-instance-type: TDX

  2. 建立 Pod:

    kubectl create -f PATH_TO_POD_MANIFEST
    

    PATH_TO_POD_MANIFEST 替換為您儲存的 Pod 資訊清單檔案路徑。

    Pod 可存取下列其中一部裝置:

    • /dev/sev-guest,適用於 AMD SEV-SNP。
    • /dev/tdx_guest,適用於 Intel TDX。
  3. 如要確認 Pod 是否可以存取裝置,請檢查 Pod 記錄:

    kubectl logs POD_NAME
    

    POD_NAME 替換為您在上一步部署的範例 Pod 名稱。

    如果輸出內容包含檔案資訊,表示 Pod 可以存取裝置。

後續步驟