Intel SGX1 指南
目前主要负责一个使用Intel SGX技术的项目,我们知道Intel SGX是一个结构和设计都非常复杂的项目,SGX事实上是一系列技术的总称,由以下几个部分组成:
- CPU/平台硬件特性:CPU全新的指令集(E开头指令集)、PRM(Processor Reserved Memory)中EPC(Enclave Page Cache)(你可以理解为CPU上有个小内存)、内存区域的微架构等新特征
- SGX远程认证(SGX Remote Attestation):EPID、DCAP鉴证
- SDK和各种软件:Intel sgxsdk
我的项目主要使用的是EPID远程认证方式,所以程序目前支持的是SGX1认证,同时使用Gramine框架开发enclave内具体应用程序。
机器装配
硬件选择
1、CPU选择:
EPID作为一种最老的认证方式,支持它的CPU型号有如下几种系列:
- Intel Xeon E
- Intel Xeon E3
- Intel® Core™
当然,还有些不在这个系列里面的CPU也是支持EPID的(例如赛扬的一些产品),列举的这些只是日常用的比较多的。
2、主板选择
选用的BIOS厂商务必支持Intel SGX:
前面提到SGX具有全新的硬件平台特性,你的程序要想ECALL、OCALL一些enclave内的方法,那么必须使用一些特殊的指令集里面的指令,作为底层BIOS其必须配合Intel SGX CPU带有适配的CPU微码*(Intel CPU出现漏洞时恢复TCB又是需要你升级BIOS,事实上是需要升级主板上ROM内的Microcode)*。
只有当你的主板支持Intel SGX,你的主板上的CISC、RISC之类的处理器才能协同工作将你上层的汇编转换为特殊的CPU指令。目前基本上主流的主板厂商都支持开启(例如Supermicro),当然如果你足够厉害你可以自己画一个主板并自己build一个BIOS。
机器配置
对于机器的配置有如下几点要求:
1、打开SGX选项
开机的时候进入BIOS界面,打开如下选项
##enable it
Software Guard Extension (SGX)
2、设置PRM大小为128MB
##Platforms vary
Enclave Memory Size
3、以UEFI启动
如果你打开SGX选项的时候选用了software controlled,那么就以这个模式启动。
环境准备
请安装Ubuntu 20.04或者22.04
1、enable SGX
参见:https://github.com/intel/sgx-software-enable
2、升级内核
升级内核到5.11及其以上,我的是5.15
3、申请远程认证SPID
注意2024.09.29之后,Intel将完全移除DEV的SPID,2025.04.02讲彻底禁用EPID,R.I.P。
https://api.portal.trustedservices.intel.com/
至此所有的开发的环境准备完成,可以参阅Gramine官方文档开发程序。
使用测试&分析
测试情况
在SGX1运行的enclave内构建了一个grpc服务,该服务可接收一个文件数据,通过该数据计算摘要,对每个请求的计算CPU的算力都会占满。
- 一次发送1个请求,每个请求发送42MB的文件,计算504MB文件用时:1980.36s
- 一次发送12个请求,每个请求发送42MB的文件,按到达顺序一个个处理,计算504MB文件总用时:2106.36s
- 一次发送1个请求,每个请求发送8MB的文件,计算504MB文件总用时:1827s
- 一次发送63个请求,每个请求发送8MB文件,按到达顺序一个个处理,计算504MB文件总用时:
所以同样处理504MB文件,大而多的内存会让enclave内处理效率显著下滑。
原因分析
- 内存限制:在SGX1中,Enclave Page Cache (EPC) 的大小被限制为128MB,所有的enclave都驻留在EPC(enclave page cache)中, 这是系统内一块被保护的物理内存区域,用来存放enclave和SGX数据结构。EPC布局由平台具体实现决定,如果CPU支持SGX架构并在加密保护的DRAM (dynamic random access memory)中实现EPC,那么它也支持BIOS保留一段叫PRM(processor reserved memory)的内存范围。BIOS通过配置一组范围寄存器分配PRM,具体的PRM和EPC布局和平台有关,并取决于BIOS设置
但是事实上由于要留给其他硬件等数据结构,测试机器使用fortanix的sgx-detect检测后128MB的PRM大概还有93MB用于业务enclave,如果处理大文件或多个请求,可能会导致EPC空间不足,进而触发频繁的EPC换页操作,降低处理效率。换页操作涉及将数据从EPC移出到正常的内存区域,并在需要时将其调回,这些操作都需要额外的时间。
- CPU资源占用:每个请求的计算会占满CPU算力。如果请求是顺序处理的,这可能会导致CPU资源在某些时刻成为瓶颈,尤其是在处理多个请求的情况下。
小结
SGX1环境下不适合运行占内存较多的程序,运行大内存的时候将会有较大的内存换页成本,这是SGX1的一个问题,所以使用SGX1的时候尽量避免这种情况发生。
参考文献
2.SGX软件启动