什么是安全强化型虚拟机?

本页面讨论安全强化型虚拟机的关键概念和术语。要开始使用安全强化型虚拟机,请参阅快速入门或查看修改安全强化型虚拟机选项

安全强化型虚拟机可让您的 Compute Engine 虚拟机实例具有可验证的完整性,因此您可以确信您的实例未受到启动级或内核级恶意软件rootkit 的危害。

安全强化型虚拟机的可验证完整性是通过使用以下功能实现的:

安全启动

安全启动会验证所有启动组件的数字签名,并在签名验证失败时停止启动过程,从而有助于确保系统仅运行正版软件。

安全强化型虚拟机实例运行的固件使用 Google 的证书授权机构对其进行签名和验证,确保实例的固件未经修改并为安全启动建立信任根统一的可扩展固件接口 (UEFI) 2.3.1 固件可安全地管理包含软件制造商用于为系统固件、系统引导加载程序及其加载的任何二进制文件签名的密钥的证书。安全强化型虚拟机实例使用 UEFI 固件。

在每次启动时,UEFI 固件会针对已批准密钥的安全存储验证每个启动组件的数字签名。所有未正确签名或根本未签名的启动组件都不允许运行。

如果发生这种情况,虚拟机实例的串行控制台日志中将出现一个条目(其中包含字符串 UEFI: Failed to load imageStatus:Security Violation),以及对失败的启动选项的说明。如需进行故障排查,请使用修改安全强化型虚拟机选项中的说明停用安全启动,以便您启动虚拟机实例,诊断并解决问题,然后重新启用安全启动。

虚拟可信平台模块 (vTPM)

vTPM 是一个虚拟化的可信平台模块,它是一种专用计算机芯片,可以保护用于对系统的访问进行身份验证的对象(如密钥和证书)。安全强化型虚拟机 vTPM 与可信计算组 (TPM) 库规范 2.0 完全兼容,并使用 BoringSSL 库。BoringSSL 库依赖于 BoringCrypto 模块。如需了解有关 BoringCrypto 模块的 FIPS 140-2 详细信息,请参阅 NIST 加密模块验证计划证书 #3678

安全强化型虚拟机 vTPM 通过执行创建已知的良好启动基准(称为完整性政策基准)所需的测量来启用测量启动完整性政策基准用于与后续虚拟机启动的测量进行比较,以确定是否有任何更改。

您还可以使用 vTPM 通过安全强化或密封功能来保护密钥。如需查看如何使用 vTPM 实现此目的的 Go 语言示例,请参阅 GitHub 上的 Go-TPM 项目。

测量启动

在测量启动期间,加载组件时会创建每个组件(例如,固件、引导加载程序或内核)的哈希,然后将该哈希与已加载的任何组件的哈希进行连接并重新哈希,如下图所示:

测量启动过程图

此信息标识已加载的组件及其加载顺序。

首次启动虚拟机实例时,测量启动会从第一组测量中创建完整性政策基准,并安全地存储此数据。此后,虚拟机实例每次启动时,将再次执行这些测量,并将其存储在安全内存中,直到下次重新启动。通过这两组测量可以实现完整性监控,您可以使用它来确定虚拟机实例的启动序列是否发生了更改。

完整性监控

完整性监控可帮助您了解虚拟机实例的状态并作出决策。

完整性监控依赖于测量启动创建的测量,它使用平台配置寄存器 (PCR) 来存储有关完整性政策基准(已知的良好启动序列)和最近启动序列的组件和组件加载顺序的信息。

完整性监控将最近的启动测量与完整性政策基准进行比较,并根据它们是否匹配返回一对通过/失败结果,一个用于前期启动序列,另一个用于后期启动序列。前期启动是从 UEFI 固件启动到它将控制传递给启动加载程序的启动序列。后期启动是从引导加载程序到它将控制传递给操作系统内核的启动序列。如果最近启动序列的任何一部分与基准不匹配,则会导致完整性验证失败。

如果预期会失败(例如,如果对虚拟机实例应用了系统更新),则应更新完整性政策基准。更新完整性政策基准会将基准设置为从最近启动序列捕获的测量。如果失败不是预期的,则应该停止该虚拟机实例并调查失败的原因。

您可以在 Cloud Monitoring 中查看完整性报告,并设置在出现完整性失败时发出警报。您可以在 Cloud Logging 中查看完整性监控结果的详细信息。如需了解详情,请参阅监控受防护的虚拟机实例上的完整性

完整性监控事件

受防护的虚拟机为以下类型的事件创建日志条目:

  • clearTPMEvent:标识是否已清除 vTPM,这会删除存储在其中的所有密钥。这不会影响安全强化型虚拟机的任何方面,因此,只有在使用 vTPM 防护敏感数据时才需要担心此问题,如虚拟可信平台模块 (vTPM) 中所述。
  • earlyBootReportEvent:标识前期启动序列的完整性检查是否通过,并提供基准和最近启动序列(进行比较以作出判定)中 PCR 值的详细信息。
  • lateBootReportEvent:标识后期启动序列的完整性检查是否通过,并提供基准和最近启动序列(进行比较以作出判定)中 PCR 值的详细信息。
  • setShieldedInstanceIntegrityPolicy:每次更新完整性政策基准时进行记录。
  • shutdownEvent:每次停止虚拟机实例时进行记录。
  • startupEvent:每次启动虚拟机实例时进行记录。此事件中的 bootCounter 值十分有趣,该值标识此实例的重启次数。
  • updateShieldedInstanceConfig:每次启用或停用其中一个安全强化型虚拟机选项时进行记录。

您在日志中看到的典型事件进程是 startupEventearlyBootReportEventlateBootReportEvent 和最后的 shutdownEvent,它们具有相同的 bootCounter 值,以将它们标识为描述同一虚拟机实例启动序列。

如果更新完整性政策基准以响应虚拟机实例上预期的完整性失败,则将看到描述新的完整性政策基准测量结果的其他 earlyBootReportEventlateBootReportEvent 事件。以下示例显示预期序列:

  • startupEvent
  • earlyBootReportEvent,用于将原始基准与最新启动序列进行比较(通过)
  • lateBootReportEvent,用于将原始基准与最新启动序列进行比较(失败)
  • setShieldedInstanceIntegrityPolicy更新完整性政策基准时,将基准设置为从最新启动序列捕获的测量结果
  • earlyBootReportEvent,用于将新基准与最新启动序列进行比较(通过)
  • lateBootReportEvent,用于将新基准与最新启动序列进行比较(通过)

Windows

earlyBootReportEvent

earlyBootReportEvent 包含以下部分和元素:

  • actualMeasurements:包含最新启动序列的平台配置寄存器 (PCR) 值。PCR 值用于标识最新启动序列使用的启动组件和组件加载顺序,并与完整性政策基准(其值是在 policyMeasurements 部分捕获的)进行比较,以确定虚拟机实例启动序列中是否经过了任何更改。actualMeasurements 部分的元素可能因操作系统、发行版和配置而异。该部分通常包含以下元素:

    • 0:包含 PCR0 的值,其中包含有关固件组件和活动的内存加密技术的信息。此 PCR 与 TCG PCClient 平台固件配置文件的不同之处在于,它仅测量以下事件:
      • EV_S_CRTM_VERSION,Compute Engine 固件版本
      • EV_NONHOST_INFO,表示内存加密技术
      • EV_SEPARATOR,指定的分隔符事件固件测量何时不再添加更多 PCR0 事件。这意味着 PCR0 在虚拟机的生命周期内具有静态值。此值仅在主要版本固件更新或加密技术发生变化后针对新虚拟机更改。在针对完整性政策基准验证最新启动序列时,不使用它。
    • 1:包含 PCR4 的值,其中包含有关 UEFI 启动管理器代码和启动尝试的信息。
    • 2:包含 PCR5 的值,其中包含有关磁盘的 GUID 分区表的信息。在针对完整性政策基准验证最新启动序列时,不使用它。
    • 3:包含 PCR7 的值,其中包含有关实例的安全启动政策的信息。
  • policyEvaluationPassed:标识启动序列的给定部分是否通过了完整性政策基准的验证。

  • policyMeasurements:包含完整性验证用作预期值的基准 PCR 值。policyMeasurements 部分可能因操作系统、发行版本和配置而异,但通常包含以下元素:

    • 0:包含 PCR0 的值,其中包含有关固件组件和活动的内存加密技术的信息。此 PCR 与 TCG PCClient 平台固件配置文件的不同之处在于,它仅测量以下事件:
      • EV_S_CRTM_VERSION,Compute Engine 固件版本
      • EV_NONHOST_INFO,表示内存加密技术
      • EV_SEPARATOR,指定的分隔符事件固件测量何时不再添加更多 PCR0 事件。这意味着 PCR0 在虚拟机的生命周期内具有静态值。此值仅在主要版本固件更新或加密技术发生变化后针对新虚拟机更改。在针对完整性政策基准验证最新启动序列时,不使用它。
    • 1:包含 PCR4 的值,其中包含有关 UEFI 启动管理器代码和启动尝试的信息。此值不在首次启动中。
    • 2:包含 PCR7 的值,其中包含有关实例的安全启动政策的信息。

如需了解如何使用 earlyBootReportEvent PCR 值诊断启动完整性验证失败,请参阅确定启动完整性验证失败的原因

lateBootReportEvent

lateBootReportEvent 包含以下部分和元素:

  • actualMeasurements:包含最新启动序列的平台配置寄存器 (PCR) 值。PCR 值用于标识最新启动序列使用的启动组件和组件加载顺序,并与完整性政策基准(其值是在 policyMeasurements 部分捕获的)进行比较,以确定虚拟机实例启动序列中是否经过了任何更改。actualMeasurements 部分的元素可能因操作系统、发行版和配置而异。该部分通常包含以下元素:

    • 0:包含 PCR0 的值,其中包含有关固件组件和活动的内存加密技术的信息。此 PCR 与 TCG PCClient 平台固件配置文件的不同之处在于,它仅测量以下事件:
      • EV_S_CRTM_VERSION,Compute Engine 固件版本
      • EV_NONHOST_INFO,表示内存加密技术
      • EV_SEPARATOR,指定的分隔符事件固件测量何时不再添加更多 PCR0 事件。这意味着 PCR0 在虚拟机的生命周期内具有静态值。此值仅在主要版本固件更新或加密技术发生变化后针对新虚拟机更改。在针对完整性政策基准验证最新启动序列时,不使用它。
    • 1:包含 PCR4 的值,其中包含有关 UEFI 启动管理器代码和启动尝试的信息。
    • 2:包含 PCR5 的值,其中包含有关磁盘的 GUID 分区表的信息。在针对完整性政策基准验证最新启动序列时,不使用它。
    • 3:包含 PCR7 的值,其中包含有关实例的安全启动政策的信息。
    • 4:包含 PCR11 的值,其中包含有关 BitLocker 驱动程序加密访问控制的信息。
    • 5:包含 PCR12 的值,其中包含有关数据事件的信息。在针对完整性政策基准验证最新启动序列时,不使用它。
    • 6:包含 PCR13 的值,其中包含有关 Windows 内核和启动驱动程序的信息。
    • 7:包含 PCR14 的值,其中包含有关 Windows 启动权限的信息。
  • policyEvaluationPassed:标识启动序列的给定部分是否通过了完整性政策基准的验证。

  • policyMeasurements:包含完整性验证用作预期值的基准 PCR 值。policyMeasurements 部分可能因操作系统、发行版本和配置而异,但通常包含以下元素:

    • 0:包含 PCR0 的值,其中包含有关固件组件和活动的内存加密技术的信息。此 PCR 与 TCG PCClient 平台固件配置文件的不同之处在于,它仅测量以下事件:
      • EV_S_CRTM_VERSION,Compute Engine 固件版本
      • EV_NONHOST_INFO,表示内存加密技术
      • EV_SEPARATOR,指定的分隔符事件固件测量何时不再添加更多 PCR0 事件。这意味着 PCR0 在虚拟机的生命周期内具有静态值。此值仅在主要版本固件更新或加密技术发生变化后针对新虚拟机更改。在针对完整性政策基准验证最新启动序列时,不使用它。
    • 1:包含 PCR4 的值,其中包含有关 UEFI 启动管理器代码和启动尝试的信息。
    • 2:包含 PCR7 的值,其中包含有关实例的安全启动政策的信息。
    • 3:包含 PCR11 的值,其中包含有关 BitLocker 驱动程序加密访问控制的信息。
    • 4:包含 PCR13 的值,其中包含有关 Windows 内核和启动驱动程序的信息。
    • 5:包含 PCR14 的值,其中包含有关 Windows 启动权限的信息。

如需了解如何使用 lateBootReportEvent PCR 值诊断启动完整性验证失败,请参阅确定启动完整性验证失败的原因

Linux

earlyBootReportEvent

earlyBootReportEvent 包含以下部分和元素:

  • actualMeasurements:包含最新启动序列的平台配置寄存器 (PCR) 值。PCR 值用于标识最新启动序列使用的启动组件和组件加载顺序,并与完整性政策基准(其值是在 policyMeasurements 部分捕获的)进行比较,以确定虚拟机实例启动序列中是否经过了任何更改。actualMeasurements 部分的元素可能因操作系统、发行版和配置而异。该部分通常包含以下元素:

    • 0:包含 PCR0 的值,其中包含有关固件组件和活动的内存加密技术的信息。此 PCR 与 TCG PCClient 平台固件配置文件的不同之处在于,它仅测量以下事件:
      • EV_S_CRTM_VERSION,Compute Engine 固件版本
      • EV_NONHOST_INFO,表示内存加密技术
      • EV_SEPARATOR,指定的分隔符事件固件测量何时不再添加更多 PCR0 事件。这意味着 PCR0 在虚拟机的生命周期内具有静态值。此值仅在主要版本固件更新或加密技术发生变化后针对新虚拟机更改。在针对完整性政策基准验证最新启动序列时,不使用它。
    • 1:包含 PCR4 的值,其中包含有关操作系统 shim 的信息。
    • 2:包含 PCR7 的值,其中包含有关实例的安全启动政策的信息。
  • policyEvaluationPassed:标识启动序列的给定部分是否通过了完整性政策基准的验证。

  • policyMeasurements:包含完整性验证用作预期值的基准 PCR 值。policyMeasurements 部分可能因操作系统、发行版本和配置而异,但通常包含以下元素:

    • 0:包含 PCR0 的值,其中包含有关固件组件和活动的内存加密技术的信息。此 PCR 与 TCG PCClient 平台固件配置文件的不同之处在于,它仅测量以下事件:
      • EV_S_CRTM_VERSION,Compute Engine 固件版本
      • EV_NONHOST_INFO,表示内存加密技术
      • EV_SEPARATOR,指定的分隔符事件固件测量何时不再添加更多 PCR0 事件。这意味着 PCR0 在虚拟机的生命周期内具有静态值。此值仅在主要版本固件更新或加密技术发生变化后针对新虚拟机更改。在针对完整性政策基准验证最新启动序列时,不使用它。
    • 1:包含 PCR4 的值,其中包含有关操作系统 shim 的信息。此值不在首次启动中。
    • 2:包含 PCR7 的值,其中包含有关实例的安全启动政策的信息。

如需了解如何使用 earlyBootReportEvent PCR 值诊断启动完整性验证失败,请参阅确定启动完整性验证失败的原因

lateBootReportEvent

lateBootReportEvent 包含以下部分和元素:

  • actualMeasurements:包含最新启动序列的平台配置寄存器 (PCR) 值。PCR 值用于标识最新启动序列使用的启动组件和组件加载顺序,并与完整性政策基准(其值是在 policyMeasurements 部分捕获的)进行比较,以确定虚拟机实例启动序列中是否经过了任何更改。 actualMeasurements 部分的元素可能因操作系统、发行版和配置而异。该部分通常包含以下元素:

    • 0:包含 PCR0 的值,其中包含有关固件组件和活动的内存加密技术的信息。此 PCR 与 TCG PCClient 平台固件配置文件的不同之处在于,它仅测量以下事件:
      • EV_S_CRTM_VERSION,Compute Engine 固件版本
      • EV_NONHOST_INFO,表示内存加密技术
      • EV_SEPARATOR,指定的分隔符事件固件测量何时不再添加更多 PCR0 事件。这意味着 PCR0 在虚拟机的生命周期内具有静态值。此值仅在主要版本固件更新或加密技术发生变化后针对新虚拟机更改。在针对完整性政策基准验证最新启动序列时,不使用它。
    • 1:包含 PCR4 的值,其中包含有关第二阶段引导加载程序和内核的信息。
    • 2:包含 PCR5 的值,其中包含有关磁盘的 GUID 分区表的信息。在针对完整性政策基准验证最新启动序列时,不使用它。
    • 3:包含 PCR7 的值,其中包含有关实例的安全启动政策的信息。
  • policyEvaluationPassed:标识启动序列的给定部分是否通过了完整性政策基准的验证。

  • policyMeasurements:包含完整性验证用作预期值的基准 PCR 值。policyMeasurements 部分可能因操作系统、发行版本和配置而异,但通常包含以下元素:

    • 0:包含 PCR0 的值,其中包含有关固件组件和活动的内存加密技术的信息。此 PCR 与 TCG PCClient 平台固件配置文件的不同之处在于,它仅测量以下事件:
      • EV_S_CRTM_VERSION,Compute Engine 固件版本
      • EV_NONHOST_INFO,表示内存加密技术
      • EV_SEPARATOR,指定的分隔符事件固件测量何时不再添加更多 PCR0 事件。这意味着 PCR0 在虚拟机的生命周期内具有静态值。此值仅在主要版本固件更新或加密技术发生变化后针对新虚拟机更改。在针对完整性政策基准验证最新启动序列时,不使用它。
    • 1:包含 PCR4 的值,其中包含有关第二阶段引导加载程序和内核的信息。
    • 2:包含 PCR7 的值,其中包含有关实例的安全启动政策的信息。

如需了解如何使用 lateBootReportEvent PCR 值诊断启动完整性验证失败,请参阅确定启动完整性验证失败的原因

将 BitLocker 与安全强化型虚拟机映像结合使用

您可以为安全强化型虚拟机映像中的 Windows 启动磁盘启用 BitLocker。安全强化型虚拟机映像提供了诸多安全功能,例如符合 UEFI 标准的固件、安全启动、受 vTPM 保护的测量启动以及完整性监控。默认情况下,vTPM 和完整性监控处于启用状态,Google 建议尽量启用安全启动

如果您选择在安全强化型虚拟机映像中的 Windows 启动磁盘上启用 BitLocker,我们强烈建议您将恢复密钥保存到安全位置,因为必须有恢复密钥,才能恢复数据。

在安全强化型虚拟机映像中的 Windows 启动磁盘上启用 BitLocker 之前,请考虑以下注意事项:

  • 在安全强化型虚拟机启动磁盘上,BitLocker 使用 vTPM 存储加密密钥,而 vTPM 与创建它的虚拟机永久关联。这意味着您可以将安全强化型虚拟机启动磁盘的快照恢复到另一个永久性磁盘,但无法对其进行解密,因为包含 BitLocker 密钥的 vTPM 不可用。如果您有恢复密钥,则可以按照 BitLocker 恢复指南中的说明恢复数据。 如果您没有恢复密钥,则无法恢复磁盘上的数据。

  • 在安全强化型虚拟机数据磁盘上,默认会加密永久性磁盘数据。在永久性磁盘加密的基础上启用 BitLocker 不会影响吞吐量,但可能会略微提高 vCPU 利用率。在挂接到虚拟机的数据磁盘上启用 BitLocker 不会带来与启动磁盘相同的恢复问题。这是因为数据磁盘的 BitLocker 加密密钥并未存储在 vTPM 上。如果您无法正常解锁磁盘,但拥有恢复密钥,则可将磁盘挂接到另一个未加密的虚拟机并从该虚拟机进行恢复。如果您没有恢复密钥,则无法恢复磁盘上的数据。

Identity and Access Management 授权

受防护的虚拟机使用 IAM 进行授权。

受防护的虚拟机操作使用以下 Compute Engine 权限:

  • compute.instances.updateShieldedInstanceConfig:允许用户更改虚拟机实例上的安全强化型虚拟机选项。
  • compute.instances.setShieldedInstanceIntegrityPolicy:允许用户更新虚拟机实例上的完整性政策基准。
  • compute.instances.getShieldedInstanceIdentity:允许用户从 vTPM 检索背书密钥信息。

向以下 Compute Engine 角色授予受防护的虚拟机权限:

  • roles/compute.instanceAdmin.v1
  • roles/compute.securityAdmin

您还可以向自定义角色授予安全强化型虚拟机权限。

安全强化型虚拟机的组织政策限制条件

您可以将 constraints/compute.requireShieldedVm 组织政策限制条件设置为 True 以要求在组织中创建的 Compute Engine 虚拟机实例为安全强化型虚拟机实例。

如需了解如何设置 constraints/compute.requireShieldedVm 限制条件,请参阅在组织政策中使用布尔值限制条件。您必须拥有组织政策管理员的身份才能设置限制条件。

后续步骤