LoginSignup
2
3

Goで学ぶTEE入門(EGo)

Last updated at Posted at 2022-06-24

はじめに

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

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

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

TEEは主に以下の性質を持つ1

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

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

利用環境

  • EGo
  • Azure
    • DC1s_v3
  • Intel SGX
  • Ubuntu 20.04

注意

EGoを用いてTEEで動かす上で、制限がいくつかある。
詳しくは、こちらを見てほしい。

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

環境構築

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

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

本記事では説明しない。

こちらを読んでほしい。(仮想マシンはここから作ることができる。)
サーバには Ubuntu 20.04 を選択する。

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

2. 必要なパッケージのインストール

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

# リポジトリの設定
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. リポジトリのクローン

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

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

EGoの大まかな流れ

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

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

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

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

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

プログラム例

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

cd ~/ego/samples/helloworld

# 1. ビルド
ego-go build

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

# 3. 実行
ego run helloworld
コードの中身
// 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について紹介した。

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

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3