本文介绍如何部署客户端,包括构建SGX加密计算环境、创建加密模型、创建gRPC TLS证书等。
背景信息
客户端机器会将训练完的模型以及用来建立安全连接的TLS证书进行加密,并将这些加密文件上传到阿里云SGX环境中。同时,客户端机器还将部署密钥提供服务,主要用来对阿里云vSGX实例进行认证,确保运行在云上的TensorFlow Serving推理服务应用的完整性及云上SGX环境的可行性。验证通过后,会将密钥发送给在阿里云vSGX实例中运行的TensorFlow Serving推理服务。
操作步骤
- 创建客户端实例并构建所需的环境。
- 创建客户端实例并设置网络安全组权限。运行客户端的实例需满足以下要求:
- 实例规格:客户端无需运行在SGX环境下,您可以选择满足基本需求(推荐最小规格为2 vCPU,4 GiB)的实例运行客户端。
- 镜像:Alibaba Cloud Linux 2或Alibaba Cloud Linux 3
- 公网IP:分配公网或可供其他实例连接的VPC地址
- 安全组:安全组需开通4433端口
说明 当客户端与vSGX端部署在同一台ECS实例时,安全组无需开通4433端口。 - 登录ECS实例。具体操作,请参见连接方式概述。
- 安装基础依赖包。
yum install -y wget git python3-pip python3 -m pip install --user -U pip python3 -m pip install --user virtualenv
- 安装社区版docker-ce。
- 镜像为Alibaba Cloud Linux 2时,请参见部署并使用Docker(Alibaba Cloud Linux 2)。
- 镜像为Alibaba Cloud Linux 3时,请参见部署并使用Docker(Alibaba Cloud Linux 3)。
安装后,如您的用户为非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 # 您也可以通过使用阿里云pip源加快下载速度: # 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 Keys和证书,用来建立安全通信通道。
该脚本将会创建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操作,更多信息,请参见Understanding SGX Protected File System。
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
当客户端返回如下图所示,说明已接收到认证。
- 切换到secret_prov_server目录。