< SOFA:Channel/ >,有趣实用的分布式架构频道。
回顾视频以及 PPT 查看地址见文末。欢迎加入直播互动钉钉群 : 30315793,不错过每场直播。
本文根据 SOFAChannel#18 直播分享整理,主题:零门槛的机密计算:Occlum LibOS 使用入门和技术揭秘。html
你们好,我是今天的讲师田洪亮(花名:樱桃),蚂蚁集团技术专家,也是 Occlum 开源负责人。今天我和你们分享一下如何使用 Occlum 的轻松开发机密计算应用以及 Occlum 技术架构和特点。git
云计算、大数据、人工智能,咱们正处在一个数据爆炸的时代。如何可以在享受和利用海量数据所产生的价值的同时,保证数据的安全和用户的隐私呢?这无异是一个用户、企业和监管部门共同关注的问题。github
近年来兴起的机密计算(Confidential Computing),正是为了解决这个问题而来。利用可信执行环境(Trusted Execution Environments,简称 TEE)技术,机密计算使得数据始终保持加密和强隔离状态,从而确保了用户数据的安全和隐私。机密计算能够解决诸多应用场景中“信任”难题,好比多个不互信组织之间的数据融合与联合分析、区块链上的智能合约的机密性保护、公有云平台对外部或内部攻击的防护、高敏感信息(好比密码学材料、医疗档案等)的安全保护等等。编程
可是,机密计算底层依赖的 TEE 技术——好比目前最成熟的云端 TEE 技术 Intel SGX——也带来了额外的功能限制和兼容问题。这使得机密计算的开发者面领一个巨大的阻碍:应用开发难。json
在本文中,咱们会首先分析当前 SGX 应用开发者会遇到的各类挑战和痛点,而后介绍蚂蚁集团自研的开源 TEE OS 系统 Occlum 如何大幅下降 SGX 应用开发的门槛,真正作到人人均可以玩起色密计算。安全
SGX 应用程序是一种基于划分的模型:在用户态的(不可信)应用程序(上图红色部分)能够嵌入 SGX TEE 保护的区域(上图绿色部分),被称为 Enclave。支持 SGX 的 Intel CPU 保证 Enclave 中的受保护内容是在内存中加密的,而且与外界强隔离。外界的代码若是想进入 Enclave 中执行其中的可信代码必须经过指定的入口点,后者能够实施访问控制和安全检查以保证 Enclave 没法被外界滥用。架构
因为 SGX 应用程序是基于这种划分的架构,应用开发者一般须要使用某种 SGX SDK,好比 Intel SGX SDK、Open Enclave SDK、Google Asylo 或 Apache Rust SGX SDK。但不管使用上述哪一种 SDK,开发者会遭遇下面的开发困境:编程语言
上述困境使得为 SGX 开发应用成为一件十分痛苦的事,制约了 SGX 和机密计算的普及度和接受度。分布式
Occlum 是一款蚂蚁集团开源的 TEE OS,能够大幅下降 SGX 应用的开发门槛。那到底多低呢?只须要学会 Occlum的三条命令:new
、build
和run
。本节咱们以利用 Occlum 在 SGX 中运行一个 Hello World 程序为例进行说明。ide
这里有一个很是简单的 Hello World 程序。
$ cat hello_world.c #include <stdio.h> int main() { printf("Hello World!\n"); return 0; }
首先,咱们用 Occlum 提供的 GCC 工具链(occlum-gcc
)编译这个程序,并验证它在 Linux 上能正常工做。
$ occlum-gcc hello_world.c -o hello_world $ ./hello_world Hello World!
而后,咱们为这个程序建立一个 Occlum 的实例目录(使用 occlum new
命令)。
$ occlum new occlum_hello $ cd occlum_hello
该命令会建立一个名为 occlum_hello
的目录,并在该目录中准备一些必要的文件(如 Occlum.json
配置文件)子目录(如 image/
)。
接下来,咱们基于刚刚编译好的 hello_world
制做一个 Occlum 的 Enclave 文件和可信镜像(使用 occlum build
命令)。
$ cp ../hello_world image/bin $ occlum build
最后,咱们在 SGX 中运行 hello_world
(使用 occlum run
命令)。
$ occlum run /bin/hello_world Hello World!
更复杂的程序也能够用相似上面的流程经过 Occlum 移植进 SGX 中。用户无需理解 SGX 的二分编程模型,无需或只需少许修改应用代码,还能够自由选择编程语言(好比 Java、Python、Go 等)。使用 Occlum,应用开发者能够将宝贵的精力集中在编写应用上,而非为 SGX 作应用移植。
在了解了 Occlum 的基本用法和体验以后,很天然地会好奇 Occlum 的技术原理:Occlum 的用户接口为何这样设计?而简单接口背后的技术架构又是怎样的?本节就试图回答这些问题。
Occlum 的一个设计理念是 Enclave-as-a-Container。在云原生时代,容器相当重要,容器无处不在。容器最多见的实现方式是基于 Linux 的 cgroup 和 namespace(好比 Docker),但也有基于虚拟化的实现(好比 Kata)。咱们观察到,TEE 或者 Enclave 也能够做为一种容器的实现手段。所以,为了传达这种理念,同时给用户提供一种熟悉的体验,咱们特地将 Occlum 的用户接口设计成与 Docker 和 OCI 标准接近。除了前面提到的 new
、build
和run
三个命令,Occlum 还提供 start
、exec
、stop
、kill
等命令,其语意与 Docker 同名命令相似。
简单的用户接口隐藏着复杂的实现细节。为了高层次地描述 Occlum 的技术原理,咱们分可信的开发环境和不可信的部署环境两个视角来讨论。
在可信的开发环境(上图中的上半部分),用户使用 occlum build
命令打包和制做可信镜像,该可信镜像是利用 Merkel Hash Tree 来保证镜像在上传到不可信的部署环境以后,没法被攻击者篡改。可信镜像的内容是 Occlum 启动时所载入的 rootfs,组织结构与一般的 Unix 操做系统相似,具体内容由用户决定。
在不可信的部署环境(上图中的下半部分),用户使用 occlum run
命令启动一个新的 Occlum Enclave,该 Enclave 中的 Occlum TEE OS 会从可信镜像中载入并执行相应的应用程序。Occlum 向应用程序提供与 Linux 兼容的系统调用,所以应用程序无需修改(或只需少许修改)便可运行在 Enclave 中。应用程序的内存状态由 Enclave 保护,应用程序的文件 I/O 由 Occlum 作自动的加解密,所以能够同时保护应用在内存和外存中数据的机密性和完整性。
除了提供类容器的、用户友好的接口之外,Occlum 还有三个主要特点:
下面的传送门提供了更多资料: