安全引导属于 UEFI 固件标准的一部分。使用安全引导后,计算机会拒绝加载任何 UEFI 驱动程序或应用程序,除非操作系统引导加载程序以加密形式进行签名。在 vSphere 6.5 及更高版本中,如果在硬件中启用了安全引导,则 ESXi 会支持安全引导。

ESXi 如何使用 UEFI 安全引导

ESXi 版本 6.5 和更高版本在引导堆栈的各个级别上均支持 UEFI 安全引导。

注: 在已升级的主机上使用 UEFI 安全引导之前,请按照 在升级后的 ESXi 主机上运行安全引导验证脚本中的说明检查兼容性。
图 1. UEFI 安全引导
UEFI 安全引导堆栈包括文本中说明的多个元素。

使用安全引导后,引导顺序如下所示。

  1. vSphere 6.5 及更高版本中,ESXi 引导加载程序包含 VMware 公钥。该引导加载程序使用此密钥验证内核签名以及包含安全引导 VIB 验证器的小型系统子集。
  2. VIB 验证器验证系统上安装的每个 VIB 软件包。

此时将引导整个系统以及属于 UEFI 固件的证书中的可信 root。

注: 当您安装或者升级到 vSphere 7.0 Update 2 或更高版本,并且 ESXi 主机具有 TPM 时,TPM 会基于 UEFI 安全引导的 PCR 值使用 TPM 策略来封装敏感信息。如果符合策略,则后续重新引导期间将加载此值。要在 vSphere 7.0 Update 2 及更高版本中停用或激活 UEFI 安全引导,请参见 激活或停用安全引导实施以获得安全的 ESXi 配置

UEFI 安全引导故障排除

如果安全引导在引导顺序的任何一级别上失败,则会出错。

错误消息取决于硬件供应商和验证失败的级别。
  • 如果尝试使用未签名或已被篡改的引导加载程序进行引导,则会在执行引导顺序时出错。确切消息取决于硬件供应商。此消息可能类似以下错误,但可能有所不同。
    UEFI0073: Unable to boot PXE Device...because of the Secure Boot policy 
  • 如果内核已被篡改,则会出现类似以下结果的错误。
    Fatal error: 39 (Secure Boot Failed)
  • 如果软件包(VIB 或驱动程序)已被篡改,则会显示紫色屏幕以及以下消息。
    UEFI Secure Boot failed:
    Failed to verify signatures of the following vibs (XX)

要使用安全引导解决问题,请执行以下步骤。

  1. 停用安全引导并重新引导主机。
  2. 运行安全引导验证脚本(请参见在升级后的 ESXi 主机上运行安全引导验证脚本)。
  3. 查看 /var/log/esxupdate.log 文件中的信息。

在升级后的 ESXi 主机上运行安全引导验证脚本

从不支持 UEFI 安全引导的 ESXi 旧版本升级 ESXi 主机之后,您或许能激活安全引导。能否激活安全引导取决于您执行升级的方式,以及升级是替换所有现有 VIB 还是保持某些 VIB 不变。您可以在执行升级后运行验证脚本以确定升级后的安装是否支持安全引导。

要使安全引导成功,每个已安装 VIB 的签名必须在系统上可用。在安装 VIB 时,ESXi 的旧版本不会保存签名。
  • 如果使用 ESXCLI 命令升级,ESXi 的旧版本将安装新 VIB,因此不会保存其签名,并且无法实现安全引导。
  • 如果使用 ISO 升级,新 VIB 则会保存其签名。这同样适用于使用 ISO 的 vSphere Lifecycle Manager 升级。
  • 如果有旧版 VIB 保留在系统上,这些 VIB 的签名不可用,无法进行安全引导。
    • 如果系统使用第三方驱动程序,而 VMware 升级不包括新版本的驱动程序 VIB,则在升级后旧版本的 VIB 仍会保留在系统上。
    • 在极少数情况下,VMware 可能会停止持续开发特定 VIB,且不提供新版本的 VIB 来替换或弃用它,因此在升级后旧版本的 VIB 会保留在系统上。
注: UEFI 安全引导还需要最新的引导加载程序。此脚本不会检查最新的引导加载程序。

前提条件

  • 验证硬件是否支持 UEFI 安全引导。
  • 验证是否所有 VIB 均已签名且接受级别至少为“合作伙伴支持”。如果 VIB 为“社区支持”级别,则无法使用安全引导。

过程

  1. 升级 ESXi 并运行以下命令。
    /usr/lib/vmware/secureboot/bin/secureBoot.py -c
  2. 检查输出结果。
    输出包含 Secure boot can be enabledSecure boot CANNOT be enabled