LayerX エンジニアブログ

LayerX の エンジニアブログです。

Azure Confidential Computing VMでAnonifyを動かそう

こんにちは!LayerX LabsでAnonifyを開発している恩田(さいぺ)です。

前回は秘匿化モジュールAnonifyの開発について書かせていただきました。

tech.layerx.co.jp

記事中でも言及しましたが、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)」を検索します。

f:id:cipepser:20210523102411p:plain

「作成」を押下すると、以下の画面が出てくるので必要事項を埋めてください。認証用の公開鍵はご自身のものを使ってください。

f:id:cipepser:20210523102750p:plain

「確認および作成」を押下するとデプロイ可否の検証が始まります。少し待ち、検証に成功したあともう一度「作成」を押下するとVMが作成されます。数分待つと登録したSSH公開鍵を用いて、SSHでアクセスができます。今回の例ではssh cipe@<VM Global IP>でアクセスできます。3

VM内のセットアップ

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

Anonify関連のセットアップ

必要な依存やバイナリをインストールします。

$ sudo apt update
$ sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo apt-key fingerprint 0EBFCD88
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
$ sudo apt update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io

dockerを再起動します。

$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
$ systemctl show --property=Environment docker

docker groupが存在するか確認します。存在しなければ作成してください。

$ cat /etc/group | grep docker
docker:x:999:

dockerグループにazureインスタンスのユーザを追加します。

$ sudo gpasswd -a <user name: 今回だとcipe> docker

更新を反映するため、ここで再度SSHし直します。 再SSH後、以下のsocketがあることを確認してください。

$ ls -l /var/run/docker.sock
srw-rw---- 1 root docker 0 May 23 04:44 /var/run/docker.sock

次にdokcer-composeをインストールします。 dockerとversion合わせる必要があるので、上述のdockerのversionに合わせてインストールしてください。

$ sudo curl -L https://github.com/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
$ sudo mv /usr/local/bin/docker-compose /usr/bin
$ sudo chmod +x /usr/bin/docker-compose

最後にsolcをインストールします。Anonifyでは、ノード同士で状態遷移命令を共有するためのバックエンドとしてQuorumを利用しています。Solidityで記述されたスマートコントラクトをコンパイルするためインストールします。

$ sudo snap install solc

Intel SGX関連のセットアップ

IntelとMicrosoftのaptレポジトリを設定します。

$ echo 'deb [arch=amd64] https://download.01.org/intel-sgx/sgx_repo/ubuntu bionic 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/bionic/ llvm-toolchain-bionic-7 main" | sudo tee /etc/apt/sources.list.d/llvm-toolchain-bionic-7.list
wget -qO - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add -
$ echo "deb [arch=amd64] https://packages.microsoft.com/ubuntu/18.04/prod bionic 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

Intel SGXを動作させるために必要な依存をインストールします。Intelが提供しているライブラリはこちらです。適宜必要なものをインストールいただければと思いますが、ここでは以下の依存をインストールします。

$ sudo apt -y install clang-7 libssl-dev gdb libsgx-enclave-common libsgx-enclave-common-dev libprotobuf10 libsgx-ae-qe3 libsgx-ae-qve libsgx-epid libsgx-launch libsgx-pce-logic libsgx-qe3-logic libsgx-quote-ex libsgx-uae-service libsgx-urts

インストールが終わったら、aesmd(Application Enclave Services Manager4のデーモン)を起動します。

$ LD_LIBRARY_PATH=/opt/intel/sgx-aesm-service/aesm /opt/intel/sgx-aesm-service/aesm/aesm_service

/var/run/aesmd/にsocketができていれば無事起動ができています。なおSGXへのアクセスは/dev/sgx/enclaveを介して行われます。

$ ls /dev/sgx/
enclave  provision

Anonifyではdocker-compose.ymlにdevicesファイルとして指定し、コンテナ内からenclaveにアクセスできるようにしています。

volumes:
- /var/run/aesmd:/var/run/aesmd
..
..
devices:
- "/dev/sgx/enclave"

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」を押下します。

f:id:cipepser:20210523141526p:plain

各種情報を入力します。

f:id:cipepser:20210523141552p:plain

メール認証が必要なため、「Confirm email address」を押下します。

f:id:cipepser:20210523141621p:plain

メール認証が完了したらSign Inします。

f:id:cipepser:20210523141654p:plain

Sing Inした状態で、以下の「Intel® SGX Attestation Service Utilizing Enhanced Privacy ID (EPID)」の文中のリンクを押下します。

f:id:cipepser:20210523141854p:plain

今回は開発用の「Development Attestation」欄にある「Subscribe(unlikable)」を選びます。

f:id:cipepser:20210523141922p:plain

確認画面が表示されるので「Subscribe」を押下してください。

f:id:cipepser:20210523141941p:plain

SPIDPrimary key(以下、SUB_KEY)が表示されると思います。次のステップで使うのでメモしておいてください。

Anonifyを動かす

長い道のりでしたが、いよいよAnonifyを動かします。
VMに戻り、Anonifyをcloneしてください。

$ git clone https://github.com/LayerXcom/anonify.git
$ cd anonify && cp .env.sample .env

.env内にご自身のSPIDSUB_KEY を設定してください。

$ docker-compose up -d
$ docker-compose exec sgx_machine bash

最後にテスト用のスクリプトを実行します。最後までエラーが起きなければ無事成功です。

cd anonify/scripts && ./test.sh

最後に

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


  1. EIP-20で送金可能なトークンが備えるべきインタフェースが定義されています。Anonifyでは送金に限らないアプリケーションを実装可能ですが、ここではシンプルな例として挙げています。

  2. 単体テストや異常系、ツール群のビルドなども含まれており、テスト自体が膨大ですが、わかりやすい代表例として挙げました。

  3. アクセスできない場合は、Seruity GroupでSSHが許可されていない可能性があるので、適切な許可設定を行ってください。

  4. 資料によってはArchitectural Enclave Service Managerと書かれていることもある。

  5. Data Center Attestation Primitives (DCAP) と呼ばれるサードパーティが運営するAttestation Serviceも存在します