安全啟動 VM

本文說明如何在 Google Distributed Cloud (GDC) 實體隔離方案的虛擬機器 (VM) 執行個體上,啟用安全啟動或虛擬化信任平台模組 (vTPM)。

本文適用對象為平台管理員或應用程式操作員群組中的開發人員,他們會在 GDC 環境中設定 VM 的安全啟動和 vTPM。詳情請參閱「GDC 實體隔離方案說明文件的目標對象」。

關於安全啟動

安全啟動功能會驗證所有啟動元件的數位簽章,確保系統只執行真實可信的軟體。如果驗證失敗,就會停止啟動程序。這項功能會使用統一可延伸韌體介面 (UEFI) 韌體,管理製造商用來簽署系統韌體、開機載入器和載入二進位檔的憑證和金鑰。

每次啟動時,UEFI 韌體都會根據儲存的核准金鑰驗證每個元件的數位簽章,並封鎖任何未簽署或簽署不當的元件。如要在 VM 執行個體上啟用安全啟動功能,您必須將 VM 的 shieldConfig.bootType 欄位設為 uefi,並將 shieldConfig.enableSecureBoot 設為 true。

如要查看官方 UEFI 說明文件,請前往 https://uefi.org/sites/default/files/resources/UEFI_Secure_Boot_in_Modern_Computer_Security_Solutions_2013.pdf。

關於虛擬信任平台模組

vTPM 是專門的虛擬電腦晶片,可保護用於驗證系統存取權的金鑰和憑證。如要進一步瞭解 vTPM,請參閱 https://trustedcomputinggroup.org/trusted-platform-module-tpm-summary/。

您也可以使用 vTPM,透過防護或封存機制保護密鑰。如要進一步瞭解密封儲存空間,請參閱 https://en.wikipedia.org/wiki/Trusted_Computing#SEALED-STORAGE。請參閱 GitHub 上的 Go-TPM 專案 (https://github.com/google/go-tpm),瞭解如何使用 vTPM 達成這個目的。

事前準備

如要使用 gdcloud 指令列介面 (CLI) 指令,請務必下載、安裝及設定 gdcloud CLI。Distributed Cloud 的所有指令都使用 gdcloud 或 kubectl CLI,且需要作業系統 (OS) 環境。

取得 kubeconfig 檔案路徑

如要對 Management API 伺服器執行指令,請確認您具備下列資源:

  1. 如果沒有 Management API 伺服器的 kubeconfig 檔案,請登入並產生該檔案。

  2. 請使用 Management API 伺服器的 kubeconfig 檔案路徑,取代這些操作說明中的 MANAGEMENT_API_SERVER。

要求 IAM 角色

如要取得在 VM 上啟用安全啟動或 vTPM 所需的權限,請要求 IAM 專案管理員授予您虛擬機器專案管理員 (project-vm-admin) 角色。

所有 VM 角色都必須繫結至 VM 所在專案的命名空間。按照步驟驗證存取權。

啟用安全啟動功能

為 VM 啟用安全啟動功能。請按照下列操作說明,在專案的命名空間 (PROJECT_NAMESPACE) 中建立名為 VM_NAME 的 VM。

  1. 如果 VM 正在運作,請先停止 VM,再套用修補程式。如果在 VM 執行期間嘗試修補 shieldConfig,API 會傳回 Forbidden 錯誤:Changes to shieldConfig are not allowed while the VM is running。如需操作說明,請參閱「停止 VM」。

  2. 更新 VM 自訂資源,啟用安全啟動功能:

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      -n PROJECT_NAMESPACE \
      patch virtualmachines.virtualmachine.gdc.goog VM_NAME \
      --type merge --patch $'
    spec:
      shieldConfig:
        bootType: uefi
        enableSecureBoot: true
    '
    

    請替換下列變數:

    • MANAGEMENT_API_SERVER:管理 API 伺服器的 kubeconfig 檔案。
    • PROJECT_NAMESPACE:VM 所在專案的命名空間。
    • VM_NAME:VM 的名稱。
  3. 成功套用修補程式後,請按照啟動 VM 的操作說明啟動 VM。

  4. 確認您已啟用安全啟動功能。建立與 VM 的 SSH 連線,然後執行下列指令:

    mokutil --sb-state
    

    如果成功啟用安全啟動功能,指令會傳回 SecureBoot enabled。

    如果 mokutil 工具回報您尚未啟用安全啟動功能,請按照「排解安全啟動設定問題」一節中的步驟操作。

排解安全啟動設定問題

  1. 在編輯器中開啟 VM 自訂資源:

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      -n PROJECT_NAMESPACE \
      edit virtualmachines.virtualmachine.gdc.goog VM_NAME
    

    請替換下列變數:

    • MANAGEMENT_API_SERVER:管理 API 伺服器的 kubeconfig 檔案。
    • PROJECT_NAMESPACE:VM 所在專案的命名空間。
    • VM_NAME:VM 的名稱。
  2. 請查看「啟用安全啟動功能」中的 spec 欄位,找出缺少的欄位或值。這些是必要資訊。

  3. 如有缺漏或不正確,請編輯 spec,新增缺少的欄位並修正錯誤的值。

  4. 儲存檔案。

  5. 按照「重新啟動 VM」中的步驟操作。

如果上述步驟無法解決問題,請查看 VM 作業系統 (OS) 的說明文件,確認 OS 版本支援安全啟動。

啟用 vTPM

為 VM 啟用 vTPM。請按照下列操作說明,在專案的命名空間 (PROJECT_NAMESPACE) 中建立名為 VM_NAME 的 VM。

  1. 如果 VM 正在運作,請先停止 VM,再套用修補程式。如果在 VM 執行期間嘗試修補 shieldConfig,API 會傳回 Forbidden 錯誤:Changes to shieldConfig are not allowed while the VM is running。如需操作說明,請參閱「停止 VM」。

  2. 更新 VM 自訂資源,啟用 vTPM:

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      -n PROJECT_NAMESPACE \
      patch virtualmachines.virtualmachine.gdc.goog VM_NAME \
      --type merge --patch $'
    spec:
      shieldConfig:
        enableVtpm: true
    '
    

    請替換下列變數:

    • MANAGEMENT_API_SERVER:管理 API 伺服器的 kubeconfig 檔案。
    • PROJECT_NAMESPACE:VM 所在專案的命名空間。
    • VM_NAME:VM 的名稱。
  3. 成功套用修補程式後,請按照啟動 VM 的操作說明啟動 VM。

  4. 確認已啟用 vTPM。建立與 VM 的 SSH 連線,然後執行下列指令:

    dmesg | grep -i tpm
    

    如果成功啟用 vTPM,指令會傳回 TPM 模組,做為 ACPI 資料表的一部分。輸出結果會與下列內容相似:

    [    7.620985] tpm_tis MSFT0101:00: 2.0 TPM (device-id 0x1, rev-id 1)
    

    如果 ACPI tables 未顯示 TPM 模組,請按照「排解 vTPM 設定問題」一節的步驟操作。

排解 vTPM 設定問題

  1. 在編輯器中開啟 VM 自訂資源:

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      -n PROJECT_NAMESPACE \
      edit virtualmachines.virtualmachine.gdc.goog VM_NAME
    

    請替換下列變數:

    • MANAGEMENT_API_SERVER:管理 API 伺服器的 kubeconfig 檔案。
    • PROJECT_NAMESPACE:VM 所在專案的命名空間。
    • VM_NAME:VM 的名稱。
  2. 找出缺少的欄位或值,如「啟用 vTPM」中的 spec 欄位所示。這些是必要資訊。

  3. 如有缺漏或不正確,請編輯 spec,新增缺少的欄位並修正錯誤的值。

  4. 儲存檔案。

  5. 按照「重新啟動 VM」中的步驟操作。

如果上述步驟無法解決問題,請查看 VM 作業系統 (OS) 的對應說明文件,確認 OS 版本支援 vTPM。