人人都可以“机密计算”:Occlum 使用入门和技术揭秘 | 开源

2024-01-17 04:48

本文主要是介绍人人都可以“机密计算”:Occlum 使用入门和技术揭秘 | 开源,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

< SOFA:Channel/ >,有趣实用的分布式架构频道。回顾视频以及 PPT 查看地址见文末。欢迎加入直播互动钉钉群 : 30315793,不错过每场直播。

本文根据 SOFAChannel#18 直播分享整理,主题:零门槛的机密计算:Occlum LibOS 使用入门和技术揭秘。

大家好,我是今天的讲师田洪亮(花名:樱桃),蚂蚁集团高级技术专家,也是 Occlum 开源负责人。今天我和大家分享一下如何使用 Occlum 轻松开发机密计算应用以及 Occlum 技术架构和特色。

前言

云计算、大数据、人工智能,我们正处在一个数据爆炸的时代。如何能够在享受和利用海量数据所产生的价值的同时,保证数据的安全和用户的隐私呢?这无异是一个用户、企业和监管部门共同关注的问题。

近年来兴起的机密计算(Confidential Computing),正是为了解决这个问题而来。利用可信执行环境(Trusted Execution Environments,简称 TEE)技术,机密计算使得数据始终保持加密和强隔离状态,从而确保了用户数据的安全和隐私。机密计算可以解决诸多应用场景中“信任”难题,比如多个不互信组织之间的数据融合与联合分析、区块链上的智能合约的机密性保护、公有云平台对外部或内部攻击的防御、高敏感信息(比如密码学材料、医疗档案等)的安全保护等等。

但是,机密计算底层依赖的 TEE 技术——比如目前最成熟的云端 TEE 技术 Intel SGX——也带来了额外的功能限制和兼容问题。这使得机密计算的开发者面领一个巨大的阻碍:应用开发难。

在本文中,我们会首先分析当前 SGX 应用开发者会遇到的各种挑战和痛点,然后介绍蚂蚁集团自研的开源 TEE OS 系统 Occlum 如何大幅降低 SGX 应用开发的门槛,真正做到人人都可以玩转机密计算。

为什么 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,开发者会遭遇下面的开发困境:

  • 必须将目标应用做二分:开发者需要决定哪些组件应该置于 Enclave 内部,哪些置于 Enclave 外部,以及双方如何通信。对于复杂的应用,确定高效、合理且安全的划分方案本身就是一件颇具挑战的工作,更不要说实施划分所需的工程量。

  • 被限定在某个编程语言:无论使用上述哪种 SDK 开发,一个开发者都将被限定在该 SDK 所支持的语言,这通常意味着 C/C++(当使用 Intel SGX SDK、Open Enclave SDK 或 Google Asylo 时),而无法使用 Java、Python、Go 等更加友好的编程语言。

  • 只能获得很有限的功能:处于硬件限制和安全考虑,Enclave 中是无法直接访问 Enclave 外的(不可信)OS 的。由于 Enclave 中缺乏 OS 的支持,各种 SDK 只能提供普通不可信环境下的一个很小的功能子集,这使得很多现有的软件库或工具都无法在 Enclave 中运行。

上述困境使得为 SGX 开发应用成为一件十分痛苦的事,制约了 SGX 和机密计算的普及度和接受度。

学会 Occlum 的“三板斧”

Occlum 是一款蚂蚁集团开源的 TEE OS,可以大幅降低 SGX 应用的开发门槛。那到底多低呢?只需要学会 Occlum的三条命令:newbuildrun。本节我们以利用 Occlum 在 SGX 中运行一个 Hello World 程序为例进行说明。

这里有一个非常简单的 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 做应用移植。

用起来像 Docker 的 TEE OS


在了解了 Occlum 的基本用法和体验之后,很自然地会好奇 Occlum 的技术原理:Occlum 的用户接口为什么这样设计?而简单接口背后的技术架构又是怎样的?本节就试图回答这些问题。

Occlum 的一个设计理念是 Enclave-as-a-Container。在云原生时代,容器至关重要,容器无处不在。容器最常见的实现方式是基于 Linux 的 cgroup 和 namespace(比如 Docker),但也有基于虚拟化的实现(比如 Kata)。我们观察到,TEE 或者 Enclave 也可以作为一种容器的实现手段。因此,为了传达这种理念,同时给用户提供一种熟悉的体验,我们特意将 Occlum 的用户接口设计成与 Docker 和 OCI 标准接近。除了前面提到的 newbuildrun 三个命令,Occlum 还提供 startexecstopkill 等命令,其语意与 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 还有三个主要特色:

  • 高效多进程支持:Occlum 实现了一种轻量级的进程,相比此前最先进的开源 TEE OS(Graphene-SGX),进程启动提速 10-1000 倍,进程间通信的吞吐量提升 3 倍(详见我们的论文,链接见文末);

  • 强大文件系统:Occlum 支持多种文件系统,比如保护完整性的文件系统、保护机密性的文件系统、内存文件系统、主机文件系统等等,满足应用的各种文件 I/O 需求;

  • 内存安全保障:作为全球首个使用 Rust 语言开发的 TEE OS,Occlum 极大降低了内存安全问题的几率(据统计,Linux 有 50% 的安全漏洞都与内存安全有关),因此更值得信赖;

下面的传送门提供了更多资料:

  • Occlum 官方网站:https://occlum.io

  • Occlum 项目地址:https://github.com/occlum/occlum

  • Occlum 学术论文:https://arxiv.org/abs/2001.07450

  • SOFAChannel 直播回顾视频:https://www.bilibili.com/video/BV1S5411a7gr

这篇关于人人都可以“机密计算”:Occlum 使用入门和技术揭秘 | 开源的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/614902

相关文章

使用Python实现图像LBP特征提取的操作方法

《使用Python实现图像LBP特征提取的操作方法》LBP特征叫做局部二值模式,常用于纹理特征提取,并在纹理分类中具有较强的区分能力,本文给大家介绍了如何使用Python实现图像LBP特征提取的操作方... 目录一、LBP特征介绍二、LBP特征描述三、一些改进版本的LBP1.圆形LBP算子2.旋转不变的LB

Maven的使用和配置国内源的保姆级教程

《Maven的使用和配置国内源的保姆级教程》Maven是⼀个项目管理工具,基于POM(ProjectObjectModel,项目对象模型)的概念,Maven可以通过一小段描述信息来管理项目的构建,报告... 目录1. 什么是Maven?2.创建⼀个Maven项目3.Maven 核心功能4.使用Maven H

Python中__init__方法使用的深度解析

《Python中__init__方法使用的深度解析》在Python的面向对象编程(OOP)体系中,__init__方法如同建造房屋时的奠基仪式——它定义了对象诞生时的初始状态,下面我们就来深入了解下_... 目录一、__init__的基因图谱二、初始化过程的魔法时刻继承链中的初始化顺序self参数的奥秘默认

SpringBoot使用GZIP压缩反回数据问题

《SpringBoot使用GZIP压缩反回数据问题》:本文主要介绍SpringBoot使用GZIP压缩反回数据问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot使用GZIP压缩反回数据1、初识gzip2、gzip是什么,可以干什么?3、Spr

Spring Boot 集成 Quartz并使用Cron 表达式实现定时任务

《SpringBoot集成Quartz并使用Cron表达式实现定时任务》本篇文章介绍了如何在SpringBoot中集成Quartz进行定时任务调度,并通过Cron表达式控制任务... 目录前言1. 添加 Quartz 依赖2. 创建 Quartz 任务3. 配置 Quartz 任务调度4. 启动 Sprin

Linux下如何使用C++获取硬件信息

《Linux下如何使用C++获取硬件信息》这篇文章主要为大家详细介绍了如何使用C++实现获取CPU,主板,磁盘,BIOS信息等硬件信息,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录方法获取CPU信息:读取"/proc/cpuinfo"文件获取磁盘信息:读取"/proc/diskstats"文

Java使用SLF4J记录不同级别日志的示例详解

《Java使用SLF4J记录不同级别日志的示例详解》SLF4J是一个简单的日志门面,它允许在运行时选择不同的日志实现,这篇文章主要为大家详细介绍了如何使用SLF4J记录不同级别日志,感兴趣的可以了解下... 目录一、SLF4J简介二、添加依赖三、配置Logback四、记录不同级别的日志五、总结一、SLF4J

使用Python实现一个优雅的异步定时器

《使用Python实现一个优雅的异步定时器》在Python中实现定时器功能是一个常见需求,尤其是在需要周期性执行任务的场景下,本文给大家介绍了基于asyncio和threading模块,可扩展的异步定... 目录需求背景代码1. 单例事件循环的实现2. 事件循环的运行与关闭3. 定时器核心逻辑4. 启动与停

如何使用Nginx配置将80端口重定向到443端口

《如何使用Nginx配置将80端口重定向到443端口》这篇文章主要为大家详细介绍了如何将Nginx配置为将HTTP(80端口)请求重定向到HTTPS(443端口),文中的示例代码讲解详细,有需要的小伙... 目录1. 创建或编辑Nginx配置文件2. 配置HTTP重定向到HTTPS3. 配置HTTPS服务器

Java使用ANTLR4对Lua脚本语法校验详解

《Java使用ANTLR4对Lua脚本语法校验详解》ANTLR是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件,下面就跟随小编一起看看Java如何使用ANTLR4对Lua脚本... 目录什么是ANTLR?第一个例子ANTLR4 的工作流程Lua脚本语法校验准备一个Lua Gramm