Inclavare Containers实现了一个针对云场景的通用且跨平台的远程证明架构EAA(Enclave Attestation Architecture)。EAA能够向您证明其敏感的工作负载是运行在基于机密技术硬件的可信执行加密环境(Trusted
Execution Environment,简称TEE)中的。本文介绍如何在部署了Inclavare Containers的ACK-TEE集群中实现远程证明。
背景信息
EAA远程证明以关联了带有硬件可执行环境的Quote的TLS证书为信任根,确保通信双方的通信信道的安全性是完全基于硬件可信执行环境的。具体工作流程和架构图如下:

当您想验证工作负载是否运行在可信平台上时,可以启动Shelter验证工具发送验证请求给Inclavared对平台进行验证。具体工作流程如下:
- 当Inclavared接收到Shelter的验证请求之后,将请求发送给机密容器,Inclavared和机密容器分别产生带有硬件可执行环境的Quote的TLS证书。
- Inclavared和Shelter之间基于Enclave-TLS建立经过证明的安全信道。
- Inclavared与机密容器之间基于Enclave-TLS建立经过双向证明过的安全信道。
- Inclavared转发机密容器提供的硬件可执行环境信息和敏感信息给Shelter。
- Shelter对Enclave运行时的度量值进行验证,并返回验证结果。
该架构包含以下组件:
组件名称 |
角色 |
功能 |
机密容器 |
工作负载 |
在Occlum中运行服务端程序enclave-tls-server,并基于Enclave-TLS,响应来自Inclavared的请求,并返回机密容器的attestation evidence (mrenclave 值和mrsigner 值)。更多信息,请参见occlum和enclave-tls。
|
Inclavared |
证明者 |
负责转发下游的机密容器和上游的客户端验证者程序Shelter之间的流量,且受到经过证明的Enclave-TLS信道的保护。 |
Shelter |
线下的远程证明验证者 |
- 记录Enclave运行时的启动度量值。
- 建立可信TLS信道与Inclavared进行通信。
- 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组件
- 执行以下命令,部署名称为
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
- 执行以下命令,查看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
- 执行以下命令,部署名称为
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
- 执行以下命令,查看
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的连接请求。
步骤三:修改集群安全组配置
- 登录容器服务管理控制台。
- 在控制台左侧导航栏中,单击集群。
- 在集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情。
- 在集群信息管理页面,单击集群资源页签,然后单击安全组右侧的链接。
- 修改默认安全组规则,允许入方向
1236
端口可访问。具体操作,请参见修改安全组规则。
步骤四:绑定节点EIP
- 登录容器服务管理控制台。
- 在控制台左侧导航栏中,单击集群。
- 在集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情。
- 在集群管理页左侧导航栏中,选择。
- 在节点页面,单击目标节点的实例ID名称。
- 在云服务器ECS控制台,选择,单击实例详情页签。
- 单击绑定弹性IP为实例分配公网IP。

- 如果已有弹性IP,在绑定弹性IP对话框中,从弹性IP下拉列表中选择目标弹性IP。
- 如果没有弹性IP,在绑定弹性IP对话框中,单击创建弹性公网IP。具体操作,请参见申请EIP。

- 单击确定。
步骤五:安装远程证明客户端程序Shelter
- 安装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
- 配置阿里云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。
- 安装远程证明客户端程序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,预期输出如下。

如果输出结果中包含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远程证明。