Confidential Serverless Made Efficient with Plug-In Enclaves
问题:在SGX飞地中运行现有的无服务器应用程序,并观察到性能下降可能高达5.6×甚至422.6×
观察:我们的调查发现这些减速与架构功能有关,主要来自页面安全区初始化。
方案:使用新的基元-Plug-In Enclaves扩展 SGX,该飞地可以映射到现有飞地中,以便在函数之间重用经过验证的通用状态。通过重新映射插件安全区,安全区就地处理,避免在函数链中移动昂贵的数据。
结果:将安全区函数延迟降低了94.74-99.57%,自动伸缩吞吐量提高了19-179×。
无服务器计算:功能即服务(FaaS)。无服务器函数是事件驱动的,通过用户请求或其他函数的调用(以链方式)。54% 的无服务器应用程序仅包含一个函数,50% 的函数执行时间不到 1 秒;因此,无服务器应用程序对服务延迟极其敏感。
TEE被认为是实现实用的隐私保护无服务器应用程序的有前途的技术。
但是,现有的 TEE 设计无法很好地适应无服务器工作负载。
观察实验:将五个现实世界的隐私关键型无服务器工作负载(表 I)移植到内部飞区库操作系统中(类似于 Graphene-SGX ,但支持 SGX2 功能),并观察到性能从 5.6× 显著下降到 422.6×。
观察分析:部分开销源于安全区初始化,硬件安全区创建和证明测量生成都主导着安全区函数的启动,范围从 92.3% 到 99.6%。结果还表明了另一个性能下降因素,它源于函数之间的秘密数据传输,占据了端到端执行时间的 4.4% 到 29.8%;对于长链函数调用,情况会变得更糟。
得出结论:基于隔区无服务器的效率低下的根本原因是当前的 SGX 设计(SGX1 [16] 和 SGX2 [17])禁用了安全区实例之间的内存共享。这种无共享设计提供了强大的安全保证,但会产生明显的启动延迟,这不适合当今的无服务器计算。
提出方法:PIE提出了一种新的硬件内存原语:共享安全区,可以不可变地映射到不同的隔离飞地中,实现安全共享。利用此硬件原语,基于 enclave 的无服务器平台可以创建两种类型的逻辑安全区:插件安全区和主机安全区。插件安全区完全由共享的飞区区域组成,并且可以容纳非敏感公共环境。主机安全区与当前的 SGX 设计一样,彼此严格隔离,但可以将插件安全区映射到自己的安全区地址空间,以便重用插件安全区加载的内容及其容易生成的度量。主机安全区可以进一步重新映射插件安全区以适应不同的应用程序逻辑,而无需迁移其机密数据。
优势分析:PIE 对效率的关键改进是基于 PIE 的映射是按区域而不是按页面的,主机飞地可以通过轻量级函数调用(5~8 个周期)调用插件飞地的过程。PIE 设计与 SGX1 和 SGX2 语义完全兼容,并重用大多数现有硬件设计,以最大程度地降低其实现复杂性。
实现:PIE对SGX的架构扩展包括一个新的页面类型来指示共享安全区内存,以及两个新的指令EMAP和EUNMAP,用于将插件飞地映射到主机飞地/从主机飞地映射/取消映射。
实验:使用真正支持 SGX 的云计算机,并通过向 EMAP/EUNMAP 操作添加周期精确的延迟来模拟 PIE 指令。对常见的无服务器基础架构进行分区,例如插件飞地中的语言运行时、第三方库和用户函数,以及主机飞地中的机密数据。对于无服务器函数之间的输入/输出数据流,重新映射插件飞地以避免秘密数据移动。
实验结果:PIE可以降低94.74-99.57%的函数启动时延,在函数自动伸缩方面实现19-179×的吞吐量提升,在函数链的数据传输方面实现16.6-20.7×的加速。此外,与当前的 SGX 硬件相比,基于 PIE 的无服务器可以扩展到 4-22× 个安全区实例。
贡献:
SGX CPU 将安全区与各种威胁隔离开来,包括 (1) 来自外围设备的直接内存访问 (DMA),(2) 固件、虚拟机管理程序和操作系统等特权系统软件,(3) 与安全区位于同一地址空间中的应用程序,(4) 共享同一托管应用程序的飞地,其中一个的错误或错误不会危及另一个。
安全区访问控制模型。安全区内存被命名为安全区页面缓存 (EPC),EPC 是从 DRAM 的物理连续区域分配的,称为处理器保留内存 (PRM)。一个EPC只属于一个安全区实例。每个安全区实例都有一个唯一的安全区标识符 (EID) 存储在其 SGX 安全区控制结构 (SECS) 中。EPC 页面添加到安全区时,SGX CPU 将此 EPC 页面与名为 EPC 映射 (EPCM) 的元数据相关联。任何软件都无法访问 SECS 和 EPCM 等安全区元数据。
远程和本地证明。
SGX 为远程安全区用户提供了一种硬件机制来证明其身份。在启动过程中,CPU 通过测量每个 EPC 页来计算 SHA-256 哈希,并在受硬件保护的寄存器中最终确定此测量值。对此过程的任何篡改都将导致不同的测量结果。SGX 为同一 CPU 上的安全区提供了另一种有效的本地证明,以相互识别,从而建立相互信任。
无服务器计算为开发人员提供了编写细粒度、简单和独立函数来组合复杂业务逻辑的优势。函数可以组织成一个链来处理组合。无服务器应用程序是一种事件驱动、面向请求的交互式服务,需要低延迟和高吞吐量。之前的工作已经探索了优化传统云环境中无服务器启动的延迟【“SAND: Towards High-Performance Serverless Computing”, USENIX ATC 2018.】【 “SOCK: Rapid Task Provisioning with Serverless-Optimized Containers”, USENIX ATC 2018.】
传统的无服务器平台利用容器或虚拟将功能限制在沙箱中。 他们的威胁模型是保护云免受不受信任的函数执行的影响,并保护函数免受托管租户的影响。
SGX飞地采用反向沙箱,使用硬件来防止云检查或干扰敏感计算。英特尔 SGX 可以保护用户级工作负载免受不受信任环境的影响,适合保护机密的无服务器计算工作负载。
修改函数的入口点以调用在安全区内受保护的函数映像。安全区无服务器实例的工作流如图所示。在将秘密数据发送到安全区进行安全处理之前,用户必须对安全区的环境进行认证。软件初始化包括语言运行时、框架和第三方库的加载时间。功能的执行可能涉及模块/包的动态加载。端到端延迟只包含实心箭头。
观察:SGX 安全区保护无服务器功能会在性能方面的问题:
进行微基准测试,在函数之间改变数据传输大小。这些过程包括 (i) 函数 A 和函数 B 之间的相互证明,(ii) A 和 B 之间的 SSL 握手,(iii) 函数 B 分配一个足够大的堆来容纳机密数据,(iv) 在 A 和 B 之间传输机密数据(双重复制和数据 en/decrypting)。
当数据大小达到 94MB 时,由于昂贵的 EPC 逐出开销,安全区内堆分配的开销超过 SSL 传输。
对于函数之间的小消息传递,与安全区初始化时间(在 100 秒到 12 秒之间变化)相比,秘密传输的成本可以忽略不计(几乎在 29 毫秒内)。对于安全区之间的大型消息传递 (>32MB),数据移动可能是一个瓶颈。
见解 1:硬件 EADD 和软件哈希实现最快的安全区启动。
对于代码密集型工作负载,SGX2 EAUG并不比SGX1 EADD更好。更有效的方法是使用 SGX1 EADD(强制就地“r-x”权限)和硬件/软件组合测量。英特尔 SGX SDK 使用昂贵的 EEXTEND 来测量 EADD 分配的初始堆页面,这可以在使用前通过软件清零(例如 C 库 calloc())进行安全优化,从而为 EPC 页面节省 78.8K 个周期。
见解 2:常见的无服务器状态是非敏感的,可以在函数之间共享。
SGX假设属于飞地的所有EPC内容都是私有的。然而,在无服务器计算的上下文中,我们发现函数环境,包括语言运行时、第三方库,甚至函数本身,通常是开源的,因此不包含任何机密。遗憾的是,当前的 SGX 硬件不支持在安全区实例之间共享 EPC;安全区函数必须始终从头开始初始化其语言运行时。通过基于软件的优化,对于 12 MB 安全区,安全区初始化和基于模板的库加载仍会产生 25.800 秒的延迟。
见解 3:在安全区函数之间传输机密数据的成本很高。
安全区功能链涉及丰富的堆分配和昂贵的数据通信。而由于额外的 EPC 逐出,安全区内堆分配对 >94MB 的机密数据产生影响。EPC 逐出涉及分页内容的硬件重新加密,并导致处理器间中断 (IPI) 用于线程间同步。理想的解决方案是在链中的不同功能之间共享相同的秘密数据,以消除这种数据传输费用,即所谓的现场处理。这在当前的 SGX 硬件中也是不可能的。
受安全保护的无服务器功能可以从安全共享中受益。当前的 SGX 硬件不支持此功能。
PIE 扩展了 SGX 设计,以支持高效灵活的飞地模型。PIE 引入硬件原语:共享 EPC。
PIE 引入新指令:EMAP按区域分配的指令,允许host enclave 访问plug-in enclave 的整个虚拟地址空间。EUNMAP 回收已分配的虚拟地址空间区域。
通过重新映射不同应用程序的plug-in enclave 来消除昂贵的数据传输瓶颈,同时保留要就地处理的秘密数据,即所谓的原位处理。为了保留安全属性,PIE 会阻止对插件 enclave 的写入尝试,并使用硬件强制执行的写入时复制机制。当共享插件 enclave 的初始状态有助于提高性能时,需要 copy-on write。从本质上讲,PIE 通过正常的 DRAM 操作(即动态映射和写入时复制)启用飞地内存。PIE 证明此扩展对实际应用程序是实用的,并且可以使 enclave 应用程序的低延迟受益。
Se-Lambda:利用 WebAssembly 沙盒环境作为无服务器函数的双向函数。
S-FaaS: 将硬件事务( Intel TSX)和 SGX 结合在一起,用于可信的无服务器资源帐户
T-FaaS:将 JavaScript 引擎移植到 SGX 中,以构建安全的无服务器平台。
Clemmys: 对 SGX2 EAUG 操作进行批处理,以快速创建大型堆无服务器飞地。无法优化大代码 enclave 初始化和测量引入的延迟,PIE 通过安全地重用不可变插件 enclave 解决了这个问题。
为了降低函数启动成本,SAND 利用细粒度沙箱和高局部消息总线,而 SOC建议使用简化容器。Catalyzer通过写入时复制和内存快照共享实现亚毫秒级函数启动。FAASM利用共享内存来避免函数之间昂贵的数据移动。通过PIE扩展,Catalyzer和FAASM的优化技术可以直接安全地应用于安全区保护功能。