PeerPod远程证明(Remote Attestation)旨在确保机密容器始终运行于真实、未被篡改的机密计算环境(如Intel TDX)中。通过在容器部署前自动验证节点,并在运行时允许应用按需获取环境证明,为敏感工作负载提供端到端的安全保障。
工作原理
机密计算远程证明旨在为PeerPod容器建立可验证且受硬件保护的运行环境,使其免受外部攻击。该机制以远程证明服务(Trustee)为信任锚,在Pod生命周期的两个关键阶段——“部署时”和“运行时”——进行环境完整性校验。
场景一:容器启动前的环境可信验证
面向集群管理员,确保Pod仅在真实可信的机密环境中启动。整个流程由系统后台自动完成,无需人工干预。
发起部署:管理员通过集群API Server创建工作负载Pod后,节点上的kubelet会通过CRI(Container Runtime Interface)接口请求containerd创建Pod沙箱。containerd会检查Pod指定的
runtimeClassName,最终调用名为 kata-runtime 的底层 Kata Remote 运行时程序。创建机密虚拟机:Kata Remote响应请求,调用阿里云OpenAPI启动一个基于硬件加密隔离的轻量级ECS TDX机密虚拟机实例,作为Kubernetes Pod。
强制远程证明:在拉取业务镜像前,虚拟机内的Attestation Agent自动生成包含硬件签名的运行环境“证据”(Evidence),并发送给Trustee服务进行验证。
验证通过,运行工作负载:仅当Trustee确认Evidence有效后,Guest内部的管控逻辑才继续执行后续操作,包括拉取镜像和启动容器。
场景二:容器运行时的远程证明能力
面向运行中的容器化应用,允许其主动向外部服务证明自身所处环境的安全性,构建跨系统的信任链。
应用获取Evidence:容器内应用通过访问本地API接口(
http://127.0.0.1:8006/aa/evidence)请求实时生成的远程证明报告。验证工作负载:应用将此Evidence发送给外部的Container服务使用者。
外部验证:服务使用者将Evidence送至其信任的Trustee服务进行验证。验证成功表明通信对方确实运行于受保护的机密环境,实现动态的信任建立。
准备工作
集群已启用CAA方案,详见基于机密虚拟机实现CAA机密容器方案。
在用户信任的环境中安装Trustee,并记录其IP地址(即Trustee服务端点)。安装命令如下。
集群中的PeerPod必须能访问此IP以完成远程验证,请确保Trustee所在网络与CAA集群Pod所属VPC之间路由可达。
yum install trustee -y本文使用Alibaba Cloud Linux 3操作系统,Trustee IP以
1.2.3.4为例。在Trustee服务器上,为其添加安全组规则,放行TCP 8080端口,源地址为 CAA 集群Pod访问Trustee时的出口IP。
若CAA集群与Trustee位于同一VPC,直接放行本VPC网段。
若需跨VPC或通过公网通信,则放行集群NAT网关的公网出口IP。
场景一:验证并部署容器到可信环境
在容器部署阶段执行远程证明,确保工作负载只在经过验证的可信节点上运行。
1. 配置Trustee
在Trustee服务器上完成策略配置,定义哪些环境特征被视为可信。
配置容器安全启动策略。
此策略文件作为机密资源,在TDX Pod启动过程中被读取,触发远程证明流程。
# 创建策略存储目录 mkdir -p /opt/trustee/kbs/repository/default/container-policy # 写入一个允许所有镜像的策略文件(仅供示例) cat << EOF > /opt/trustee/kbs/repository/default/container-policy/insecure-accept-all { "default": [{"type": "insecureAcceptAnything"}], "transports": {} } EOF配置远程证明策略。
该策略定义了可信硬件与软件环境的具体标准,例如要求运行在Intel TDX平台上。
# 修改策略文件 /opt/trustee/attestation-service/policies/opa/default.rego # 替换为适用于ECS TDX PeerPod的远程证明策略 cat << EOF > /opt/trustee/attestation-service/policies/opa/default.rego package policy import rego.v1 default executables := 32 default hardware := 97 default configuration := 32 default file_system := 32 ##### ECS TDX PeerPod executables := 3 if { input.tdx } hardware := 2 if { # 验证证据是否为Intel TDX类型 input.tdx.quote.header.tee_type == "81000000" # 验证厂商ID input.tdx.quote.header.vendor_id == "939a7233f79c4ca9940a0db3957f0607" } configuration := 2 if { input.tdx } file_system := 2 if { input.tdx } EOF重启Trustee服务使策略生效。
service as restart
2. 部署启用远程证明的Pod
准备Initdata并部署Pod。
Initdata用于向PeerPod传递配置信息,包括Trustee服务地址。
# 替换为真实Trustee IP TRUSTEE_SERVICE_ENDPOINT=1.2.3.4 # 生成initdata.toml文件 cat <<EOF > initdata.toml version = "0.1.0" algorithm = "sha256" [data] "aa.toml" = ''' [eventlog_config] enable_eventlog = true [token_configs] [token_configs.kbs] url = "http://${TRUSTEE_SERVICE_ENDPOINT}:8080" ''' "cdh.toml" = ''' [kbc] name = "cc_kbc" url = "http://${TRUSTEE_SERVICE_ENDPOINT}:8080" [image] image_security_policy_uri = "kbs:///default/container-policy/insecure-accept-all" ''' EOF # 对initdata进行gzip压缩和 Base64 编码 initdata=$(cat initdata.toml | gzip | base64 -w0)可通过
echo $initdata查看initdata内容。创建Pod YAML文件。
将上一步生成的
initdata字符串写入Pod元数据的annotations字段中。# 创建一个名为 pod.yaml 的文件 cat << EOF > pod.yaml apiVersion: v1 kind: Pod metadata: name: pod-caa-demo annotations: io.katacontainers.config.hypervisor.cc_init_data: ${initdata} spec: runtimeClassName: kata-remote containers: - image: alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/alinux3:latest name: hello command: ["sh", "-c", "echo hello && sleep infinity"] EOF部署Pod。
kubectl apply -f pod.yaml部署后,可执行
kubectl get po pod-caa-demo查看Pod运行状态。在Trustee服务器上验证远程证明状态。
查看远程证明服务的日志,确认环境验证是否成功。
journalctl -u as -f如果日志中出现
Tdx Verifier/endorsement check passed,表示远程证明成功,Pod已在可信环境中启动。
场景二:在容器运行时获取并验证环境可信性
本场景演示已在PeerPod中运行的容器应用如何动态获取其运行环境的远程证明证据,并由独立外部服务完成验证的完整流程。
涉及三个独立执行环境,请注意区分:
本地终端:操作集群的机器。
Pod 容器内部:机密应用运行的位置,负责生成证明。可执行
kubectl exec -it pod-caa-demo -- sh进入。验证端服务器:独立且可信的服务器节点,部署 Trustee 服务用于验证收到的Evidence。可复用已有Trustee,也可单独部署。
1. 在容器内获取远程证明证据
(1)在容器内添加动态度量(可选)
动态度量允许应用将自定义的运行时信息嵌入远程证明报告,增强审计与合规能力。
标准远程证明验证“保险箱”本身的安全性,而动态度量进一步证明“保险箱内物品”的状态符合预期。
在Pod容器内部,通过向API(http://127.0.0.1:8006/aa/aael)发送HTTP POST请求来动态记录信息。该信息将被持久化至TDX Pod底层的Eventlog,并绑定在最终的证明报告中,防止篡改。
请求体:
domain,operation,content均为可自定义的不含空格的可打印字符串。{ "domain": "<DOMAIN>", "operation": "<OPERATION>", "content": "<CONTENT>" }示例:记录一次配置加载事件
# 在容器内执行 curl -X POST http://127.0.0.1:8006/aa/aael \ -H "Content-Type: application/json" \ -d '{"domain":"test","operation":"test","content":"test"}'
(2)从容器内获取远程证明证据(Evidence)
在Pod容器内部,通过发送HTTP GET请求来获取当前TEE环境的远程证明Evidence,供外部调用方验证。
向http://127.0.0.1:8006/aa/evidence发送GET请求即可获取Evidence。
runtime_data参数应携带由验证方提供的Base64编码挑战值(Nonce),用于防御重放攻击。curl 127.0.0.1:8006/aa/evidence?runtime_data=AAAA命令执行后输出一段较长的JSON字符串,即为当前TEE环境的远程证明Evidence。请完整复制该字符串(以{开头,}结尾),建议保存至临时文件以便后续使用。
2. 准备验证环境
验证过程依赖一个独立且可信的Trustee实例。
(可选)执行
yum install trustee -y在服务器上安装Trustee。配置客户端验证策略。
在验证节点的Trustee服务中创建新的策略文件
/opt/trustee/attestation-service/policies/opa/client.rego。# 创建 client.rego 文件,并写入所有内容 cat <<EOF > /opt/trustee/attestation-service/policies/opa/client.rego # 验证从机密容器(TEE)获取的Evidence package policy import rego.v1 # --- 默认评分 --- default executables := 32 default hardware := 97 default configuration := 32 default file_system := 32 # --- 针对阿里云 ECS TDX PeerPod 的验证规则 --- # 例如:2代表“可信”(trustworthy),3代表“认可”(affirming) # 如果输入(input)的证据中包含 "tdx" 字段,则认为其软件栈是“认可”的 executables := 3 if { input.tdx } # 硬件评分规则:如果同时满足以下两个条件,则硬件环境被评定为“可信”(trustworthy, 评分为2)。 hardware := 2 if { # 检查TEE类型字段,必须是Intel TDX的标识符 "81000000" input.tdx.quote.header.tee_type == "81000000" # 检查厂商ID字段,必须是Intel的官方UUID input.tdx.quote.header.vendor_id == "939a7233f79c4ca9940a0db3957f0607" } # 如果输入的是一个TDX证据,则认为其配置是“可信”的。 configuration := 2 if { input.tdx } # 如果输入的是一个TDX证据,则认为其文件系统是“可信”的。 file_system := 2 if { input.tdx } EOF重启Trustee,使
client.rego策略生效。service as-restful restart
3. 准备并发送验证请求
将容器内获取的Evidence提交至验证服务进行校验。
安全存储证据原文(推荐做法)。
为避免复制时因特殊字符导致错误,建议将Evidence存入文件。
# 创建名为 evidence.json 的临时文件 cat > evidence.json执行后,粘贴完整的JSON字符串,保存并退出编辑模式。
从文件读取证据并准备请求。
# 从文件读取内容到变量 EVIDENCE=$(cat evidence.json) # 将证据进行 Base64 编码并适配URL安全格式 BASE64EVIDENCE=$(echo ${EVIDENCE} | base64 -w 0 2>/dev/null | tr '+/' '-_' | tr -d '=' ) # 创建包含编码后证据的请求体文件 cat << EOF > request.json { "verification_requests": [ { "tee": "tdx", "evidence": "${BASE64EVIDENCE}" } ], "policy_ids": ["client"] } EOF发送验证请求
向本地验证服务(默认端口50005)的/attestation接口发送 POST 请求。curl -k -X POST http://127.0.0.1:50005/attestation \ -i \ -H 'Content-Type: application/json' \ -d @request.json执行后,响应体会包含
token字段(JWT 字符串),即验证令牌,请复制。
4. 解析并评估验证结果
通过远程证明Token,解析并获取当前环境各子状态的评分值。
存储验证令牌。
# 将 '<...>' 替换为实际获取的 JWT 字符串(不带有双引号本身) TOKEN='<在此处粘贴此前的JWT Token>'解析并查看评分
echo $TOKEN | cut -d'.' -f2 | base64 -d | jq '.submods.cpu0."ear.trustworthiness-vector"'预期输出:
base64: invalid input { "configuration": 2, "executables": 3, "file-system": 2, "hardware": 2 }base64: invalid input:可忽略此提示信息。{...}:JSON内容为验证结果。各项评分与策略文件设定一致,表明容器运行在符合要求的可信TDX环境中,验证通过。
生产环境使用建议
精细化管理证明策略:示例中采用宽松策略。生产环境应根据实际硬件平台和软件栈精确制定Rego策略,并纳入版本控制系统,便于审计与变更追踪。
凭证和密钥管理:
initdata.toml可能包含敏感配置信息,应严格控制其生成、分发与存储权限,防止泄露。