@kenmaroです。
普段は主に秘密計算、準同型暗号などの記事について投稿しています。
秘密計算に関連するまとめの記事に関しては以下をご覧ください。
勝手に秘密計算アドベントカレンダーについて
この記事は
の「6日目」の記事
としようかと思っています。
興味のある方はアドベントカレンダー参加してみませんか?
ご連絡お待ちしております。
概要
新しいことを吸収したいという一心でムチを打ち、
TEE(Trusted Execution Environment)
で使ってみようと思います。
なにも知識がないので、
これを愚直に追ってみようと思っています。
TEEとはなんぞや、というところに関してはいろいろ記事がありますのでそちらをご覧ください。
例えば
これとかです。
忙しい人へ
- TEE(Trusted Execution Environment)のチュートリアルを実際に動かしてみたよ
- Azure でSGXに対応したインスタンスを作ったよ
- 無事Hello,Worldできたよ
- 1 + 2 = 3 も秘密領域で実行できたよ
- 情報が散らばっているけど、本記事に沿えば30分もあればチュートリアル完了できるよ
早速やっていきます。
Azureからインスタンスを作成
Virtual machine name
test-sgx
Region
West US
Security type
Standard
Image
Ubuntu Server 20.04 LTS - Gen2
Size
Standard DC1s v2 (1 vcpu, 4 GiB memory)
とりあえずこんな感じで
DC1s
を用意してみました。
コストは1時間10円くらいです。
ssh したら、
azureuser@test-sgx:~/openenclave/samples/helloworld$ cat /proc/cpuinfo | grep sgx
flags : sgx sgx_lc
これをみて、
「なんかSGX入ってそうやなぁ」
くらい思っときます。
いざチュートリアルへ
ここをフォローしていきます。
フォローしていくのですが、最終的に私は
この記事を大いに参考にさせていただきました。
このようにまとめている人がいることに感謝いたします。
レポジトリの準備
ssh したら、
git clone https://github.com/openenclave/openenclave.git
git submodule update --init --recursive
cd openenclave/samples/helloworld
を行います。
openenclave SDKのインストール
なにはともあれ、helloworld を実行するために、
ここをフォローする必要があります。
ひととおり実行すると、
/opt/openenclave
が出現しているはずです。
その下に存在しているフォルダ構成の簡単な説明は、
ここをフォローします。
上記リンクの最後の、
source /opt/openenclave/share/openenclave/openenclaverc
を実行することで、必要な環境変数を設定できるようです。
念の為どんなものが設定されているかみてみると、
# Copyright (c) Open Enclave SDK contributors.
# Licensed under the MIT License.
# Update PKG_CONFIG_PATH.
export PKG_CONFIG_PATH=${PKG_CONFIG_PATH}:/opt/openenclave/share/pkgconfig
# Set CMake Config-package path
export CMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}:/opt/openenclave/lib/openenclave/cmake
# Update PATH.
export PATH=${PATH}:/opt/openenclave/bin
らが設定されているようですね。なにも考えず次に進みます。
openenclaveのビルド
openenclave 直下にて、
mkdir build
cd build
cmake -DHAS_QUOTE_PROVIDER=OFF ..
を実行します。私の場合ここでdoxygenがないと怒られたので、
sudo apt install doxygen -y
を実行したところ cmake が通ったので、
make
を実行しました。5〜10分くらいビルドに時間がかかります。
ビルドが完了した段階で、
cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=~/openenclave-install ..
make install
を実行してインストールしました。
helloworld の実行
source ~/openenclave-install/share/openenclave/openenclaverc
で環境変数などを設定した後、
cd ~/openenclave/samples/helloworld
make
make run
を実行します。すると
host/helloworldhost ./enclave/helloworldenc.signed
Hello world from the enclave
Enclave called into host to print: Hello World!
となり、enclave(セキュア領域)からのHello,Worldが出力されます。
お疲れ様でした。
enclave 内で簡単な計算をやってみる
先ほどの helloworld/enclave/enc.c
で、
void enclave_helloworld()
{
int tmp1 = 1;
int tmp2 = 2;
int tmp3 = tmp1 + tmp2;
fprintf(stdout, "%d + %d = %d\n", tmp1, tmp2, tmp3);
// Call back into the host
oe_result_t result = host_helloworld();
if (result != OE_OK)
{
fprintf(
stderr,
"Call to host_helloworld failed: result=%u (%s)\n",
result,
oe_result_str(result));
}
}
を実行すると、問題なく
host/helloworldhost ./enclave/helloworldenc.signed
Hello world from the enclave
1 + 2 = 3
Enclave called into host to print: Hello World!
となりました。(当たり前か、、)
というだけです。
まとめ
TEE、なんとなく聞いたことある
という状態からチュートリアルコードを動かすところまでをやってみました。
Azureのアカウントさえあれば、10円あれば再現できます。
この記事に沿って実行すれば、1時間もあれば十分なはずです。
私は、次のステップとして
host から enclave にデータを渡して、
enclave 内で保持しているデータと何か計算をして、
host に返す
つまり enclave に計算に必要な情報が入っていて、
enclaveで計算した結果のみをhostが取得
みたいなシナリオでサンプルコードを走らせてみようと思っています。
そこまでできたらまた記事にしようかと思います。
TEEはまだ全然理解していないので勉強頑張ります。!
今回はこの辺で。