安全强化型虚拟机

安全强化型虚拟机可让您的 Compute Engine 虚拟机实例具有可验证的完整性,因此您可以确信您的实例未受到启动级或内核级恶意软件rootkit 的危害。安全强化型虚拟机的可验证完整性是通过使用安全启动、启用虚拟可信平台模块 (vTPM)测量启动完整性监控来实现的。

受防护的虚拟机是“受防护的云”计划中的第一个产品。“安全强化型云服务”计划旨在通过提供可验证的完整性和有助于防止数据渗漏的 vTPM 安全强化或密封等功能,为整个 Google Cloud Platform (GCP) 提供更加安全的基础。

安全启动

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

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

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

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

虚拟可信平台模块 (vTPM)

vTPM 是一个虚拟化的可信平台模块,它是一种专用计算机芯片,可以保护用于对系统的访问进行身份验证的对象(如密钥和证书)。安全强化型虚拟机 vTPM 与可信计算组 (TPM) 库规范 2.0 完全兼容,并且使用经过 FIPS 140-2 L1 验证的 BoringSSL

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

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

测量启动

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

测量启动过程。

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

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

完整性监控

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

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

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

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

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

完整性监控事件

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

  • 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 中的重要信息位于 earlyBootReportEvent 部分,包含以下部分和元素:

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

    • 0:包含 PCR0 的值,其中包含有关固件组件的信息。该 PCR 未实现,而是包含静态值。在针对完整性政策基准验证最新启动序列时,不使用它。
    • 1:包含 PCR4 的值,其中包含有关 UEFI 启动管理器代码和启动尝试的信息。
    • 2:包含 PCR5 的值,其中包含有关磁盘的 GUID 分区表的信息。在针对完整性政策基准验证最新启动序列时,不使用它。
    • 3:包含 PCR7 的值,其中包含有关实例的安全启动政策的信息。
  • policyEvaluationPassed:标识启动序列的给定部分是否通过了完整性政策基准的验证。

  • policyMeasurements:包含完整性政策基准的 PCR 值。policyMeasurements 部分包含以下元素:

    • 0:包含 PCR0 的值,其中包含有关固件组件的信息。该 PCR 未实现,而是包含静态值。在针对完整性政策基准验证最新启动序列时,不使用它。
    • 1:包含 PCR4 的值,其中包含有关 UEFI 启动管理器代码和启动尝试的信息。
    • 2:包含 PCR7 的值,其中包含有关实例的安全启动政策的信息。

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

lateBootReportEvent

lateBootReportEvent 中的重要信息位于 lateBootReportEvent 部分,包含以下部分和元素:

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

    • 0:包含 PCR0 的值,其中包含有关固件组件的信息。该 PCR 未实现,而是包含静态值。在针对完整性政策基准验证最新启动序列时,不使用它。
    • 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 未实现,而是包含静态值。在针对完整性政策基准验证最新启动序列时,不使用它。
    • 1:包含 PCR4 的值,其中包含有关 UEFI 启动管理器代码和启动尝试的信息。
    • 2:包含 PCR7 的值,其中包含有关实例的安全启动政策的信息。
    • 3:包含 PCR11 的值,其中包含有关 BitLocker 驱动程序加密访问控制的信息。
    • 4:包含 PCR13 的值,其中包含有关 Windows 内核和启动驱动程序的信息。
    • 5:包含 PCR14 的值,其中包含有关 Windows 启动权限的信息。

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

Linux

earlyBootReportEvent

earlyBootReportEvent 中的重要信息位于 earlyBootReportEvent 部分,包含以下部分和元素:

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

    • 0:包含 PCR0 的值,其中包含有关固件组件的信息。该 PCR 未实现,而是包含静态值。在针对完整性政策基准验证最新启动序列时,不使用它。
    • 1:包含 PCR4 的值,其中包含有关操作系统 shim 的信息。
    • 2:包含 PCR5 的值,其中包含有关磁盘的 GUID 分区表的信息。在针对完整性政策基准验证最新启动序列时,不使用它。
    • 3:包含 PCR7 的值,其中包含有关实例的安全启动政策的信息。
  • policyEvaluationPassed:标识启动序列的给定部分是否通过了完整性政策基准的验证。

  • policyMeasurements:包含完整性政策基准的 PCR 值。policyMeasurements 部分包含以下元素:

    • 0:包含 PCR0 的值,其中包含有关固件组件的信息。该 PCR 未实现,而是包含静态值。在针对完整性政策基准验证最新启动序列时,不使用它。
    • 1:包含 PCR4 的值,其中包含有关操作系统 shim 的信息。
    • 2:包含 PCR7 的值,其中包含有关实例的安全启动政策的信息。

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

lateBootReportEvent

lateBootReportEvent 中的重要信息位于 lateBootReportEvent 部分,包含以下部分和元素:

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

    • 0:包含 PCR0 的值,其中包含有关固件组件的信息。该 PCR 未实现,而是包含静态值。在针对完整性政策基准验证最新启动序列时,不使用它。
    • 1:包含 PCR4 的值,其中包含有关第二阶段引导加载程序和内核的信息。
    • 2:包含 PCR5 的值,其中包含有关磁盘的 GUID 分区表的信息。在针对完整性政策基准验证最新启动序列时,不使用它。
    • 3:包含 PCR7 的值,其中包含有关实例的安全启动政策的信息。
  • policyEvaluationPassed:标识启动序列的给定部分是否通过了完整性政策基准的验证。

  • policyMeasurements:包含完整性政策基准的 PCR 值。policyMeasurements 部分包含以下元素:

    • 0:包含 PCR0 的值,其中包含有关固件组件的信息。该 PCR 未实现,而是包含静态值。在针对完整性政策基准验证最新启动序列时,不使用它。
    • 1:包含 PCR4 的值,其中包含有关第二阶段引导加载程序和内核的信息。
    • 2:包含 PCR7 的值,其中包含有关实例的安全启动政策的信息。

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

Cloud Identity 和访问管理权限

受防护的虚拟机使用 Cloud 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 限制条件,请参阅在组织政策中使用布尔值限制条件。您必须拥有组织政策管理员的身份才能设置限制条件。

后续步骤

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页