安全地启动虚拟机

本文档介绍了如何在 Google Distributed Cloud (GDC) 网闸隔离配置中的虚拟机 (VM) 实例上启用安全启动或虚拟化可信平台模块 (vTPM)。

本文档适用于在 GDC 环境中为虚拟机配置安全启动和 vTPM 的平台管理员或应用运维人员群组中的开发者。如需了解详情,请参阅适用于 GDC 网闸隔离配置文档的受众群体。

关于安全启动

安全启动是一项功能,可验证所有启动组件的数字签名,并在验证失败时停止启动过程,从而确保系统仅运行正版软件。它使用统一可扩展固件接口 (UEFI) 固件来管理制造商用于为系统固件、引导加载程序和加载的二进制文件签名的证书和密钥。

每次启动时,UEFI 固件都会根据存储的已批准密钥验证每个组件的数字签名,并阻止任何未签名或签名不正确的组件。 如需在虚拟机实例上启用安全启动,您必须将虚拟机的 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。 如需查看说明如何为此目的使用 vTPM 的 Go 语言示例,请参阅 GitHub 上的 Go-TPM 项目 - https://github.com/google/go-tpm。

准备工作

如需使用 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 角色

如需获得在虚拟机上启用安全启动或 vTPM 所需的权限,请让您的 IAM 项目管理员为您授予虚拟机项目管理员 (project-vm-admin) 角色。

所有虚拟机角色都必须绑定到虚拟机所在项目的命名空间。 按照相关步骤验证您的访问权限。

启用安全启动

为虚拟机启用安全启动。请按照以下说明操作,在项目的命名空间 (PROJECT_NAMESPACE) 中创建一个名为 VM_NAME 的虚拟机。

  1. 如果虚拟机正在运行,请先将其停止,然后再应用补丁。如果您在虚拟机运行时尝试修补 shieldConfig,API 会返回 Forbidden 错误:Changes to shieldConfig are not allowed while the VM is running。如需查看相关说明,请参阅停止虚拟机。

  2. 更新虚拟机自定义资源以启用安全启动:

    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:Management API 服务器的 kubeconfig 文件。
    • PROJECT_NAMESPACE:虚拟机所在项目的命名空间。
    • VM_NAME:虚拟机的名称。
  3. 成功应用补丁后,请按照启动虚拟机的说明启动虚拟机。

  4. 验证您是否已启用安全启动。与虚拟机建立 SSH 连接,然后运行以下命令:

    mokutil --sb-state
    

    如果您已成功启用安全启动,该命令会返回 SecureBoot enabled。

    如果 mokutil 工具报告您尚未启用安全启动,请按照排查安全启动配置问题部分中的步骤操作。

排查安全启动配置问题

  1. 在编辑器中打开虚拟机自定义资源:

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

    执行以下变量替换操作:

    • MANAGEMENT_API_SERVER:Management API 服务器的 kubeconfig 文件。
    • PROJECT_NAMESPACE:虚拟机所在项目的命名空间。
    • VM_NAME:虚拟机的名称。
  2. 查找缺失的字段或值,如启用安全启动中的 spec 字段所示。这些是必填项。

  3. 如果缺少任何字段或字段不正确,请修改 spec 以添加缺少的字段并更正错误的值。

  4. 保存文件。

  5. 按照重启虚拟机中的步骤操作。

如果上述步骤无法解决您的问题,请查看与虚拟机的操作系统 (OS) 对应的文档,验证该操作系统版本是否支持安全启动。

启用 vTPM

为虚拟机启用 vTPM。对项目命名空间 (PROJECT_NAMESPACE) 中名为 VM_NAME 的虚拟机使用以下说明。

  1. 如果虚拟机正在运行,请先将其停止,然后再应用补丁。如果您在虚拟机运行时尝试修补 shieldConfig,API 会返回 Forbidden 错误:Changes to shieldConfig are not allowed while the VM is running。如需查看相关说明,请参阅停止虚拟机。

  2. 更新虚拟机自定义资源以启用 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:Management API 服务器的 kubeconfig 文件。
    • PROJECT_NAMESPACE:虚拟机所在项目的命名空间。
    • VM_NAME:虚拟机的名称。
  3. 成功应用补丁后,请按照启动虚拟机的说明启动虚拟机。

  4. 验证您是否已启用 vTPM。与虚拟机建立 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. 在编辑器中打开虚拟机自定义资源:

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

    执行以下变量替换操作:

    • MANAGEMENT_API_SERVER:Management API 服务器的 kubeconfig 文件。
    • PROJECT_NAMESPACE:虚拟机所在项目的命名空间。
    • VM_NAME:虚拟机的名称。
  2. 查找缺失的字段或值,如启用 vTPM 中的 spec 字段所示。这些是必填项。

  3. 如果缺少任何字段或字段不正确,请修改 spec 以添加缺少的字段并更正错误的值。

  4. 保存文件。

  5. 按照重启虚拟机中的步骤操作。

如果上述步骤无法解决您的问题,请查看与虚拟机的操作系统 (OS) 对应的文档,验证操作系统版本是否支持 vTPM。