こんにちは!LayerX LabsでAnonifyを開発している恩田(さいぺ)です。
前回は秘匿化モジュールAnonifyの開発について書かせていただきました。
記事中でも言及しましたが、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)」を検索します。
「作成」を押下すると、以下の画面が出てくるので必要事項を埋めてください。認証用の公開鍵はご自身のものを使ってください。
「確認および作成」を押下するとデプロイ可否の検証が始まります。少し待ち、検証に成功したあともう一度「作成」を押下すると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を動作させるために、SPID
とSUB_KEY
(APIキーのようなものです)が必要なので、IntelのAPI webポータルで開発者登録を行います。
Intel API webポータルにアクセスし、「Sign up」を押下します。
各種情報を入力します。
メール認証が必要なため、「Confirm email address」を押下します。
メール認証が完了したらSign Inします。
Sing Inした状態で、以下の「Intel® SGX Attestation Service Utilizing Enhanced Privacy ID (EPID)」の文中のリンクを押下します。
今回は開発用の「Development Attestation」欄にある「Subscribe(unlikable)」を選びます。
確認画面が表示されるので「Subscribe」を押下してください。
SPID
とPrimary key
(以下、SUB_KEY
)が表示されると思います。次のステップで使うのでメモしておいてください。
Anonifyを動かす
長い道のりでしたが、いよいよAnonifyを動かします。
VMに戻り、Anonifyをcloneしてください。
$ git clone https://github.com/LayerXcom/anonify.git $ cd anonify && cp .env.sample .env
.env
内にご自身のSPID
とSUB_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関連の技術は低レイヤで楽しいので、ぜひお試しいただけると嬉しいです!
-
EIP-20で送金可能なトークンが備えるべきインタフェースが定義されています。Anonifyでは送金に限らないアプリケーションを実装可能ですが、ここではシンプルな例として挙げています。↩
-
単体テストや異常系、ツール群のビルドなども含まれており、テスト自体が膨大ですが、わかりやすい代表例として挙げました。↩
-
アクセスできない場合は、Seruity GroupでSSHが許可されていない可能性があるので、適切な許可設定を行ってください。↩
-
Data Center Attestation Primitives (DCAP) と呼ばれるサードパーティが運営するAttestation Serviceも存在します↩