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

前提条件

背景信息

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

AKK

当您想验证工作负载是否运行在可信平台上时,可以启动Shelter验证工具发送验证请求给Inclavared对平台进行验证。具体工作流程如下:

  1. 当Inclavared接收到Shelter的验证请求之后,将请求发送给机密容器,Inclavared和机密容器分别产生带有硬件可执行环境的Quote的TLS证书。
  2. Inclavared和Shelter之间基于Enclave-TLS建立经过证明的安全信道。
  3. Inclavared与机密容器之间基于Enclave-TLS建立经过双向证明过的安全信道。
  4. Inclavared转发机密容器提供的硬件可执行环境信息和敏感信息给Shelter。
  5. Shelter对Enclave运行时的度量值进行验证,并返回验证结果。

该架构包含以下组件:

组件名称 角色 功能
机密容器 工作负载 在Occlum中运行服务端程序enclave-tls-server,并基于Enclave-TLS,响应来自Inclavared的请求,并返回机密容器的attestation evidencemrenclave值和mrsigner值)。更多信息,请参见occlumenclave-tls
Inclavared 证明者 负责转发下游的机密容器和上游的客户端验证者程序Shelter之间的流量,且受到经过证明的Enclave-TLS信道的保护。
Shelter 线下的远程证明验证者
  1. 记录Enclave运行时的启动度量值。
  2. 建立可信TLS信道与Inclavared进行通信。
  3. Shelter对Enclave运行时的度量值进行验证,以便您能够明确知道自己的工作负载是否在被认证的TEE中加载。
阿里云证书缓存服务PCCS(Provisioning Certificate Caching Service) 远程证明服务 阿里云SGX远程证明服务完全兼容Intel® SGX ECDSA远程证明服务和Intel® SGX SDK,因此阿里云vSGX实例(即g7t、c7t或r7t实例的简称)能够通过远程证明来获得远程提供商或生产者的信任。更多信息,请参见Intel® SGX ECDSA远程证明服务和Intel® SGX SDK

使用限制

  • 仅支持对DaemonSet应用进行远程证明,即必须在该集群的所有节点上有且仅有一个DaemonSet应用。
  • 为了能让远程证明客户端程序Shelter直接访问到工作负载,集群中每个节点都要绑定EIP。具体操作,请参见步骤四:绑定节点EIP

步骤一:部署Inclavared组件

  1. 执行以下命令,部署名称为inclavared的DaemonSet应用。
    cat <<-EOF | kubectl apply -f -
    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: inclavared
    spec:
      selector:
        matchLabels:
          k8s-app: inclavared
      template:
        metadata:
          labels:
            k8s-app: inclavared
        spec:
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                - matchExpressions:
                  - key: alibabacloud.com/tee-hardware-category
                    operator: In
                    values:
                    - intel-sgx1
                    - intel-sgx2
          containers:
          - image: docker.io/inclavarecontainers/inclavared:latest
            imagePullPolicy: IfNotPresent
            securityContext:
              privileged: true
            name: inclavared
            command:
              - /usr/local/bin/inclavared
            args:
              - --listen
              - 0.0.0.0:1236
              - --xfer
              - 127.0.0.1:1234
              - --attester
              - sgx_ecdsa
              - --verifier 
              - sgx_ecdsa_qve
              - --mutual
            volumeMounts:
            - mountPath: /dev/sgx/enclave
              name: dev-enclave
            - mountPath: /dev/sgx/provision
              name: dev-provision
            - mountPath: /var/run/aesmd
              name: run-dir
            resources:
              requests:
                cpu: 100m
                memory: 100Mi
              limits:
                cpu: 1
                memory: 1000Mi
          tolerations:
          - effect: NoSchedule
            key: alibabacloud.com/sgx_epc_MiB
            operator: Exists
          volumes:
          - hostPath:
              path: /var/run/aesmd
              type: DirectoryOrCreate
            name: run-dir
          - hostPath:
              path: /dev/sgx_enclave
            name: dev-enclave
          - hostPath:
              path: /dev/sgx_provision
            name: dev-provision
          hostNetwork: true
    EOF
  2. 执行以下命令,查看Inclavared是否部署成功。
    kubectl get daemonset inclavared

    预期输出:

    NAME         DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
    inclavared   2         2         2       2            2           <none>          7d22h
    说明 当Inclavared启动后,Inclavared在端口监听地址0.0.0.0:1236监听来自远程认证客户端Shelter的请求,且会把请求转发给当前节点的工作负载。

步骤二:部署工作负载occlum-attestation-app

  1. 执行以下命令,部署名称为occlum-attestation-app的DaemonSet应用。
    cat <<-EOF | kubectl apply -f -
    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: occlum-attestation-app
    spec:
      selector:
        matchLabels:
          k8s-app: occlum-attestation-app
      template:
        metadata:
          labels:
            k8s-app: occlum-attestation-app
        spec:
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                - matchExpressions:
                  - key: alibabacloud.com/tee-hardware-category
                    operator: In
                    values:
                    - intel-sgx1
                    - intel-sgx2
          containers:
          - image: docker.io/inclavarecontainers/occlum-ecdsa-server:0.21.0
            imagePullPolicy: IfNotPresent
            securityContext:
              privileged: true
            name: occlum-attestation-app
            command:
              - /bin/enclave-tls-server
            args:
              - --ip
              - "127.0.0.1"    #本地机的IP地址。
              - --port
              - "1234"
              - --mutual
            env:
              - name: ENCLAVE_TYPE
                value: intelSgx
              - name: RUNE_CARRIER
                value: occlum
              - name: ENCLAVE_RUNTIME_LOGLEVEL
                value: info
              - name: ENCLAVE_RUNTIME_PATH
                value: /opt/occlum/build/lib/libocclum-pal.so.0.21.0
              - name: ENCLAVE_RUNTIME_ARGS
                value: occlum_workspace_server
              - name: OCCLUM_RELEASE_ENCLAVE
                value: "1"
            workingDir: /run/rune
            resources:
              requests:
                cpu: 100m
                memory: 100Mi
              limits:
                cpu: 1
                memory: 1000Mi
          tolerations:
          - effect: NoSchedule
            key: alibabacloud.com/sgx_epc_MiB
            operator: Exists
          hostNetwork: true
    EOF
  2. 执行以下命令,查看occlum-attestation-app是否部署成功。
    kubectl get daemonset occlum-attestation-app

    预期输出:

    NAME                     DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
    occlum-attestation-app   2         2         2       2            2           <none>          7d22h

    从上述输出信息可知occlum-attestation-app已部署成功,工作负载中的enclave-tls-server程序,在端口监听地址127.0.0.1:1234监听来自客户端Inclavared的连接请求。

步骤三:修改集群安全组配置

  1. 登录容器服务管理控制台
  2. 在控制台左侧导航栏中,单击集群
  3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
  4. 在集群信息管理页面,单击集群资源页签,然后单击安全组右侧的链接。
  5. 修改默认安全组规则,允许入方向1236端口可访问。具体操作,请参见修改安全组规则

步骤四:绑定节点EIP

说明 如果ECS实例已有公网IP,请跳过该步骤。
  1. 登录容器服务管理控制台
  2. 在控制台左侧导航栏中,单击集群
  3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
  4. 在集群管理页左侧导航栏中,选择节点管理 > 节点
  5. 节点页面,单击目标节点的实例ID名称。
  6. 在云服务器ECS控制台,选择实例与镜像 > 实例,单击实例详情页签。
  7. 单击绑定弹性IP为实例分配公网IP。
    akk1
    • 如果已有弹性IP,在绑定弹性IP对话框中,从弹性IP下拉列表中选择目标弹性IP。
    • 如果没有弹性IP,在绑定弹性IP对话框中,单击创建弹性公网IP。具体操作,请参见申请EIPjm11
  8. 单击确定

步骤五:安装远程证明客户端程序Shelter

  1. 安装SGX PSW环境。
    说明 Shelter在验证嵌有SGX认证信息的TLS证书过程中,需要依赖SGX PSW提供的动态库。更多信息,请参见SGX PSW
    • 如果您使用的是CentOS 8.2系统,执行以下命令,安装SGX PSW。
      yum install -y yum-utils && \
          wget -c https://download.01.org/intel-sgx/sgx-linux/2.13/distro/centos8.2-server/sgx_rpm_local_repo.tgz && \
          tar xzf sgx_rpm_local_repo.tgz && \
          yum-config-manager --add-repo sgx_rpm_local_repo && \
          yum makecache && rm -f sgx_rpm_local_repo.tgz && \
          yum install --nogpgcheck -y libsgx-dcap-quote-verify \
          libsgx-dcap-default-qpl libsgx-dcap-ql \
          libsgx-uae-service
    • 如果您使用的是Ubuntu 18.04系统,执行以下命令,安装SGX PSW。
      apt-get update -y && apt-get install -y wget gnupg && \
          echo "deb [arch=amd64] https://download.01.org/intel-sgx/sgx_repo/ubuntu bionic main" | tee /etc/apt/sources.list.d/intel-sgx.list && \
          wget -qO - https://download.01.org/intel-sgx/sgx_repo/ubuntu/intel-sgx-deb.key | apt-key add - && \
          apt-get update -y && \
          apt-get install -y libsgx-dcap-quote-verify=1.10.100.4-bionic1 \
          libsgx-dcap-default-qpl=1.10.100.4-bionic1 \
          libsgx-dcap-ql=1.10.103.1-bionic1 \
          libsgx-uae-service=2.13.100.4-bionic1
  2. 配置阿里云PCCS公网URL。

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

    说明 仅中国内地地域支持阿里云SGX远程证明服务。更多信息,请参见地域和可用区
    • 如果vSGX实例已分配公网IP,需要对/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
    • 如果vSGX实例只有VPC内网IP,需要对/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>替换为vSGX实例所在地域的ID。
  3. 安装远程证明客户端程序Shelter。
    • 如果您使用的是CentOS 8.2系统,执行以下命令,安装远程证明客户端程序Shelter。
      yum-config-manager --add-repo https://mirrors.openanolis.org/inclavare-containers/rpm-repo/ && \
          rpm --import https://mirrors.openanolis.org/inclavare-containers/rpm-repo/RPM-GPG-KEY-rpm-sign && \
          yum install -y shelter
    • 如果您使用的是Ubuntu 18.04系统,执行以下命令,安装远程证明客户端程序Shelter。
      echo 'deb [arch=amd64] https://mirrors.openanolis.org/inclavare-containers/deb-repo bionic main' | tee /etc/apt/sources.list.d/inclavare-containers.list && \
          wget -qO - https://mirrors.openanolis.org/inclavare-containers/deb-repo/DEB-GPG-KEY.key  |  apt-key add - && \
          apt-get update -y && apt-get install -y shelter
    结果验证

    执行以下命令,查看Shelter是否安装成功。

    which shelter

    预期输出:

    /usr/local/bin/shelter

验证在ACK-TEE集群中使用Inclavare Containers机密容器实现远程证明是否成功

对集群中所有节点依次执行以下命令,运行远程证明客户端程序Shelter。

说明 执行命令前请将<$IP>替换为节点的EIP。
shelter remoteattestation --verifier sgx_ecdsa --tls openssl --crypto openssl --addr=tcp://<$IP>:1236
  • 如果在SGX环境中运行Shelter,预期输出如下。jm67

    如果输出结果中包含Remote attestation is successful,则表明您已成功实现远程证明。

  • 如果在非SGX环境中运行Shelter,除了会输出上述包含Remote attestation is successful的信息,还会输出以下错误信息。
    [load_qve ../sgx_dcap_quoteverify.cpp:209] Error, call sgx_create_enclave for QvE fail [load_qve], SGXError:2006.
    [sgx_qv_get_quote_supplemental_data_size ../sgx_dcap_quoteverify.cpp:527] Error, failed to load QvE.

    上述输出的错误信息您可以忽略,因为其对最终的证明结果没有任何影响。

    出现该错误的原因是:Shelter在调用sgx_qv_get_quote_supplemental_data_size()时,总会先尝试加载QVE(Quote Verification Enclave)。如果加载失败(所有非SGX环境都无法成功加载QVE),Shelter会输出上述错误信息,然后会自动使用QVL(Quote Verification Library)进行后续证明逻辑。在非SGX环境中,验证过程都是由QVL处理。更多信息,请参见Intel® SGX ECDSA远程证明