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://kernel.linux.club.tw/doc/html/latest/admin-guide/mm/hugetlbpage.html [3] https://lwn.net/Articles/807108/ [4] https://kernel.linux.club.tw/doc/html/latest/admin-guide/kernel-parameters.html [5] https://man7.org/linux/man-pages/man7/vsock.7.html [6] https://kernel.linux.club.tw/doc/html/latest/x86/boot.html [7] https://kernel.linux.club.tw/doc/html/latest/arm64/hugetlbpage.html [8] https://kernel.linux.club.tw/doc/html/latest/arm64/booting.html