客户端机器会将训练好的模型以及用来建立安全连接的TLS证书进行加密,并将这些加密文件上传到阿里云SGX环境中。同时,客户端机器还将部署密钥提供服务,主要用来对阿里云vSGX实例进行认证,确保运行在云上的TensorFlow Serving推理服务应用的完整性及云上SGX环境的可行性。验证通过后,会将密钥发送给在阿里云vSGX实例中运行的TensorFlow Serving推理服务。本文介绍如何部署客户端,包括构建SGX加密计算环境、创建加密模型、创建gRPC TLS证书等。
操作步骤
创建客户端实例并构建所需的环境。
创建客户端实例并设置网络安全组权限。
运行客户端的实例需满足以下要求:
实例规格:客户端无需运行在SGX环境下,您可以选择满足基本需求(推荐最小规格为2 vCPU,4 GiB)的实例运行客户端。
镜像:Alibaba Cloud Linux 3.2104 LTS 64位
公网IP:选中分配公网Ipv4地址
安全组:安全组需开通4433端口
说明当客户端与vSGX端部署在同一台ECS实例时,安全组无需开通4433端口。
登录ECS实例。
具体操作,请参见通过密码或密钥认证登录Linux实例。
安装基础依赖包。
sudo yum install -y wget git python3-pip python3 -m pip install --user -U pip -i https://mirrors.aliyun.com/pypi/simple/ python3 -m pip install --user virtualenv -i https://mirrors.aliyun.com/pypi/simple/
安装社区版docker-ce。
具体操作,请参见安装Docker并使用(Linux)。
安装后,如您的用户为非root用户,则可以执行
sudo usermod -aG docker $USER
将当前用户添加到docker用户组,并重新登录当前账户,以允许非root账户使用docker。说明需安装社区版docker-ce,使用podman-docker可能会出现潜在的兼容性问题。
切换到使用的工作目录下,下载本实践所用的TensorFlow Serving脚本代码并安装所需的argparse、aiohttp、tensorflow等软件包。
重要安装软件包时间较长,请耐心等待。
git clone https://gitee.com/cloud_cc/confidential-computing.git export CC_DIR=$(realpath ./confidential-computing) # 创建virtualenv环境,避免污染原有python软件依赖 python3 -m virtualenv venv && source venv/bin/activate python3 -m pip install -r ${CC_DIR}/Tensorflow_Serving/client/requirements.txt --trusted-host mirrors.cloud.aliyuncs.com -i https://mirrors.cloud.aliyuncs.com/pypi/simple/
进入TensorFlow_Serving/client目录,下载模型。
source venv/bin/activate cd ${CC_DIR}/Tensorflow_Serving/client ./download_model.sh
下载训练好的模型文件将会存放在创建的models/resnet50-v15-fp32目录下。
模型格式转换。
为了兼容TensorFlow Serving,需要对训练好的模型文件进行格式转换。
python3 ./model_graph_to_saved_model.py --import_path `pwd -P`/models/resnet50-v15-fp32/resnet50-v15-fp32.pb --export_dir `pwd -P`/models/resnet50-v15-fp32 --model_version 1 --inputs input --outputs predict
转换好的模型文件将会存放在models/resnet50-v15-fp32/1/saved_model.pb。
说明格式转换过程中可能会看到
Could not load dynamic library 'libcudart.so.11.0'
相关的错误日志,该问题可以忽略。创建gRPC TLS证书。
本实践选择gRPC TLS建立客户端和TensorFlow Serving之间的通信连接,并设置TensorFlow Serving域名来创建单向TLS密钥和证书,用来建立安全通信通道。
该脚本将创建ssl_configure文件夹,里面包含server和client对应的证书。
service_domain_name=grpc.tf-serving.service.com client_domain_name=client.tf-serving.service.com ./generate_twoway_ssl_config.sh ${service_domain_name} ${client_domain_name}
创建加密模型。
从Intel SGX SDK v1.9开始,SGX SDK提供了安全文件I/O操作的功能。该功能由SGX SDK的一个名为保护文件系统库的组件提供,使开发人员能够安全地在Enclave内执行I/O操作。
SGX SDK可以保证:
用户数据保密:所有用户数据加密后写入磁盘,防止数据泄露。
用户数据完整性:所有用户数据均从磁盘读取,然后通过MAC(Message Authentication Code)进行解密,以检测数据是否被篡改。
文件名匹配:打开已有文件时,会检查待打开文件的元数据,确保文件创建时的文件名与打开操作时指定的文件名一致。
本实践采用的LibOS Gramine提供基于SGX SDK安全文件I/O操作的参考工具,可用于对文件进行加解密处理。Gramine提供的模板配置文件中,给出了“sgx.protected_files.file_mode=file_name”的配置选项,指定受加密保护的文件,内部实现了对加密文件进行解密的处理机制。
TensorFlow Serving在加载模型时,加载模型的路径为models/resnet50-v15-fp32/1/saved_model.pb,加密使用的密钥位于files/wrap-key。您也可以自定义128位密码,按照文件路径匹配原则,加密时文件路径要和使用时保持一致。利用gramine-sgx-pf-crypt工具加密模型文件的命令如下:
mkdir plaintext/ mv models/resnet50-v15-fp32/1/saved_model.pb plaintext/ LD_LIBRARY_PATH=./libs ./gramine-sgx-pf-crypt encrypt -w files/wrap-key -i plaintext/saved_model.pb -o models/resnet50-v15-fp32/1/saved_model.pb
启动密钥验证服务。
本实践使用Gramine提供的secret_prov_server_dcap作为远端SGX Enclave Quote认证服务,底层依赖调用SGX DCAP提供的Quote相关的认证库,该认证服务会向阿里云PCCS获取Quote认证相关的数据,比如TCB相关信息以及CRL信息等。SGX Enclave Quote验证成功后,会将当前目录下存放的密钥files/wrap-key发送到远端应用。这里远端应用为vSGX环境中的Gramine,Gramine拿到wrap-key中的密钥后,便会对加密的模型和TLS配置文件进行解密。
切换到secret_prov_server目录。
cd ${CC_DIR}/Tensorflow_Serving/docker/secret_prov
使用密钥验证服务镜像。
您可以通过以下任一方式使用密钥验证服务镜像。
下载密钥验证服务镜像。
docker pull registry.cn-beijing.aliyuncs.com/tee_sgx/secret_prov_server:v1
根据脚本编译镜像。
image_tag="v1" ./build_secret_prov_image.sh $image_tag
启动密钥验证服务。
image_tag="registry.cn-beijing.aliyuncs.com/tee_sgx/secret_prov_server:v1" # 如果您自行构建了镜像,请将$image_tag修改为对应的镜像tag名称 container_id=$(./run_secret_prov.sh -i $image_tag|tail -n1) # 您也可以通过docker ps查看当前正在运行的所有container实例
服务启动后便会在后台运行等待远程认证访问。当接收到远端认证后,认证通过会将密钥发送回远端。
查看secret_prov_server日志。
docker logs -f $container_id
当客户端返回如下图所示,说明已接收到认证。
后续步骤
客户端部署完成后,会等待vSGX端启动推理服务并向客户端发送远程认证请求。关于如何部署vSGX端,请参见步骤二:部署vSGX端来运行TensorFlow Serving推理服务。