英文

Nitro Enclaves

概述

Nitro Enclaves (NE) 是 Amazon Elastic Compute Cloud (EC2) 的一项新功能,允许客户在 EC2 实例内划分隔离的计算环境 [1]。

例如,处理敏感数据并在 VM 中运行的应用程序可以与在同一 VM 中运行的其他应用程序分离。然后,此应用程序在与主 VM 分开的 VM(即 enclave)中运行。它与产生它的 VM 并行运行。此设置满足低延迟应用程序的需求。

当前上游 Linux 内核中可用的 NE 内核驱动程序支持的架构是 x86 和 ARM64。

为 enclave 分配的资源(如内存和 CPU)是从主 VM 中划分出来的。每个 enclave 都映射到在主 VM 中运行的进程,该进程通过 ioctl 接口与 NE 内核驱动程序通信。

从这个意义上讲,有两个组件

1. enclave 抽象进程 - 在主 VM 客户机中运行的用户空间进程,该进程使用 NE 驱动程序提供的 ioctl 接口来生成 enclave VM(即下面的 2)。

有一个暴露给主 VM 的 NE 模拟 PCI 设备。此新 PCI 设备的驱动程序包含在 NE 驱动程序中。

ioctl 逻辑映射到 PCI 设备命令,例如,NE_START_ENCLAVE ioctl 映射到 enclave 启动 PCI 命令。然后,PCI 设备命令被转换为在虚拟机管理程序端执行的操作;即在主 VM 运行的主机上运行的 Nitro 虚拟机管理程序。Nitro 虚拟机管理程序基于核心 KVM 技术。

2. enclave 本身 - 与产生它的主 VM 在同一主机上运行的 VM。内存和 CPU 从主 VM 中划分出来,并专用于 enclave VM。enclave 没有连接持久存储。

从主 VM 中划分出来并提供给 enclave 的内存区域需要对齐 2 MiB / 1 GiB 物理连续内存区域(或此大小的倍数,例如 8 MiB)。可以使用例如用户空间的 hugetlbfs [2][3][7] 分配内存。enclave 的内存大小必须至少为 64 MiB。enclave 内存和 CPU 需要来自同一 NUMA 节点。

enclave 在专用内核上运行。CPU 0 及其 CPU 兄弟内核需要保持可用于主 VM。具有管理员权限的用户必须为 NE 目的设置 CPU 池。有关 CPU 池格式,请参阅内核文档 [4] 中的 CPU 列表部分。

enclave 使用 virtio-vsock [5] 通过本地通信通道与主 VM 通信。主 VM 具有 virtio-pci vsock 模拟设备,而 enclave VM 具有 virtio-mmio vsock 模拟设备。vsock 设备使用 eventfd 进行信号传递。enclave VM 会看到通常的接口 - 本地 APIC 和 IOAPIC - 从 virtio-vsock 设备获取中断。virtio-mmio 设备放置在低于典型 4 GiB 的内存中。

在 enclave 中运行的应用程序需要与将在 enclave VM 中运行的操作系统(例如,内核、ramdisk、init)一起打包在 enclave 映像中。enclave VM 有自己的内核,并遵循标准的 Linux 启动协议 [6][8]。

内核 bzImage、内核命令行、ramdisk 是 Enclave Image Format (EIF) 的一部分;加上包含诸如幻数、eif 版本、映像大小和 CRC 等元数据的 EIF 标头。

为整个 enclave 映像 (EIF)、内核和 ramdisk 计算哈希值。例如,这用于检查加载到 enclave VM 中的 enclave 映像是否是预期运行的映像。

这些加密测量包含在由 Nitro 虚拟机管理程序生成的签名证明文档中,并进一步用于证明 enclave 的身份;KMS 是一个与 NE 集成并检查证明文档的服务示例。

enclave 映像 (EIF) 加载到偏移量为 8 MiB 的 enclave 内存中。enclave 中的 init 进程连接到主 VM 的 vsock CID 和预定义的端口 - 9000 - 以发送心跳值 - 0xb7。此机制用于在主 VM 中检查 enclave 是否已启动。主 VM 的 CID 为 3。

如果 enclave VM 崩溃或正常退出,NE 驱动程序会收到中断事件。此事件通过轮询通知机制进一步发送到在主 VM 中运行的用户空间 enclave 进程。然后,用户空间 enclave 进程可以退出。

[1] https://aws.amazon.com/ec2/nitro/nitro-enclaves/ [2] https://linuxkernel.org.cn/doc/html/latest/admin-guide/mm/hugetlbpage.html [3] https://lwn.net/Articles/807108/ [4] https://linuxkernel.org.cn/doc/html/latest/admin-guide/kernel-parameters.html [5] https://man7.org/linux/man-pages/man7/vsock.7.html [6] https://linuxkernel.org.cn/doc/html/latest/x86/boot.html [7] https://linuxkernel.org.cn/doc/html/latest/arm64/hugetlbpage.html [8] https://linuxkernel.org.cn/doc/html/latest/arm64/booting.html