使用Inclavare Containers实现远程证明

Inclavare Containers实现了一个针对云场景的通用且跨平台的远程证明架构。该架构能够向您证明其敏感的工作负载是运行在基于机密技术硬件的可信执行加密环境TEE(Trusted Execution Environment)中的。本文介绍如何使用Inclavare Containers实现远程证明。

背景信息

远程证明以关联了带有硬件可执行环境的Quote的TLS证书为信任根,确保通信双方的通信信道的安全性是完全基于硬件可信执行环境的。具体工作流程和架构图如下图所示。

image

当您想验证机密容器工作负载是否运行在基于机密技术硬件的可信执行加密环境上时,可以启动云上的rats-tls-client客户端发送验证请求给Verdictd。具体工作流程如下:

  1. 启动运行在用户侧可信环境中的Verdictd服务,作为线下的远程证明验证者。

  2. Verdict生成并设置远程证明参考值,然后将其上传到Verdictd运行环境中。

  3. 云上的rats-tls-client客户端向Verdictd发起远程证明请求,将机密容器提供的硬件可执行环境信息和敏感信息发送给Verdictd。

  4. Verdictd检查度量值信息,检查云上的工作负载是否运行在预期的可信环境中,从而完成整个远程证明流程。

其中涉及的主要组件及功能说明如下表所示。

组件名称

角色

功能

机密容器

工作负载

在Enclave运行时中运行客户端程序rats-tls-client。该程序获取HW-TEE(即机密容器)中运行程序的度量值,基于RATS-TLS向Verdictd发起远程证明请求。更多信息,请参见rats-tls

Verdictd

线下的远程证明验证者

运行在用户侧可信环境中的服务。职责是调用阿里云公网PCCS和Verdict检查运行在HW-TEE中程序度量值信息,以完成整个远程证明流程。更多信息,请参见Verdictd

Verdict

线下的参考值提供者

运行在用户侧可信环境中的程序,它也是Verdictd的配置程序。作用是配置Verdictd认可的、运行在HW-TEE程序度量值的参考值,以判定在HW-TEE环境中的运行程序是符合预期的或者程序是没有被篡改过的。更多信息,请参见Verdict

阿里云证书缓存服务PCCS(Provisioning Certificate Caching Service)

远程证明服务

阿里云SGX远程证明服务完全兼容Intel® SGX ECDSA远程证明服务和Intel® SGX SDK,因此阿里云vSGX实例(即g7t、c7t或r7t等实例规格族的简称)能够通过远程证明来获得远程提供商或生产者的信任。更多信息,请参见Intel® SGX ECDSA远程证明服务和Intel® SGX SDK

本教程中示例资源分配如下:

  • 使用Alibaba Cloud Linux的UEFI版公共镜像的安全增强型实例模拟云上的rats-tls-client客户端。

  • 使用CentOS 8.2公共镜像的ECS实例模拟运行远程证明验证者Verdictd的线下主机。

注意事项:

  • Alibaba Cloud Linux 2.1903 LTS 64位 UEFI版和Alibaba Cloud Linux 3.2104 64位 UEFI版公共镜像均可使用Inclavare Containers实现远程证明。部分需要区分操作系统版本的命令将在下文的具体步骤中说明。

  • 仅中国内地地域支持阿里云SGX远程证明服务。关于地域的更多信息,请参见地域和可用区

操作步骤

步骤一:准备工作

  1. 创建一台使用Alibaba Cloud Linux的UEFI版公共镜像的安全增强型实例。

    该实例将模拟云上的rats-tls-client客户端。创建安全增强型实例时,您需要选择特定的支持安全特性的镜像。具体操作,请参见创建可信实例

    说明

    创建实例时,请为实例选择专有网络VPC与交换机,并绑定公网IP地址,使实例开通公网访问能力。

  2. 在已创建的安全增强型实例中构建SGX加密计算环境。

    具体操作,请参见构建SGX加密计算环境

  3. 创建一台使用CentOS 8.2公共镜像的ECS实例。

    该实例将模拟运行远程证明验证者Verdictd的线下主机。创建ECS实例的具体操作,请参见自定义购买实例。关于Verdictd的更多信息,请参见Verdictd

    说明

    创建实例时,请为实例选择专有网络VPC与交换机,并绑定公网IP地址,使实例开通公网访问能力。

  4. 添加CentOS 8.2实例的安全组规则,在安全组入方向放行1111端口。

    具体操作,请参见添加安全组规则

步骤二:安装云上的机密容器工作负载

  1. 远程连接使用Alibaba Cloud Linux的UEFI版公共镜像的安全增强型实例。

    具体操作,请参见连接方式概述

  2. 运行以下命令,安装机密容器rats-tls-sgx。

    rats-tls-sgx安装包中提供了sample程序和库文件,用于基于硬件可执行环境建立安全通信信道。更多信息,请参见rats-tls

    • 云上环境为Alibaba Cloud Linux 3.2104 64位 UEFI版系统,运行以下命令:

      sudo yum-config-manager --add-repo https://mirrors.openanolis.cn/inclavare-containers/alinux3-repo && \
        sudo rpm --import https://mirrors.openanolis.cn/inclavare-containers/alinux3-repo/RPM-GPG-KEY-rpm-sign && \
        sudo yum install -y rats-tls-sgx
    • 云上环境为Alibaba Cloud Linux 2.1903 LTS 64位 UEFI版系统,运行以下命令:

      sudo yum-config-manager --add-repo https://mirrors.openanolis.org/inclavare-containers/alinux2-repo && \
        sudo rpm --import https://mirrors.openanolis.org/inclavare-containers/alinux2-repo/RPM-GPG-KEY-rpm-sign && \
        sudo yum install -y rats-tls-sgx
  3. 运行以下命令,查看rats-tls-sgx是否安装成功。

    ls /usr/share/rats-tls/samples

    返回结果示例如下,表示rats-tls-sgx已安装成功。

    rats-tls-client  rats-tls-server  sgx_stub_enclave.signed.so

步骤三:安装并启动线下的Verdictd

  1. 远程连接使用CentOS 8.2公共镜像的ECS实例。

    具体操作,请参见连接方式概述

  2. 切换CentOS 8源地址。

    CentOS 8操作系统版本结束了生命周期(EOL),按照社区规则,CentOS 8的源地址http://mirror.centos.org/centos/8/内容已移除,您在阿里云上继续使用默认配置的CentOS 8的源会发生报错。如果您需要使用CentOS 8系统中的一些安装包,则需要手动切换源地址。具体操作,请参见CentOS 8 EOL如何切换源?

  3. 运行以下命令,安装SGX PSW环境。

    Verdictd在验证嵌有SGX认证信息的TLS证书过程中,需要依赖SGX PSW提供的动态库。更多信息,请参见SGX PSW

    sudo yum install -y yum-utils && \
        sudo wget -c https://download.01.org/intel-sgx/sgx-linux/2.13/distro/centos8.2-server/sgx_rpm_local_repo.tgz && \
        sudo tar xzf sgx_rpm_local_repo.tgz && \
        sudo yum-config-manager --add-repo sgx_rpm_local_repo && \
        sudo yum makecache && rm -f sgx_rpm_local_repo.tgz && \
        sudo yum install --nogpgcheck -y libsgx-dcap-quote-verify \
        libsgx-dcap-default-qpl libsgx-dcap-ql \
        libsgx-uae-service
  4. 配置阿里云PCCS公网URL。

    阿里云SGX远程证明服务采用区域化部署,您可以通过访问实例所在地域的阿里云SGX远程证明服务来获得最佳的稳定性。您需要手动修改/etc/sgx_default_qcnl.conf文件以适配实例所在地域的阿里云SGX远程证明服务。

    说明

    仅中国内地地域支持阿里云SGX远程证明服务。关于地域的更多信息,请参见地域和可用区

    • 如果实例已分配公网IP,则需要对/etc/sgx_default_qcnl.conf的内容做以下修改。您可以使用vi或vim编辑器修改文档。使用编辑器的示例命令为sudo vi /etc/sgx_default_qcnl.confsudo vim /etc/sgx_default_qcnl.conf

      # PCCS server address
      PCCS_URL=https://sgx-dcap-server.<Region-ID>.aliyuncs.com/sgx/certification/v3/
      # To accept insecure HTTPS cert, set this option to FALSE
      USE_SECURE_CERT=TRUE

      其中,<Region-ID>为变量,您需要替换为实例所属的地域信息。例如实例所属华东1(杭州),则<Region-ID>需要替换为cn-hangzhou

    • 如果实例只有VPC内网IP,则需要对/etc/sgx_default_qcnl.conf的内容做以下修改。您可以使用vi或vim编辑器修改文档。使用编辑器的示例命令为sudo vi /etc/sgx_default_qcnl.confsudo vim /etc/sgx_default_qcnl.conf

      # PCCS server address
      PCCS_URL=https://sgx-dcap-server-vpc.<Region-ID>.aliyuncs.com/sgx/certification/v3/
      # To accept insecure HTTPS cert, set this option to FALSE
      USE_SECURE_CERT=TRUE

      其中,<Region-ID>为变量,您需要替换为实例所属的地域信息。例如实例所属华东1(杭州),则<Region-ID>需要替换为cn-hangzhou

  5. 运行以下命令,安装Verdictd软件栈。

    Verdictd在验证嵌有SGX认证信息的TLS证书过程中,需要依赖rats-tls-host库文件。

    sudo yum-config-manager --add-repo https://mirrors.openanolis.cn/inclavare-containers/rpm-repo/ && \
        sudo rpm --import https://mirrors.openanolis.cn/inclavare-containers/rpm-repo/RPM-GPG-KEY-rpm-sign && \
        sudo yum install -y rats-tls-host verdictd
  6. 运行以下命令,查看Verdictd是否安装成功。

    which verdictd verdict

    返回结果示例如下,表示Verdictd已安装成功。

    /usr/local/bin/verdictd
    /usr/local/bin/verdict
  7. 运行以下命令,查看rats-tls-host是否安装成功。

    ls /usr/share/rats-tls/samples

    返回结果示例如下,表示rats-tls-host已安装成功。

    rats-tls-client  rats-tls-server
  8. 运行以下命令,启动线下的Verdictd服务。

    verdictd --client-api 127.0.0.1:10001 --listen 0.0.0.0:1111 --mutual --attester nullattester --verifier sgx_ecdsa --tls openssl --crypto openssl
    说明

    当Verdictd启动后,Verdictd在端口监听地址0.0.0.0:1111监听来自远程认证客户端rats-tls-client的远程证明请求,同时在端口监听地址127.0.0.1:10001监听来自Verdict的配置policy的相关请求。

    在后续的操作步骤中,您需要始终保持Verdictd服务为运行状态。因此您需要始终保持当前远程连接ECS实例的终端页面为正常的连接状态。

步骤四:配置远程证明参考值

  1. 新建一个终端远程连接使用CentOS 8.2公共镜像的ECS实例。

    具体操作,请参见连接方式概述

    说明

    新建终端时,您需要保证已启动Verdictd服务的终端未关闭或未断开连接,即当前共有两个终端同时远程连接的使用CentOS 8.2公共镜像的ECS实例。

  2. 使用Verdict工具配置Verdictd的SGX OPA的参考值,从而实现只能启动特定SGX Enclave的目标。

    Open Policy Agent(OPA)是一个开源的通用策略引擎,可以统一整个堆栈的策略执行。具体信息,请参见OPA

    1. 运行以下命令,导出SGX OPA参考值文件。

      verdict --client-api 127.0.0.1:10001 --export-opa-reference sgxData

      导出的sgxData内容如下:

      cat sgxData
      {
          "mrEnclave": [],
          "mrSigner": [],
          "productId": 0,
          "svn": 0
      }

      默认参考值文件sgxData的参数解析如下:

      • mrEnclave:SGX Enclave的mrEnclave会被添加到参考值mrEnclave数组中。

      • mrSigner:SGX Enclave的mrSigner会被添加到参考值mrSigner数组中。

      • productId:用于确保SGX Enclave的productId大于等于参考值productId。

      • svn:用于确保SGX Enclave的svn大于等于参考值svn。

    2. 获取SGX OPA参考值。

      在实际业务环境中,云上部署的应用是您自己生成的,您需要根据自己的可信应用获得应用的参考值。下面以如何获得云上部署的sgx_stub_enclave.signed.so参考值为例,介绍如何获得SGX OPA参考值:

      1. 运行以下命令,下载云上部署的应用。

        • 云上环境为Alibaba Cloud Linux 3.2104 64位 UEFI版系统,运行以下命令:

          wget https://mirrors.openanolis.cn/inclavare-containers/alinux3-repo/rats-tls-sgx-0.6.5-1.al8.x86_64.rpm
        • 云上环境为Alibaba Cloud Linux 2.1903 LTS 64位 UEFI版系统,运行以下命令:

          wget https://mirrors.openanolis.cn/inclavare-containers/alinux2-repo/rats-tls-sgx-0.6.5-1.al7.x86_64.rpm
      2. 运行以下命令,解压缩已下载的rpm包。

        • 云上环境为Alibaba Cloud Linux 3.2104 64位 UEFI版系统,运行以下命令:

          rpm2cpio rats-tls-sgx-0.6.5-1.al8.x86_64.rpm | cpio -div
        • 云上环境为Alibaba Cloud Linux 2.1903 LTS 64位 UEFI版系统,运行以下命令:

          rpm2cpio rats-tls-sgx-0.6.5-1.al7.x86_64.rpm | cpio -div
      3. 运行以下命令,下载并安装sgx_sign工具。

        export SGX_SDK_VERSION=2.14 && \
            export SGX_SDK_RELEASE_NUMBER=2.14.100.2 && \
            sudo wget -c https://download.01.org/intel-sgx/sgx-linux/$SGX_SDK_VERSION/distro/centos8.2-server/sgx_linux_x64_sdk_$SGX_SDK_RELEASE_NUMBER.bin && \
            sudo chmod +x sgx_linux_x64_sdk_$SGX_SDK_RELEASE_NUMBER.bin && \
            echo -e 'no\n/opt/intel\n' | sudo ./sgx_linux_x64_sdk_$SGX_SDK_RELEASE_NUMBER.bin && \
            sudo rm -f sgx_linux_x64_sdk_$SGX_SDK_RELEASE_NUMBER.bin
      4. 运行以下命令,使用sgx_sign工具dump Enclave的元数据文件和Enclave签名数据结构(即SIGSTRUCT)。

        /opt/intel/sgxsdk/bin/x64/sgx_sign dump -enclave ./usr/share/rats-tls/samples/sgx_stub_enclave.signed.so -dumpfile metadata.txt -cssfile sigstruct.bin
      5. 运行以下命令,获取mrEnclave的base64编码。

        dd skip=960 count=32 if=sigstruct.bin of=mrenclave.binary bs=1 && \
            cat mrenclave.binary | base64

        返回结果示例如下:

        • Alibaba Cloud Linux 3.2104 64位 UEFI版系统

          zqs/chEBBNrInHlSCDO+0eV/pnlAB5qieF3M0hKfekA=
        • Alibaba Cloud Linux 2.1903 LTS 64位 UEFI版系统

          +PLc9QPrEZ6ad9e3BgihgOINOVPYvIj0v/ixt2Kbwyw=
      6. 运行以下命令,获取mrSigner的base64编码。

        grep -A 2 -i "mrsigner->value" metadata.txt | awk -F ":" 'NR==2,NR==3 {print $1}' | xargs echo -n | sed 's/[[:space:]]//g;s/0x//g' | xxd -r -p | base64

        返回结果示例如下:

        g9cZ533qyhRw9rr2Kk13QwPImdtpAg+ccO4d/AjHzp4=
      7. 运行以下命令,获取productId值。

        dd skip=1024 count=2 if=sigstruct.bin of=productId.binary bs=1 && \
            od -An -tx2 productId.binary

        以本节下载的rats-tls-sgx-0.6.5-1.al8.x86_64.rpm为例,返回结果示例如下:

        0000
      8. 运行以下命令,获取svn值。

        dd skip=1026 count=2 if=sigstruct.bin of=svn.binary bs=1 && \
            od -An -tx2 svn.binary

        以本节下载的rats-tls-sgx-0.6.5-1.al8.x86_64.rpm为例,返回结果示例如下:

        0000
    3. 运行以下命令,根据SGX OPA参考值生成evidence文件。

      根据已获得的SGX OPA参考值,生成evidence文件。该文件是一个包含stub_enclave evidence信息的JSON文件,其作用是测试更新后的sgxData参考值文件是否可以工作。

      • 云上环境为Alibaba Cloud Linux 3.2104 64位 UEFI版系统,运行以下命令:

        cat <<- EOF >evidence
        {
            "mrEnclave": "zqs/chEBBNrInHlSCDO+0eV/pnlAB5qieF3M0hKfekA=",
            "mrSigner": "g9cZ533qyhRw9rr2Kk13QwPImdtpAg+ccO4d/AjHzp4=",
            "productId": 0,
            "svn": 0
        }
        EOF
      • 云上环境为Alibaba Cloud Linux 2.1903 LTS 64位 UEFI版系统,运行以下命令:

        cat <<- EOF >evidence
        {
            "mrEnclave": "+PLc9QPrEZ6ad9e3BgihgOINOVPYvIj0v/ixt2Kbwyw=",
            "mrSigner": "g9cZ533qyhRw9rr2Kk13QwPImdtpAg+ccO4d/AjHzp4=",
            "productId": 0,
            "svn": 0
        }
        EOF
    4. 运行以下命令,更新SGX OPA参考值本地文件。

      根据已获得的SGX OPA参考值更新sgxData文件。

      • 云上环境为Alibaba Cloud Linux 3.2104 64位 UEFI版系统,运行以下命令:

        cat <<- EOF >./sgxData
        {
            "mrEnclave": ["zqs/chEBBNrInHlSCDO+0eV/pnlAB5qieF3M0hKfekA="],
            "mrSigner": ["g9cZ533qyhRw9rr2Kk13QwPImdtpAg+ccO4d/AjHzp4="],
            "productId": 0,
            "svn": 0
        }
        EOF
      • 云上环境为Alibaba Cloud Linux 2.1903 LTS 64位 UEFI版系统,运行以下命令:

        cat <<- EOF >./sgxData
        {
            "mrEnclave": ["+PLc9QPrEZ6ad9e3BgihgOINOVPYvIj0v/ixt2Kbwyw="],
            "mrSigner": ["g9cZ533qyhRw9rr2Kk13QwPImdtpAg+ccO4d/AjHzp4="],
            "productId": 0,
            "svn": 0
        }
        EOF
    5. 可选:运行以下命令测试更新后的参考值本地文件。

      如果您需要测试本地更新后的参考值文件,例如新参考值文件格式是否正确、新添加的参考值是否可以工作等问题,可以选择执行该步骤。

      verdict --client-api 127.0.0.1:10001 --test-opa-local-reference sgxPolicy.rego ./sgxData ./evidence

      命令内参数说明如下:

      • --test-opa-local-reference:表示测试本地的参考值文件。

      • sgxPolicy.rego:表示测试使用的OPA策略文件的名字,命令中必须设置为sgxPolicy.rego

      • ./sgxData:被测试的文件,即更新后的参考值文件。

      • ./evidence:由Shell脚本生成,包含stub_enclave的evidence信息的JSON文件。该文件的作用是测试更新后的sgxData参考值文件是否可以正常工作。

      测试成功的返回结果如下:

      • Alibaba Cloud Linux 3.2104 64位 UEFI版系统

        image.png
      • Alibaba Cloud Linux 2.1903 LTS 64位 UEFI版系统alinux2

    6. 运行以下命令,上传参考值文件。

      当参考值文件更新完毕后,您可以把本地的最新参考值文件上传到Verdictd。

      verdict --client-api 127.0.0.1:10001 --set-opa-reference sgxData ./sgxData

      返回结果如下图所示:测试结果此时,您运行cat /opt/verdictd/opa/sgxData命令可以查看到参考值文件已经被更新。如下所示:

      • Alibaba Cloud Linux 3.2104 64位 UEFI版系统

        cat /opt/verdictd/opa/sgxData
        {
            "mrEnclave": ["zqs/chEBBNrInHlSCDO+0eV/pnlAB5qieF3M0hKfekA="],
            "mrSigner": ["g9cZ533qyhRw9rr2Kk13QwPImdtpAg+ccO4d/AjHzp4="],
            "productId": 0,
            "svn": 0
        }
      • Alibaba Cloud Linux 2.1903 LTS 64位 UEFI版系统

        cat /opt/verdictd/opa/sgxData
        {
            "mrEnclave": ["+PLc9QPrEZ6ad9e3BgihgOINOVPYvIj0v/ixt2Kbwyw="],
            "mrSigner": ["g9cZ533qyhRw9rr2Kk13QwPImdtpAg+ccO4d/AjHzp4="],
            "productId": 0,
            "svn": 0
        }

步骤五:验证远程证明是否成功

  1. 远程连接使用Alibaba Cloud Linux的UEFI版公共镜像的安全增强型实例。

    具体操作,请参见连接方式概述

    说明

    您需要继续保持已启动Verdictd服务的终端未关闭或未断开连接。

  2. 运行以下命令,远程证明客户端rats-tls-client程序向线下的Verdictd服务发起远程证明请求,进而检测云上的工作负载是否运行在基于硬件的可信执行环境中。

    cd /usr/share/rats-tls/samples/ && \
    sudo ./rats-tls-client -a sgx_ecdsa -v nullverifier -t openssl -c openssl -i <Verdictd服务所在实例的公网IP地址> -p 1111 --mutual --verdictd

    其中,<Verdictd服务所在实例的公网IP地址>为变量,您需要替换为Verdictd服务所在实例的公网IP地址。

    返回结果如下所示,表示远程证明已成功。

    image.png