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

背景信息

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

操作步骤

  1. 创建安全增强型实例并构建所需的环境。
    1. 创建安全增强型实例。
      具体操作,请参见创建安全增强型实例
      请注意以下参数:
      • 实例规格:加密内存≥32 GiB,本操作选用的实例规格为ecs.g7t.4xlarge
      • 镜像:Alibaba Cloud Linux 2.1903 LTS 64位 UEFI版
      • 公网IP:分配公网IPv4地址
    2. 构建SGX加密计算环境。
      具体操作,请参见构建SGX加密计算环境
    3. 安装Python3并配置环境变量。
      本实践所用的Python版本为3.6,您也可以根据需要,安装合适的Python版本。具体安装操作,请参见Python官网
    4. 安装Docker。
    5. 安装所需的opencv-python、mesa-libGL等软件包。
      pip install opencv-python
      yum install mesa-libGL
      pip install tensorflow-serving-api
  2. 登录ECS实例。
    具体操作,请参见连接方式概述
  3. 切换到使用的工作目录(如/home/tf)下,下载本实践所用的TensorFlow Serving脚本代码并安装所需的argparse、aiohttp、tensorflow等软件包。
    cd /home/tf
    git clone https://gitee.com/cloud_cc/confidential-computing.git
    pip3 install -r confidential-computing/Tensorflow_Serving/client/requirements.txt
  4. 进入TensorFlow_Serving/client目录,下载模型。
    cd /home/tf/confidential-computing/Tensorflow_Serving/client
    ./download_model.sh

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

  5. 模型转换。

    为了兼容TensorFlow Serving,需要对训练好的模型文件进行格式转换。

    pip3 install tensorflow==2.4.0  #安装tensorflow, 模型转换脚本依赖tensorflow
    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。

  6. 创建gRPC TLS证书。
    本实践选择gRPC TLS建立客户端和TensorFlow Serving之间的通信连接,并设置TensorFlow Serving域名来创建单向TLS Keys和证书,用来建立安全通信通道。

    该脚本将会创建ssl_configure文件夹,里面包含server.crt,server.key和ssl.cfg。server.crt将会被客户端使用,ssl.cfg将会被TensorFlow Serving使用。

    service_domain_name=grpc.tf-serving.service.com
    ./generate_ssl_config.sh ${service_domain_name}
  7. 创建加密模型。

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

    本实践使用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 /home/test/confidential-computing/Tensorflow_Serving/docker/secret_prov
    2. 使用密钥验证服务镜像。

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

      • 下载密钥验证服务镜像。
        docker pull registry.cn-beijing.aliyuncs.com/tee_sgx/secrec_prov_server:v1
      • 根据脚本编译镜像。
        ./build_secret_prov_image.sh
    3. 获取镜像ID。
      docker images
    4. 启动密钥验证服务。
      ./run_secret_prov.sh -i image_id

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

    5. 查看secret_prov_server日志。
      docker logs image_id

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

      启动密钥

后续步骤

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