Goで学ぶTEE入門(EGo)

# はじめに

コンピュータの処理で利用中のデータを保護することが求められている。
これはサービスの内部犯や、サーバに不正ログインした攻撃者といった脅威から、資産を守るためである。
（一般的な暗号技術は、転送中や保存したデータを保護するが、実行中は保護しない。）

そこで利用中のデータを保護するフレームワークである[EGo](https://www.edgeless.systems/products/ego/)について紹介する。
EGoはTEE（Trusted Execution Environment）と呼ばれる技術を用いて、利用中のデータを保護する。
TEEは外部からの不正なアクセスが難しいハードウェアを用いて利用中のデータを保護する。

EGoはGo言語を使ってTEEで動作するプログラムを記述できる。

TEEは主に以下の性質を持つ[^seisitu]。

- **機能1. 隔離性** OSやアプリケーションから隔離される
- **機能2. 機密性** メモリに保存する内容を暗号化する
- **機能3. 証明可能性** TEEで動いているプログラムについて証明できる


**この記事ではEGoを用いて、TEE上でプログラムを実行する方法について説明する。**
具体的には、EGoを用いてTEE上でhelloworldを表示する。

### 利用環境

- [EGo](https://www.edgeless.systems/products/ego/)
- Azure
    - DC1s_v3
- Intel SGX
- Ubuntu 20.04

### 注意

EGoを用いてTEEで動かす上で、制限がいくつかある。
詳しくは、[こちら](https://docs.edgeless.systems/ego/#/knowledge/limitations)を見てほしい。

- 複数のプロセスを動かすことができない
- 共有オブジェクトへのリンクを利用できない
- 一部のシステムコールが使えない
    - exec
    - fork
    - pipe
    - posix_spawn
    - mmap
- etc...

# 環境構築

まず以下の操作によって、必要な環境を構築する。

### 1. Azureのインスタンス構築

本記事では説明しない。

[こちら](https://docs.microsoft.com/ja-jp/azure/confidential-computing/quick-create-marketplace)を読んでほしい。（仮想マシンは[ここ](https://azuremarketplace.microsoft.com/ja-jp/marketplace/apps/microsoft-azure-compute.acc-virtual-machine-v2)から作ることができる。）
サーバには `Ubuntu 20.04` を選択する。

以下の作業はすべて、このマシンにsshでアクセスして行う。

### 2. 必要なパッケージのインストール
以下のコマンドを使って、必要なパッケージをインストールする。


```sh
# リポジトリの設定
echo 'deb [arch=amd64] https://download.01.org/intel-sgx/sgx_repo/ubuntu focal main' | sudo tee /etc/apt/sources.list.d/intel-sgx.list
wget -qO - https://download.01.org/intel-sgx/sgx_repo/ubuntu/intel-sgx-deb.key | sudo apt-key add -

echo "deb http://apt.llvm.org/focal/ llvm-toolchain-focal-11 main" | sudo tee /etc/apt/sources.list.d/llvm-toolchain-focal-11.list
wget -qO - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add -

echo "deb [arch=amd64] https://packages.microsoft.com/ubuntu/20.04/prod focal main" | sudo tee /etc/apt/sources.list.d/msprod.list
wget -qO - https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -

sudo apt update

# 必要なパッケージ諸々のインストール
sudo apt-get install snap golang-go build-essential libssl-dev clang-11 libssl-dev gdb libsgx-enclave-common libsgx-quote-ex libprotobuf17 libsgx-dcap-ql libsgx-dcap-ql-dev az-dcap-client open-enclave


# egoのインストール
sudo snap install ego-dev --classic

# remote attestation周りのインストール
sudo ego install az-dcap-client

# azure以外のattestationを使うとき
# sudo ego install libsgx-dcap-default-qpl

```

### 3. リポジトリのクローン

以下のコマンドを使って、リポジトリをクローンする。

```sh
# リポジトリのクローン
cd ~
git clone https://github.com/edgelesssys/ego
cd ego
```

# EGoの大まかな流れ

EGoは大まかに以下の流れでビルド・実行する。

```sh
# 1. Goのプログラムを記載
## skip

# 2. プログラムのビルド
ego-go build

# 3. 実行ファイルに署名
# ego sign ./プログラム名 では動かないので注意
ego sign プログラム名

# 4. 実行ファイルを実行
ego run プログラム名
```

# プログラム例

説明のため、TEEのプログラム例を試しに実行する。

```sh
cd ~/ego/samples/helloworld

# 1. ビルド
ego-go build

# 2. 署名
# ego sign ./helloworld では動かないので注意
ego sign helloworld

# 3. 実行
ego run helloworld
```

##### コードの中身
```go
// https://tour.golang.org/concurrency/1

package main

import (
	"fmt"
	"time"
)

func say(s string) {
	for i := 0; i < 5; i++ {
		time.Sleep(100 * time.Millisecond)
		fmt.Println(s)
	}
}

func main() {
	go say("world")
	say("hello")
}
```

##### 実行結果
```
EGo v0.5.0 (55bad14bb8d00dbae2000a8d603f9b588bb79451)
[erthost] loading enclave ...
[erthost] entering enclave ...
[ego] starting application ...
world
hello
hello
world
world
hello
hello
world
world
hello
```

# まとめ

データを保護するフレームワークである[EGo](https://www.edgeless.systems/products/ego/)について紹介した。


[^seisitu]: もっと紹介すべき性質はあるが、この記事ではこの３つのみ紹介する。あと証明可能性が必須の要件かと言われるとそうでもないらしい。