はじめに
コンピュータの処理で利用中のデータを保護することが求められている。
これはサービスの内部犯や、サーバに不正ログインした攻撃者といった脅威から、資産を守るためである。
(一般的な暗号技術は、転送中や保存したデータを保護するが、実行中は保護しない。)
そこで利用中のデータを保護するフレームワークである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について紹介した。
-
もっと紹介すべき性質はあるが、この記事ではこの3つのみ紹介する。あと証明可能性が必須の要件かと言われるとそうでもないらしい。 ↩