亚马逊AWS官方博客

Amazon EC2 现在支持 NitroTPM 和 UEFI 安全启动

在计算领域,可信平台模块(TPM)专为提供基于硬件的安全相关功能而设计。TPM 芯片是一种安全的加密处理器,旨在执行加密操作。使用 TPM 技术有三大优势。首先,您可以生成、存储并控制对操作系统以外的加密密钥的访问。其次,您可以使用烧录了 TPM 唯一 RSA 密钥的 TPM 模块执行平台设备身份验证。最后,采取并存储有助于确保平台完整性的安全措施。

在 re: Invent 2021 期间,我们宣布将在未来推出 NitroTPM,这是一种基于 AWS Nitro 系统的虚拟 TPM 2.0 合规 TPM 模块,适用于您的 Amazon Elastic Compute Cloud(Amazon EC2) 实例。我们还宣布推出适用于 EC2 的统一可扩展固件接口(UEFI) Secure Boot。

我很高兴地宣布,您现在可以在中国以外的所有 AWS 区域(包括 AWS GovCloud(美国)区域)开始使用 NitroTPM 和 Secure Boot。

您可以使用 NitroTPM 将密钥(如磁盘加密密钥或 SSH 密钥)存储在 EC2 实例内存以外的位置,保护其免遭在实例上运行的应用程序的威胁。NitroTPM 利用 Nitro 系统的隔离和安全属性来确保只有实例可以访问这些密钥。它提供与物理或离散 TPM 相同的功能。NitroTPM 遵循 ISO TPM 2.0 规范,允许您将利用 TPM 的现有本地部署工作负载迁移到 EC2。

NitroTPM 的推出解锁了多种使用场景,可强化您的 EC2 实例的安保状况,如保护操作系统级卷加密的密钥存储和访问,或关于测量启动或身份访问的平台证明。

保护密钥存储和访问
NitroTPM 可以创建和存储密钥,这些密钥被封装并与特定的平台测量绑定(被称作平台配置注册表 – PCR)。只有当这些平台测量值与创建密钥时相同时,NitroTPM 才会对该密钥进行解包。这个过程被称作“将密钥密封到 TPM”。 而密钥解密过程则被称作解封。NitroTPM 只会在实例和操作系统均处于已知良好状态时解封密钥。符合 TPM 2.0 规范的操作系统使用此机制安全解封卷加密卷的密钥。您可以使用 NitroTPM 在 Microsoft Windows 上存储 BitLocker 的加密密钥。Linux 统一密钥设置(LUKS)或 Linux 上的 dm-verity 也是可能采用 NitroTPM 的操作系统级应用程序的示例。

平台证明
“测量启动”是 NitroTPM 提供的另一项关键功能,在该进程中,引导加载程序和操作系统会使用它们在启动进程期间加载的软件或配置的测量值对 PCR 进行扩展。这可以提高安全性,例如,当恶意程序用恶意软件覆盖部分内核时。借助测量启动,您还可以从 TPM 获取签名的 PCR 值,并使用它们向远程服务器证明启动状态有效,从而启用远程证明支持。

如何使用 NitroTPM
开始使用 NitroTPM 有三项先决条件:

  • 您使用的操作系统必须有适用于 TPM 2.0 的命令响应缓冲区(CRB)驱动程序,例如,Windows 或 Linux 的最新版本。我们测试过以下操作系统:Red Hat Enterprise Linux 8、SUSE Linux Enterprise Server 15、Ubuntu 18.04、Ubuntu 20.04,以及 Windows Server 2016、2019 和 2022。
  • 您必须将其部署在基于 Nitro 的 EC2 实例上。目前,我们支持所有支持 UEFI 启动模式的英特尔和 AMD 实例类型。不支持 Graviton1、Graviton2、基于 Xen、Mac 和裸机实例。
  • 请注意,NitroTPM 目前不适用于其他一些实例类型,但会在发布后不久推出对这些实例类型的支持。这些实例类型包括:C6a、C6i、G4ad、G4dn、G5、Hpc6a、I4i、M6a、M6i、P3dn、R6i、T3、T3a、U-12tb1、U-3tb1、U-6tb1、U-9tb1、X2idn、X2iedn 和 X2iezn。
  • 当您创建自己的 AMI 时,必须将其标记为使用 UEFI(作为启动模式)和 NitroTPM。AWS 提供的 Windows AMI 默认带有此类标记。基于 Linux 的 AMI 默认不带标记;您必须创建自己的 AMI。

如何在启用 TPM 的情况下创建 AMI
AWS 为已启用 TPM 的多个 Windows 版本提供 AMI。我可以通过使用 DescribeImagesAPI 调用验证某 AMI 是否支持 NitroTPM。例如:

aws ec2 describe-images --image-ids ami-0123456789

如果已为 AMI 启用 NitroTPM,输出中将出现 “TpmSupport”: “v2.0”,如下例所示。

{
   "Images": [
      {
         ...
         "BootMode": "uefi",
         "TpmSupport": "v2.0"
      }
   ]
}

我也可以使用 DescribeImageAttribute API 调用来查询 tpmSupport

在创建自己的 AMI 时,我可以使用 RegisterImage API 调用,将 boot-mode 设置为 uefi,并且将 tpm-support 设置为 v2.0,以启用 TPM 支持。

aws ec2 register-image             \
       --region us-east-1           \
       --name my-image              \
       --boot-mode uefi             \
       --architecture x86_64        \
       --root-device-name /dev/xvda \
       --block-device-mappings DeviceName=/dev/xvda,Ebs={SnapshotId=snap-0123456789example} DeviceName=/dev/xvdf,Ebs={VolumeSize=10} \
       --tpm-support v2.0

现在,您已经知道如何在启用 TPM 的情况下创建 AMI,我们来创建一个 Windows 实例,并配置 BitLocker,对根卷进行加密。

演练:使用 NitroTPM 和 BitLocker
BitLocker 会自动检测并使用可用的 NitroTPM。除今天的安装和配置 BitLocker 的操作以外,您无需执行其他配置步骤。安装完成后,BitLocker 会自动识别 TPM 模块并开始使用。

让我们来了解一下安装步骤。我像往常一样启动实例,使用已启用 uefiTPM v2.0 的 AMI。我确定使用的是受支持的 Windows 版本。我正在使用的是 Windows Server 2022 04.13

连接到实例后,我会验证 Windows 是否可以识别 TPM 模块。为此,我会启动 tpm.msc 应用程序,可信平台模块(TPM)管理窗口将会打开。如果一切顺利,它将在 TPM Manufacturer Information(TPM 制造商信息)下方显示 Manufacturer Name: AMZN

可信平台模块管理接下来,我要安装 BitLocker。

我会打开 servermanager.exe 应用程序,并在屏幕的左上方选择 Manage(管理)。在下拉菜单中,我会选择 Add Roles and Features(添加角色和功能)。

添加角色和功能我会在向导中选择 Role-based or feature-based installation(基于角色或基于功能的安装)。

安装 BitLocker - 第 1 步多次选择 Next(下一步),直到看到 Features(功能)部分。我要选择 BitLocker Drive Encryption(BitLocker 驱动加密),然后选择 Install(安装)。

安装 BitLocker - 第 2 步等待安装,然后在安装完成时重启服务器。

在重新启动以后,我要再次连接到服务器并打开控制面板。在 System and Security(系统与安全)部分的下方选择 BitLocker Drive Encryption(BitLocker 驱动加密)。

打开 Bitlocker - 第 1 部分选择 Turn on BitLocker(打开 BitLocker),然后选择 Next(下一步),等待系统验证以及对卷的数据进行加密。

为提高安全性,我决定在加密结束时重新启动。此操作并不是必须的。但由于对设备的根卷(C:)进行了加密,我想知道设备是否还能启动。

重启以后,我要再次连接到实例,并且验证加密状态。

打开 Bitlocker - 第 2 部分我还要验证 BitLocker 的状态以及在卷上启用了密钥保护方法。因此,我打开 PowerShell 并键入

manage-bde -protectors -get C:

Bitlocker 状态我可以在生成的屏幕中看到 C: 卷加密密钥来自 NitroTPM 模块,而且该实例在完整性验证时使用了安全启动。我还可以查看恢复密钥。

我在上一张屏幕截图中以纯文本形式保留了恢复密钥,因为当您读到这些内容时,本演示所使用的实例和卷都已不复存在。切勿公开分享您的恢复密钥。

重要注意事项
在演示过如何使用 NitroTPM 保护 BitLocker 的卷加密密钥以后,接下来我要介绍其他几点注意事项:

  • 您只能通过在 AWS CLI 而不是在 Amazon EC2 控制台中使用 RegisterImage API,为 NitroTPM 支持启用 AMI。
  • 在 AMI 上设置标记,以启用 NitroTPM 支持。使用 AMI 启动实例后,您将无法修改该实例的属性。正在运行或已停止的实例不支持 ModifyInstanceAttribute API。
  • 使用 NitroTPM 导入或导出 EC2 实例(如使用 ImportImage API)将忽略 NitroTPM 数据。
  • EBS 快照中不包含 NitroTPM 状态。您只能将 EBS 快照还原到同一个 EC2 实例。
  • 使用基于 TPM 的密钥加密的 BitLocker 卷无法在其他实例上还原。您可以更改实例类型(停止、更改实例类型和重启实例)。

目前,我们支持所有支持 UEFI 启动模式的英特尔和 AMD 实例类型。不支持 Graviton1、Graviton2、基于 Xen、Mac 和裸机实例。其他一些实例类型在发布时不受支持(我之前分享过具体列表)。我们将在发布后不久添加对它们的支持。

使用 NitroTPM 不会产生额外费用。它现已在所有 AWS 区域推出,包括 AWS GovCloud(美国)区域,但中国除外。

现在就去构建吧 ;-)

– seb