英语

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)。

有一个 NE 模拟 PCI 设备暴露给主 VM。 此新 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 池格式的外观,请参见内核文档中的 CPU 列表部分 [4]。

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 中运行的 OS(例如内核、ramdisk、init)一起打包在 enclave 映像中。 enclave VM 具有自己的内核并遵循标准 Linux 启动协议 [6][8]。

内核 bzImage、内核命令行、ramdisk(s) 是 Enclave 映像格式 (EIF) 的一部分; 加上 EIF 标头,包括魔术数字、eif 版本、图像大小和 CRC 等元数据。

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

这些加密测量包含在 Nitro Hypervisor 生成的签名证明文档中,并进一步用于证明 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