人人均可以「機密計算」:Occlum 使用入門和技術揭祕 | 開源

< SOFA:Channel/ >,有趣實用的分佈式架構頻道。
回顧視頻以及 PPT 查看地址見文末。歡迎加入直播互動釘釘羣 : 30315793,不錯過每場直播。

SOFAChannel#18

本文根據 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 應用程序的「二分」架構

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

Occlum 是一款螞蟻集團開源的 TEE OS,能夠大幅下降 SGX 應用的開發門檻。那到底多低呢?只須要學會 Occlum的三條命令:newbuildrun。本節咱們以利用 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 作應用移植。

用起來像 Docker 的 TEE OS

Occlum 的系統架構

在瞭解了 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% 的安全漏洞都與內存安全有關),所以更值得信賴;

下面的傳送門提供了更多資料:

相關文章
相關標籤/搜索