简介: 汪少军:如何为Java业务提供机密计算保护?
写在前面
在信息世界里,数据存在三种状态: 存储态、传输态和计算态。存储在数据库或磁盘中的数据属于存储状态,在网络中传输的数据属于传输状态,正在被计算处理的数据属于计算状态。我们需要从数据三种状态出发进行系统的安全保护,才能确保真正的数据安全。对于存储态和传输态数据安全问题,我们可以利用被广泛使用的数据加密技术进行有效保护。对于计算态的数据安全保护仍旧属于新的前沿领域。
基于硬件的机密计算技术(TEE),通过提供一个可信执行环境,在该环境下运行的代码和数据会得到硬件级的保护,任何软件包括内核和Hypervisor都无权限窥探该环境中的数据信息,从而实现对计算态数据的保护。
全球主流的芯片厂商都纷纷推出了各自的机密计算解决方案,比如Intel SGX和Arm TrustZone等。TrustZone主要用在终端领域,而SGX技术则可以应用于服务器领域。SGX技术能够提供极高的机密计算保护等级,但由于SGX技术在内存资源和编程模型上的限制,无法有效支撑Java生态的机密计算业务,不得不说是一个遗憾。随着阿里云神龙架构第七代ECS实例的发布,所搭载的Intel新一代SGX2技术,为我们构建基于Java生态的机密计算服务提供了条件。
Java机密计算Demo演示
现在,让我们通过一个具体的例子来演示如何为Java业务提供机密计算保护。该实例基于第三代神龙架构第七代ECS实例构建,在SGX2提供的机密计算可信执行环境内运行Java SpringBoot网络服务。
准备工作
- 申请一台支持SGX2的神龙架构第七代ECS实例,EPC内存规格不要过小24G;
- 下载LibOS: Occlum容器镜像
occlum/occlum:0.20.0-ubuntu18.04; - 下载JDK: Alibaba Dragonwell11(Alpine),Alibaba发布的基于Alpine平台Dragonwell11镜像版本;
- 下载SpringBoot源码: Demo,该Demo展示了一个基于SpringBoot框架构建的简单网络服务;
其中SpringBoot Demo源码下载到本地后,进入initial目录后进行编译打包,在target目录下会生成spring-boot-0.0.1-SNAPSHOT.jar,我们先在普通环境下运行jar包验证其功能:
mvn clean package java -jar spring-boot-0.0.1-SNAPSHOT.jar
构建SGX执行环境
- 首先登录到ECS实例;
- 在ECS环境下,通过docker命令进入Occlum容器;
docker run -it --rm --privileged --network host \ -v `pwd`:`pwd` \ -v /dev/sgx_enclave:/dev/sgx/enclave \ -v /dev/sgx_provision:/dev/sgx/provision \ -v /var/run/aesmd:/var/run/aesmd \ occlum/occlum:0.20.0-ubuntu18.04
- 在Occlum容器中,创建一个enclave实体。该实例包含一个json配置文件和image镜像文件夹;
mkdir occlum_i