Fidelius部署教程
我们提供了从源安装的方式。您也可以从源代码编译安装,但是请注意,由于 Intel SGX 的限制,一个 Enclave 在构建时需要使用 RSA 3072 的私钥进行签名,自行编译安装时使用的私钥与通过源安装的版本所使用的私钥并不相同,因此,自行编译安装的 Fidelius 可能与从源安装版本不兼容。
目前 Fidelius 稳定版为 v0.3release版。
环境及依赖
目前,Fidelius运行在 Ubuntu18 或 Ubuntu20 上,因此首先请确认您的 Linux 发行版是正确的。Fidelius 基于 Intel SGX 运行,您需要确认您的硬件环境已经配备了支持的中央处理器(CPU),并对 BIOS 进行了正确的设置,您可以咨询您的硬件供应商。一个简单的确认方法是使用如下的程序进行确认:
$ git clone https://github.com/ayeks/SGX-hardware.git $ cd SGX-hardware $ gcc test-sgx.c -o test-sgx $ ./test-sgx
若其中包括如下两行,则 Intel SGX 的硬件配置是正确的。
... sgx available: 1 ... sgx 1 supported: 1
若 sgx available 字段为 0,则 CPU 本身不支持 Intel SGX;若 sgx 1 supported 字段为0,则说明 BIOS 不支持或未开启 Intel SGX 功能。
为了能够执行 Intel SGX 的程序,还需要正确安装 Intel SGX SDK,包括 DCAP 的支持,参考 linux-sgx 及 QuoteGeneration/pccs 。
安装 Fidelius
如果您是开发者,目前建议选择源码安装。
从源码安装
从源代码安装 Fidelius 仍然是最为直接的方式,操作如下:
首先,Fidelius 依赖于一些额外的库,包括 openssl,glog,boost,mysqlcppconn 等,安装操作如下:
$ sudo apt install build-essential ocaml ocamlbuild automake autoconf libtool wget python libssl-dev git cmake perl $ sudo apt install libssl-dev libcurl4-openssl-dev protobuf-compiler libprotobuf-dev debhelper cmake reprepro unzip $ sudo apt install mysql-server libgoogle-glog-dev libboost-all-dev libmysqlcppconn-dev
特别的,Ubuntu 自带的 secp256k1 库并不完整,建议自行编译安装完整版本,操作如下:
$ git clone https://github.com/bitcoin-core/secp256k1.git $ cd secp256k1 $ ./autogen.sh $ ./configure --enable-module-ecdh --enable-module-recovery $ make $ make check $ sudo make install
接下来,开始编译 Fidelius
master 分支
$ git clone https://github.com/YeeZTech/YeeZ-Privacy-Computing.git $ cd YeeZ-Privacy-Computing $ git submodule update --init $ cd YeeZ-Privacy-Computing && mkdir build $ cmake -DSGX_MODE=PreRelease -DSGX_HW=On ../ $ make -j8
编译完成之后,会在 YeeZ-Privacy-Computing 目录下生成两个目录,lib 和 bin,其中 lib 下是相关的库文件,bin 下是可执行文件,也就是相关工具。
注意,上述操作过程生成的是 PreRelease 版本,还有 Debug 版本、Simulation 版本和 Release 版本,四者的区别如下,在编译时的区别主要是上述 cmake 操作的区别:
- Debug 版本下,编译器不对代码进行优化,并且保留调试符号,enclave 的加载方式为 debug 方式,用于调试,此时会生成测试程序,编译操作如下:
$ cmake -DSGX_MODE=Debug -DSGX_HW=Off ../
- PreRelease 版本下,编译器会对代码进行优化,并且保留调试符号,enclave 加载方式为 debug 方式,用于性能测试;
$ cmake -DSGX_MODE=PreRelease -DSGX_HW=On ../
- Release 版本下,编译器会对代码进行优化,并且不保留调试符号,enclave 加载方式为非 debug 方式,编译 Release 版本时,需要准备额外的密钥进行签名,具体可以参考执行 make 之后的输出;
$ cmake -DSGX_MODE=Release -DSGX_HW=On ../
- Simulation 版本下,enclave 会加载到模拟的 Intel SGX 环境下,用于在没有 Intel SGX 硬件的设备上执行,主要用于开发。
$ cmake -DSGX_MODE=PreRelease -DSGX_HW=Off ../
develop 分支
$ git clone https://github.com/YeeZTech/YeeZ-Privacy-Computing.git $ cd YeeZ-Privacy-Computing $ git submodule update --init $ cmake -DSGX_MODE=PreRelease -S . -B ./build_prerelease $ cmake --build ./build_prerelease
注意,上述操作过程生成的是 PreRelease 版本,还有 Debug 版本、Simulation 版本和 Release 版本,四者的区别如下,在编译时的区别主要是上述 cmake 操作的区别:
- Debug 版本下,编译器不对代码进行优化,并且保留调试符号,enclave 的加载方式为 debug 方式,用于调试,此时会生成测试程序,编译操作如下:
$ cmake -DSGX_MODE=Debug -S . -B ./build_debug $ cmake --build ./build_debug
- PreRelease 版本下,编译器会对代码进行优化,并且保留调试符号,enclave 加载方式为 debug 方式,用于性能测试;
$ cmake -DSGX_MODE=PreRelease -S . -B ./build_prerelease $ cmake --build ./build_prerelease
- Release 版本下,编译器会对代码进行优化,并且不保留调试符号,enclave 加载方式为非 debug 方式,编译 Release 版本时,需要准备额外的密钥进行签名,具体可以参考执行 make 之后的输出;
$ cmake -DSGX_MODE=Release -S . -B ./build_release $ cmake --build ./build release
从 APT 安装
- 下载 apt 仓库的公钥:
$ wget -O yeez-pkey.pem https://repo.yeez.tech/public-key-yeez.txt
- 将下载的仓库公钥添加进系统:
$ sudo apt-key add yeez-pkey.pem
- 将熠智科技 apt 仓库添加进系统软件源:
$ echo -e "deb https://repo.yeez.tech/ release main" | sudo tee -a /etc/apt/sources.list
- 更新系统软件源并安装 Fidelius 组件:
$ sudo apt update $ sudo apt install secp256k1 fflib ypc-common ypc-core ykeymgr stbox-common-u ydump yterminus fid-datahub fid-analyzer
典钥及枢钥
为了与典枢平台进行交互,Fidelius 引入了典钥及枢钥两个重要的概念。同时提供了用于生成、使用、操作典钥及枢钥的工具。
典钥
典钥与设备相关,一旦生成,其私钥不能移出或者备份,与 Intel SGX 节点绑定。典钥的管理工具为 keymgr_tool。
通过以下命令可以查看帮助说明:
$ keymgr_tool --help
YeeZ Key Manager options: --help help message --create create a secp256k1 key pair --list list secp256k1 keys --remove arg remove a secp256k1 key pair --sign arg sign a message --verify arg verify a signature --encrypt arg encrypt a message --decrypt arg decrypt from cipher message YeeZ Create Key options: --user-id arg user id for created key YeeZ Encrypt options: --encrypt.hex message is hex enable --encrypt.public-key arg public key which is to encrypt a message YeeZ Decrypt options: --decrypt.hex message is hex enable --decrypt.private-key arg sealed private key which is to decrypt a cipher message YeeZ Sign options: --sign.hex message is hex enable --sign.private-key arg sealed private key which is to sign a message YeeZ Verify options: --verify.message arg message to be verified --verify.hex message is hex enable --verify.public-key arg public key which is to verify a signature
生成典钥
生成一个典钥,需要输入一个 id 做为标识符。
$ keymgr_tool --create
查看典钥
查看已经生成的典钥,其中包括典公钥。
$ keymgr_tool --list
删除典钥
$ keymgr_tool --remove KEY_ID
枢钥
枢钥的命令行工具为 ytermins:
$ yterminus --help
除了命令行版本,枢钥还提供了 python 版本及 Javascript 版本。对于 python 版本,编译完成后会生成一个 python 模块,位于 lib/pyterminus.cpython-38-x86_64-linux-gnu.so,可以在 python 代码中按照如下方式使用:
import pyterminus
如需要 Javascript 版本,请与团队沟通。
枢私钥转发
枢私钥转发用于将枢私钥转移到目标算法 enclave 内,并且避免算法 enclave 所在的不可信计算环境获取该枢私钥。
枢私钥转发流程如右图所示:
- 在本地生成枢钥,并妥善保管枢私钥;
- 从智能合约(区块链)中获取经过认证的典公钥,注意,使用未经认证的典公钥会造成隐私泄露,因此不推荐;
- 使用典公钥加密枢私钥,并对目标算法 enclave 进行签名;
- 将加密后的枢私钥及签名提交到区块链上;
- 隐私计算节点从区块链上获取加密的枢私钥及签名,并在 EKeyMgr 中解密枢私钥、验证签名;
- 目标 enclave 通过加密信道,从 EKeyMgr 获得枢私钥。
注意,EKeyMgr 在获取到目标 enclave 的请求后,会验证目标 enclave 是否与签名提供的目标 enclave 一致,如果不一致,则会拒绝提供相应的枢私钥。
枢私钥转发提供了一种将 “秘密” 转移到目标 enclave 并且不会暴露的手段。与传统的通过远程认证建立可信信道的手段不同,Fidelius 优化了此流程,对算法 enclave 进行加速。
其他工具
Fidelius 中还包括了其他几个命令行工具:
- fid_analyzer 用于执行分析任务;
- data_provider 用于加密数据;
- ydump 用于查看一个 enclave 的相关信息。