本文介绍如何部署客户端,包括构建SGX加密计算环境、创建加密模型、创建gRPC TLS证书等。

背景信息

客户端机器会将训练完的模型以及用来建立安全连接的TLS证书进行加密,并将这些加密文件上传到阿里云SGX环境中。同时,客户端机器还将部署密钥提供服务,主要用来对阿里云vSGX实例进行认证,确保运行在云上的TensorFlow Serving推理服务应用的完整性及云上SGX环境的可行性。验证通过后,会将密钥发送给在阿里云vSGX实例中运行的TensorFlow Serving推理服务。

操作步骤

  1. 创建客户端实例并构建所需的环境。
    1. 创建客户端实例并设置网络安全组权限。
      运行客户端的实例需满足以下要求:
      • 实例规格:客户端无需运行在SGX环境下,您可以选择满足基本需求(推荐最小规格为2 vCPU,4 GiB)的实例运行客户端。
      • 镜像:Alibaba Cloud Linux 2或Alibaba Cloud Linux 3
      • 公网IP:分配公网或可供其他实例连接的VPC地址
      • 安全组:安全组需开通4433端口
      说明 当客户端与vSGX端部署在同一台ECS实例时,安全组无需开通4433端口。
    2. 登录ECS实例。
      具体操作,请参见连接方式概述
    3. 安装基础依赖包。
      yum install -y wget git python3-pip
      python3 -m pip install --user -U pip
      python3 -m pip install --user virtualenv
    4. 安装社区版docker-ce。

      安装后,如您的用户为非root用户,则可以执行sudo usermod -aG docker $USER将当前用户添加到docker用户组,并重新登录当前账户,以允许非root账户使用docker

      说明 需安装社区版docker-ce,使用podman-docker可能会出现潜在的兼容性问题。
  2. 切换到使用的工作目录下,下载本实践所用的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/
  3. 进入TensorFlow_Serving/client目录,下载模型。
    source venv/bin/activate
    cd ${CC_DIR}/Tensorflow_Serving/client
    ./download_model.sh

    下载训练好的模型文件将会存放在创建的models/resnet50-v15-fp32目录下。

  4. 模型格式转换。

    为了兼容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相关的错误日志,该问题可以忽略。
  5. 创建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}
  6. 创建加密模型。

    从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
  7. 启动密钥验证服务。

    本实践使用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配置文件进行解密。

    1. 切换到secrec_prov_server目录。
      cd ${CC_DIR}/Tensorflow_Serving/docker/secret_prov
    2. 使用密钥验证服务镜像。

      您可以通过以下任一方式使用密钥验证服务镜像。

      • 下载密钥验证服务镜像。
        docker pull registry.cn-beijing.aliyuncs.com/tee_sgx/secrec_prov_server:v1
      • 根据脚本编译镜像。
        image_tag="secret_prov_server:v1"
        ./build_secret_prov_image.sh $image_tag
    3. 启动密钥验证服务。
      image_tag="registry.cn-beijing.aliyuncs.com/tee_sgx/secrec_prov_server:v1"
      
      # 如果您自行构建了镜像,请将$image_tag修改为对应的镜像tag名称
      container_id=$(./run_secret_prov.sh -i $image_tag|tail -n1)
      
      # 您也可以通过docker ps查看当前正在运行的所有container实例

      服务启动后便会在后台运行等待远程认证访问。当接收到远端认证后,认证通过会将密钥发送回远端。

    4. 查看secret_prov_server日志。
      docker logs -f $container_id

      当客户端返回如下图所示,说明已接收到认证。

      启动密钥

后续步骤

客户端部署完成后,会等待vSGX端启动推理服务并向客户端发送远程认证请求。关于如何部署vSGX端,请参见步骤二:部署vSGX端