💻

Azure Confidential Computing VMでAnonifyを動かそう

タグ
Anonify
Writer
エンジニア恩田
Date
2021/5/25
こんにちは!LayerX LabsでAnonifyを開発している恩田(さいぺ)です。
前回は秘匿化モジュールAnonifyの開発について書かせていただきました。
秘匿化モジュールAnonifyにおけるRust featuresを活用した開発 - LayerX エンジニアブログ
こんにちは!LayerX Labsで Anonifyを開発している恩田( さいぺ )です。 Anonifyは「秘匿性」と「透明性」という相反する2つの性質を両立する秘匿化モジュールです。社内ではこの2つの性質を「Confidentiality」と「Execution Integrity」として整理しています。 要素技術としてはTrusted Execution Environment(TEE)を使っており、Anonifyのバックエンドは Intel SGX®︎を採用しています。 Intel SGXがもたらすセキュリティ・プロパティの観点では、ハードウェアレベルでの分離およびメモリ暗号化で「Confidentiality」を、Remote Attestationで「Execution Integrity」を実現します。 SGX内で実行されるプログラムはユーザモードでしか動作が許されていません。カーネルモードの権限を持ち合わせていないため、システムコールなどの特権命令を発行することができません。当然、 libcも使えず、スレッド、ファイルI/O、ネットワークI/Oを行う際にも大きな制約が課された状態で開発することになります。Anonifyの開発にはRustを採用していますが、標準ライブラリである stdを使うことができません。 このような制約のため、Anonifyの開発は no_std環境での開発となります。組み込みの開発と似ていますね。幸い、 SDK for Intel® Software Guard Extensions をRust向けにwrapした Rust SGX SDK が存在し、 stdに相当する sgx_tstd があるのでこちらを利用して開発を進めています。より詳細を知りたい方は RustによるIntel SGXプログラミングとSDKの内部実装 - Qiita を参照してください。 sgx_tstdを用いることで、RustによるSGXプログラミングが可能になるわけですが、今度は別の問題が発生します。Anonifyで扱うコードはすべてがSGX内で実行されるわけではないことです。 例えば、Anonifyに対してリクエストを送る場合、クライアントサイドで 認証付き公開鍵暗号 でリクエストを暗号化します。暗号化に用いた公開鍵に対応する秘密鍵はSGX内部で生成されたもので、SGXの外に出ることは一切ありません。これによってConfidentialityが達成されるわけですが、暗号化はSGXの外部(クライアントサイドなので std環境)で行い、復号はSGXの内部( sgx_tstd 環境)で行うという状況が発生します。 Anonifyでは認証付き公開鍵暗号をSodiumで実装しているため、 frame-sodiumというcrateが存在します。 frame-sodium crateは、SGXの内部・外部のどちらでも利用したいのですが、カジュアルに実装すると以下のような duplicate lang item のエラーに遭遇することになります。 error: duplicate lang item in crate `std` ( which `hoge` depends on ): `f32_runtime`.
記事中でも言及しましたが、AnonifyのバックエンドはIntel SGX®︎を採用しています。Anonifyはソースコードを公開しているので、誰でも動かすことができるのですが、Intel SGXが動作する環境でないと実行できない等、少々ハードルが高くなっています。そこで今回はIntel SGXを動作可能なAzure Confidential Computing VMを利用して、Linux(Ubuntu)でAnonifyを動かすまでの初期セットアップ手順を紹介します。
ゴールは「AnonifyのCIで実行しているスクリプトを動作させること」です。スクリプトの内容は、Anonify上で実装したERC201相当の送金ロジックを含む結合テストです2。実際の内容はこちらから見ることができます。

Azure Confidential Computing VMのセットアップ

Intel SGXに対応した仮想マシンを提供しているAzure Confidential Computingを利用します。仮想マシンのシリーズとしては「DCsv2」がAzure Confidential Computing VMに該当します。残念ながらDCsv2シリーズは日本のリージョン(Japan EastとJapan West)には対応していません。対応しているリージョンはこちらから確認できるので、お好きなものを選んでいただいて大丈夫です。本記事ではEast USを選びました。
まずはAzure Marketplaceから「Azure Confidential Computing (Virtual Machine)」を検索します。
notion image
「作成」を押下すると、以下の画面が出てくるので必要事項を埋めてください。認証用の公開鍵はご自身のものを使ってください。
notion image
「確認および作成」を押下するとデプロイ可否の検証が始まります。少し待ち、検証に成功したあともう一度「作成」を押下するとVMが作成されます。数分待つと登録したSSH公開鍵を用いて、SSHでアクセスができます。今回の例ではssh cipe@<VM Global IP>でアクセスできます。3

VM内のセットアップ

さて、SSHができたらVMのセットアップを行います。大きくAnonifyに関わるセットアップと、SGXに関わるセットアップがあります。

Anonify関連のセットアップ

必要な依存やバイナリをインストールします。
Plain Text
dockerを再起動します。
Plain Text
docker groupが存在するか確認します。存在しなければ作成してください。
Plain Text
dockerグループにazureインスタンスのユーザを追加します。
Plain Text
更新を反映するため、ここで再度SSHし直します。 再SSH後、以下のsocketがあることを確認してください。
Plain Text
次にdokcer-composeをインストールします。 dockerとversion合わせる必要があるので、上述のdockerのversionに合わせてインストールしてください。
Plain Text
最後にsolcをインストールします。Anonifyでは、ノード同士で状態遷移命令を共有するためのバックエンドとしてQuorumを利用しています。Solidityで記述されたスマートコントラクトをコンパイルするためインストールします。
Plain Text

Intel SGX関連のセットアップ

IntelとMicrosoftのaptレポジトリを設定します。
Plain Text
Intel SGXを動作させるために必要な依存をインストールします。Intelが提供しているライブラリはこちらです。適宜必要なものをインストールいただければと思いますが、ここでは以下の依存をインストールします。
Plain Text
インストールが終わったら、aesmd(Application Enclave Services Manager4のデーモン)を起動します。
Plain Text
/var/run/aesmd/にsocketができていれば無事起動ができています。なおSGXへのアクセスは/dev/sgx/enclaveを介して行われます。
Plain Text
Anonifyではdocker-compose.ymlにdevicesファイルとして指定し、コンテナ内からenclaveにアクセスできるようにしています。
Plain Text

Intelに開発者登録

前回のブログよりAnonifyが有する2つの性質「Confidentiality」「Execution Integrity」について触れました。
Intel SGXがもたらすセキュリティ・プロパティの観点では、ハードウェアレベルでの分離およびメモリ暗号化で「Confidentiality」を、Remote Attestationで「Execution Integrity」を実現します。
後者のRemote Attestationでは、Intelが運営するAttestation Service(IAS)を利用します5。Anonifyを動作させるために、SPIDSUB_KEY(APIキーのようなものです)が必要なので、IntelのAPI webポータルで開発者登録を行います。
Intel API webポータルにアクセスし、「Sign up」を押下します。
notion image
各種情報を入力します。
notion image
メール認証が必要なため、「Confirm email address」を押下します。
notion image
メール認証が完了したらSign Inします。
notion image
Sing Inした状態で、以下の「Intel® SGX Attestation Service Utilizing Enhanced Privacy ID (EPID)」の文中のリンクを押下します。
notion image
今回は開発用の「Development Attestation」欄にある「Subscribe(unlikable)」を選びます。
notion image
確認画面が表示されるので「Subscribe」を押下してください。
notion image
SPIDPrimary key(以下、SUB_KEY)が表示されると思います。次のステップで使うのでメモしておいてください。

Anonifyを動かす

長い道のりでしたが、いよいよAnonifyを動かします。VMに戻り、Anonifyをcloneしてください。
Plain Text
.env内にご自身のSPIDSUB_KEY を設定してください。
Plain Text
最後にテスト用のスクリプトを実行します。最後までエラーが起きなければ無事成功です。
Plain Text

最後に

Azure Confidential Computing VMとAnonifyのセットアップ、Intelの開発者登録の手順を紹介しました。Intel SGXは気になっているけど、なかなか動かすハードルが高いなぁと思っている方の一助になれば幸いです。Confidential Computing関連の技術は低レイヤで楽しいので、ぜひお試しいただけると嬉しいです!

  1. EIP-20で送金可能なトークンが備えるべきインタフェースが定義されています。Anonifyでは送金に限らないアプリケーションを実装可能ですが、ここではシンプルな例として挙げています。
  1. 単体テストや異常系、ツール群のビルドなども含まれており、テスト自体が膨大ですが、わかりやすい代表例として挙げました。
  1. アクセスできない場合は、Seruity GroupでSSHが許可されていない可能性があるので、適切な許可設定を行ってください。
  1. 資料によってはArchitectural Enclave Service Managerと書かれていることもある。
  1. Data Center Attestation Primitives (DCAP) と呼ばれるサードパーティが運営するAttestation Serviceも存在します