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 Gateway的公網出口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壓縮和 Base 64 編碼 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) # 將證據進行 Base 64 編碼並適配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可能包含敏感配置資訊,應嚴格控制其產生、分發與儲存許可權,防止泄露。