LoginSignup
1
0

More than 1 year has passed since last update.

【15分で解説】TEE(Trusted Execution Environment) のチュートリアルでどんなことをやっているかまず理解しよう。

Posted at

@kenmaroです。
普段は主に秘密計算、準同型暗号などの記事について投稿しています
秘密計算に関連するまとめの記事に関しては以下をご覧ください。

勝手に秘密計算アドベントカレンダーについて

この記事は

の「11日目」の記事
としようかと思っています。
興味のある方はアドベントカレンダー参加してみませんか?
ご連絡お待ちしております。

概要

15分もあれば本記事の内容は理解できるようになっていますので、気軽に読んでみてください。

前回やったこと

前回の記事で、

【30分でできる】TEE(Trusted Execution Environment) をAzureで作成し、HelloWorldしてみた。

をやってみました。

このチュートリアルでは、enclave application を作り、

  • host からenclave を作成
  • host から ECALL (host からenclave 内で関数を呼ぶ)
  • enclave から OCALL (enclave から host 内で関数を呼ぶ)

を行いました。
実際には、host からの ECALLで、
enclave 内から Hello, world

と表示しました。

実際8つのチュートリアル書いてあるね

しかしながら、このチュートリアルは

ここに用意されている計8つのチュートリアルのうち、1個目のチュートリアルであったため、

他のチュートリアルって何をやっているんだろう?

と思った方も多いと思います。

ですので、今回は、残りの7つのチュートリアルについて、
どのようなことをやっているのか、なるべく簡潔にまとめたいと思います。

本記事は各チュートリアルのシナリオ理解に努める

前回の記事をフォローすれば、チュートリアルHello, world の実際のビルド、実行
はできているはずです。

私が他の7つのチュートリアルについても試したところ、同じ環境下で全てのチュートリアルをビルドし
実行することはできたため、
どんなチュートリアルかをまずは理解することで、実際に動かしてみることができます。

本記事の後はぜひチュートリアル自体を読んでみるべき

ぜひ本記事を読んだ後は自分で実行を行い、ログなども並行で見ながらなにをやっているのか確かめてみると面白いです。
今回は、中身の具体的なコードを追うというよりは、各チュートリアルでやっていることを言葉でまとめようと思います。
内容は実際に各チュートリアルを読み解く以上のことにはなりませんので、実際に読んでみたい人は上のリンクからぜひチャレンジしてみてください。

15分もあれば本記事の内容は理解できるようになっていますので、気軽に読んでみてください。

忙しい人へのまとめ

  • エンクレーブアプリケーションでは、ホスト(非信頼領域)と、エンクレーブ(信頼領域)に実行したいプログラムを分けるよ
  • Open Enclave SDK のチュートリアルは、全部で8つあるよ
  • 1つ目のチュートリアルでは、hello, world をやったよ
  • 2つ目のチュートリアルでは、エンクレーブ 内で使用できる暗号ライブラリ「AES Mbed TLS」の使い方のチュートリアルだよ
  • 3つ目のチュートリアルでは、エンクレーブ内でのデータをシール(暗号化)して取り出してホスト内に保存し、ホスト内で保管するよ、その後、別エンクレーブ内でアンシール(復号)して秘密情報をロードするよ
  • 4つ目のチュートリアルでは、エンクレーブ1からエンクレーブ2に秘密情報を渡したい時に、エンクレーブ2が信頼できるか確かめる、アテステーションと呼ばれるプロトコルを実行するよ
  • 5つ目のチュートリアルでは、協力しながら動いている2つのエンクレーブが、実行中にお互いを信頼し合うために繋いでおく、Attested TLS チャンネルを実装するよ
  • 6つ目のチュートリアルでは、ホストからエンクレーブにプログラムを実行するときにかかるオーバーヘッド(実行時間の遅延)を小さくする、Switchless callを実装するよ
  • 7つ目のチュートリアルでは、ホストが別ホストで実行されているエンクレーブを信頼できるか確かめるための、Host-side Enclave Verification をやるよ
  • 8つ目のチュートリアルでは、Pluggable Allocatorsといって、エンクレーブ内でマルチスレッドする時のプログラムを解説するよ、正直私もよくわかっていないよ

上のことを理解するだけでだいぶお腹いっぱいなのですが、
もう少しだけ詳しく以下に書いていければと思います。

それではやっていきましょう。

だいぶ簡潔に詳細を書きます

チュートリアル1 Hello, world

なんてことはない、我々が最初に書くエンクレーブアプリケーションです。
ホストがエンクレーブを生成し、エンクレーブ内で関数を呼びます。(ECALL)
また、エンクレーブ内から、ホストサイドの関数を呼びます(OCALL)

チュートリアル2 File-Encryptor

シナリオとしては、エンクレーブ内で暗号化、復号化を行い、
ファイルをAESで暗号化します。
ファイルには普通のテキストが書かれており、それを16バイト毎にわけ、普通のブロック暗号として暗号化を行いますが、
このチュートリアルでは「エンクレーブ内で」暗号化と復号を行います。

暗号化されたファイルはファイルシステムに普通に書き出され、
復号時に読み出されます。復号された結果は、元のテキストファイルと比較され、同じであることを確認します。

実際このシナリオに特に意味はありません。
あくまでこのチュートリアルは、エンクレーブ内でAES暗号化を行うことのできるライブラリ
「AES Mbed TLS API」をどう使うか、ということを学ぶためのチュートリアルです。

チュートリアル3 Data-Sealing

データシーリングは、どのようなシナリオで使われるかというと、
エンクレーブ内で持っていた「秘密情報」を「安全に」取り出し、保存するような場合です。
この保存された秘密情報は、後に他のエンクレーブに取り込まれ、アンシールされます。
アンシールはロードと考えて大丈夫です。アンシールされたデータは、エンクレーブ内で処理することができます。つまり、エンクレーブ1でシールしたデータを、エンクレーブ2でアンシールして使えたりします。

このとき、どのエンクレーブがアンシールできるかというのはポリシーによって決まりますが、
2つのポリシーが選べます。
ポリシー1だと、シールをした同一エンクレーブでないとアンシールできないですが、
ポリシー2だと、エンクレーブを生成する際のサインが同じものであれば、別のエンクレーブでもアンシールできます。

チュートリアル4 Attestation

みんな大好きアテステーションです。
これはどのようなシナリオで使われるかというと、
エンクレーブ1とエンクレーブ2を用いて処理を実行したい時に、
エンクレーブ1は、エンクレーブ2が本当に信頼できる領域なのか、
また逆も、つまりエンクレーブ2から、エンクレーブ1は本当に信頼できる領域なのか、
を確かめるときです。

チュートリアル5 Attested TLS

チュートリアル4のシナリオと似ているのですが、
Attested TLSというコネクションを例えば2つのエンクレーブが確立しているとします。
この時、このコネクションがつながっていれば、2つのエンクレーブはお互いを常に信頼し合いながらデータのやり取りを行なったり、演算を実行したりすることができます。
そのコネクションを、Attested TLSと呼びます。

チュートリアル6 Switchless Calls

Switchless Callsがどのようなシナリオで使われるかというと、
エンクレーブアプリケーションにおいて、ホストとエンクレーブの処理を行ったり来たりする際に出てくる
オーバーヘッド(処理時の遅延)を小さくしたい時です。
実際のこのオーバーヘッドは大きい(処理が行ったり来たりするたびに認証のような操作が入るため)
ので、これらのオーバーヘッドを短縮することで、全体の実行時間をかなり短くすることができます。

チュートリアル7 Host-side Enclave Verification

Host-side Enclave Verificationはどのようなシナリオで使われるかというと、
先ほどの、エンクレーブ同士で信頼できるか確認し合うアテステーションとは違い、
ホストが、別領域にあるエンクレーブが信頼できるかを判断するときです。

チュートリアル8 Pluggable Allocators

多分結構アドバンスドな内容だと思いますが、エンクレーブ内でマルチスレッドで演算を実行したい時、
Pluggable Allocatorsを用いる必要があります。
応用的な内容だと思ったため、あまり詳しく読んでいないです。必要に応じて戻ってこようと思います。

まとめ

今回は短い内容でしたが、
Open Enclave SDK というTEEを用いたエンクレーブアプリケーションを実装する時のSDKの
チュートリアルに、

計8個の内容が書いてあり、それらをまずは「文字で理解する」
ということをやってみようと思い、解説を書いてみました。

コードに最初から踏み込もうとするとかなり難解であるため、
まずはそれぞれのチュートリアルが

  • なにをしようとしているのか
  • どんな時に使われるのか

などを把握し、必要に応じて中身のコードに踏み込めればいいのではないかと思い、今回まとめてみた次第です。

ふわっとですが、なんとなくどんな内容がチュートリアルに書いてあるかわかったというのであれば、とても嬉しいです。

私もこれからTEEの勉強を続けていこうと思っています。

今回はこの辺で。

@kenmaro

1
0
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
1
0