為保護AI模型資產或處理金融、醫學等敏感性資料,可使用阿里雲TDX機密計算執行個體,通過遠程證明擷取密鑰以解密和部署Qwen模型,實現AI推理過程的硬體級資料保護,從而保障核心資產安全。
應用情境
金融/醫學行業的合規AI:在處理包含個人識別資訊或受保護健康資訊的文本時,利用機密計算確保資料在推理過程中不被泄露,滿足合規要求。
企業私人知識庫:企業希望使用內部的、敏感的文檔(如財務報表、研發資料)來增強大模型,但又不希望這些核心資料在雲端以明文形式暴露。本方案可確保知識庫資料和微調後的模型都受到硬體保護。
保護商業模型資產:對於AI服務提供者,其精心訓練的專有模型是核心商業資產。本方案可以防止模型在雲端被非法複製或竊取。
方案概述
Confidential AI方案介紹
Confidential AI是阿里雲提供的一種在不被信任的雲環境中安全執行AI任務的解決方案。它的核心價值在於,藉助Intel TDX等機密計算硬體技術,為AI模型和敏感性資料提供一個“硬體保險箱”(即機密環境),實現端到端的安全與隱私保護。
核心組件解釋
Trustee:可理解為“密鑰保險箱”。主要負責安全地儲存和管理用於解密AI模型的密鑰。只有經過嚴格遠程證明(Remote Attestation)的可信請求才能從中擷取密鑰。
Trustiflux:可以將其視為雲端的“可信守門員”。部署在TDX執行個體內部,核心職責是通過遠程證明流程,向Trustee證明當前運行環境是真實、未被篡改的TDX機密環境。只有“自證清白”後,Trustiflux才能從Trustee擷取密鑰。
整體流程概覽

您的可信環境中:下載原始AI模型 -> 加密模型 -> 將密鑰存入Trustee。
機密計算環境中(TDX執行個體):
TDX執行個體中的Trustiflux發起遠程證明 -> Trustee驗證證明 -> 驗證通過後,Trustee將密鑰發送給Trustiflux。
Trustiflux擷取加密的模型 -> 使用收到的密鑰解密模型。
在機密環境中載入解密後的模型,並啟動AI推理服務。
準備工作
ECS資源準備:建立一台TDX機密計算執行個體,關鍵配置項如下:
地區及可用性區域:華北2(北京)可用性區域I。
執行個體規格:Qwen-7B-Chat模型運行時約需30 GiB記憶體。為確保穩定,建議選擇
ecs.g8i.4xlarge(16 vCPU, 64 GiB記憶體) 或更高規格。鏡像:選擇
Alibaba Cloud Linux 3.2104 LTS 64位,並勾選機密虛擬機器選項。公網IP:務必勾選分配公網IPv4地址,頻寬建議選擇按使用流量並設定峰值為100 Mbps,以加速模型下載。
資料盤:模型及相關檔案會佔用較大空間,建議系統硬碟至少為
100 GiB。
安全性群組配置:在安全性群組中允許存取以下連接埠的入站流量。管理安全性群組規則
22:用於SSH遠程登入。9090:用於後續步驟中,從雲端擷取加密模型的臨時HTTP服務。7860:用於訪問最終部署的Qwen Web UI或API服務。50005:(可選)用於TNG保證推理提示詞和推理響應結果的通道安全。
步驟一:在可信環境下準備加密模型和密鑰
首先需要完成模型下載、加密以及配置Trustee來保管密鑰。為方便示範,本文後續實操步驟在同一TDX執行個體中進行。在實際部署時,請在您的本地或可信環境下運行。
安裝基礎工具
使用root使用者登入執行個體,安裝Trustee、gocryptfs及其他依賴。
yum install -y trustee gocryptfs tmux git git-lfs wget && git lfs install # 啟動trustee服務 systemctl start trustee
下載
Qwen-7B-Chat模型模型檔案較大,下載耗時較長(約15-20分鐘),建議在
tmux會話中執行,以防SSH串連斷開導致下載中斷。# 建立工作目錄 mkdir -p /cai/trustee && cd /cai/trustee # 建立並進入一個名為 qwen_clone 的 tmux 會話 # 提示:使用 tmux 可以防止因網路波動或SSH用戶端關閉導致下載任務中斷。 tmux new-session -d -s qwen_clone "git clone https://www.modelscope.cn/qwen/Qwen-7B-Chat.git qwen-7b-chat --depth=1" # 觀察下載進度 # 提示:下載完成後,進程會退出,並顯示[exited] tmux attach -t qwen_clone
加密模型檔案
使用
gocryptfs工具建立一個加密目錄,並將模型檔案移入,自動執行模型加密。# 準備用於存放加密資料(cipher)和解密後掛載點(plain)的目錄 mkdir -p /cai/trustee/mount/{cipher,plain} # 建立一個密碼檔案用於加密。在生產環境中,應使用更安全的隨機密碼 printf '123456' > /cai/trustee/sample_password # 使用密碼檔案初始化 gocryptfs 加密目錄 cat /cai/trustee/sample_password | gocryptfs -init /cai/trustee/mount/cipher # 以後台進程方式,將加密目錄掛載到明文掛載點 (cat /cai/trustee/sample_password | gocryptfs /cai/trustee/mount/cipher /cai/trustee/mount/plain &) && sleep 2 # 將模型檔案移動到明文掛載點。gocryptfs會自動處理加密過程,將加密後的資料寫入cipher目錄。由於檔案較大,加密過程需等待5分鐘左右。 mv /cai/trustee/qwen-7b-chat/ /cai/trustee/mount/plain # 操作完成,卸載明文掛載點 fusermount -u /cai/trustee/mount/plain預期結果
執行完畢後,運行
ls /cai/trustee/mount/cipher,應該看到若干加密後的檔案名稱,而不是qwen-7b-chat。同時,運行ls /cai/trustee,確認qwen-7b-chat目錄已不存在。
儲存密鑰至Trustee
將上一步中用到的密碼檔案,安全地存放到
Trustee的密鑰庫中。mkdir -p /opt/trustee/kbs/repository/cai/sample/ mv /cai/trustee/sample_password /opt/trustee/kbs/repository/cai/sample/password
啟動本地HTTP服務
啟動一個臨時的Web伺服器,用於向雲端環境提供加密後的模型檔案。
# 此命令會啟動一個監聽在127.0.0.1:9090的服務,保持此終端視窗運行 cd /cai/trustee/mount/cipher && python3 -m http.server 9090 --bind 127.0.0.1
步驟二:在雲端機密環境中解密並掛載模型
請在第二個SSH終端視窗中進行本章操作。
在執行操作前,請確保步驟一中通過
python3 -m http.server命令啟動的服務仍在第一個終端中運行。否則,本章的wget命令將無法找到下載源而失敗。
安裝Trustiflux
在第二個終端中,安裝attestation-agent(證明代理)和confidential-data-hub(機密資料中心)及相關環境依賴。
yum install -y attestation-agent confidential-data-hub gocryptfs wget
執行遠程證明並擷取密鑰
以下命令將配置並啟動證明服務,與本地的Trustee(在本例中為同一台機器的127.0.0.1)通訊,驗證成功後擷取模型密鑰並儲存。
密鑰傳輸安全由 Trustiflux 和 Trustee 之間基於 TEE 的應用程式層加密協議(KBS Attestation Protocol)提供保障。
# 配置attestation-agent和confidential-data-hub以與本地Trustee通訊 sed -i "/^\[token_configs\.kbs\]$/,/^$/ s|^url = .*|url = \"http://127.0.0.1:8080\"|" \ /etc/trustiflux/attestation-agent.toml sed -i "/^\[token_configs\.coco_as\]$/,/^$/ s|^url = .*|url = \"http://127.0.0.1:50004\"|" \ /etc/trustiflux/attestation-agent.toml sed -i 's|\(url\s*=\s*"\)[^"]*|\1http://127.0.0.1:8080|' \ /etc/trustiflux/confidential-data-hub.toml # 啟動證明代理,然後請求密鑰資源 attestation-agent -c /etc/trustiflux/attestation-agent.toml > /dev/null 2>&1 & PID=$! && sleep 1 password=$(confidential-data-hub \ -c /etc/trustiflux/confidential-data-hub.toml \ get-resource \ --resource-uri kbs:///cai/sample/password) mkdir -p /cai/trustiflux && echo "$password" | base64 -d > "/cai/trustiflux/sample_password"預期結果
命令成功執行後,可在
/cai/trustiflux/sample_password路徑下找到內容為123456的密碼檔案。若沒有該檔案,需檢查步驟一中本地HTTP服務是否處於運行中。未處於運行中需重新啟動服務並保持終端視窗運行。
擷取並解密模型
# 使用wget遞迴下載在步驟 1.5 中公開的加密模型檔案 wget -c --tries=30 --timeout=30 --waitretry=15 \ -r -np -nH --cut-dirs=0 -R "index.html*" \ --progress=dot:giga --show-progress \ -P /cai/trustiflux/mount/cipher \ http://127.0.0.1:9090 # 建立明文掛載點 mkdir -p /cai/trustiflux/mount/plain # 使用之前通過遠程證明擷取的密鑰,將下載的加密模型目錄掛載到明文掛載點 gocryptfs -debug -passfile /cai/trustiflux/sample_password /cai/trustiflux/mount/cipher /cai/trustiflux/mount/plain預期結果
命令執行後,終端將輸出
Filesystem mounted and ready。執行ls /cai/trustiflux/mount/plain,可以看到解密後的qwen-7b-chat目錄。若
wget下載加密模型時串連被拒絕 (Connection refused),需檢查步驟一中本地HTTP服務是否處於運行中。未處於運行中需重新啟動服務並保持終端視窗運行。
步驟三:啟動並訪問Qwen推理服務
請在第三個SSH終端中執行本章操作。
準備Python環境與依賴
在第三個終端中,使用Conda建立並啟用一個新的Python環境。
# 下載並安裝Miniconda wget https://repo.anaconda.com/miniconda/Miniconda3-py39_23.11.0-2-Linux-x86_64.sh bash Miniconda3-py39_23.11.0-2-Linux-x86_64.sh -b -p $HOME/miniconda # 啟用Conda環境 source $HOME/miniconda/bin/activate # 建立並啟用專用的Python 3.10環境 conda create -n pytorch_env python=3.10 -y conda activate pytorch_env預期結果
終端提示符前出現
(pytorch_env)。
選擇一種方式啟動服務(三選一)
通過API編程方式調用模型:選擇啟動OpenAI相容的API服務。
通過圖形化介面與模型互動:選擇啟動Web UI服務。
直接在伺服器終端與模型對話:選擇啟動命令列互動式對話。
啟動OpenAI相容的API服務
# 啟用專用的Python 3.10環境 source $HOME/miniconda/bin/activate conda activate pytorch_env cd /cai/trustiflux git clone https://github.com/QwenLM/Qwen.git cd Qwen pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu pip3 install -r requirements.txt && pip3 install fastapi uvicorn "openai<1.0" pydantic sse_starlette python openai_api.py -c ../mount/plain/qwen-7b-chat --cpu-only --server-name 0.0.0.0 --server-port 7860訪問方式:在任何可以訪問ECS公網IP的終端上,使用
curl命令調用:本文以本地終端為例。
curl -X POST http://<TDX執行個體公網IP地址>:7860/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "Qwen", "messages": [ { "role": "system", "content": "You are a helpful assistant." }, { "role": "user", "content": "Who are you?" } ] }'輸出如圖所示:

啟動Web UI服務
# 啟用專用的Python 3.10環境 source $HOME/miniconda/bin/activate conda activate pytorch_env cd /cai/trustiflux git clone https://github.com/QwenLM/Qwen.git cd Qwen pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu pip3 install -r requirements.txt && pip3 install -r requirements_web_demo.txt python3 web_demo.py -c ../mount/plain/qwen-7b-chat --cpu-only --server-name 0.0.0.0 --server-port 7860訪問方式:在您的本地瀏覽器地址欄輸入
http://<ECS公網IP地址>:7860。啟動命令列互動式對話
# 啟用專用的Python 3.10環境 source $HOME/miniconda/bin/activate conda activate pytorch_env cd /cai/trustiflux git clone https://github.com/QwenLM/Qwen.git cd Qwen pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu pip3 install -r requirements.txt python3 cli_demo.py -c ../mount/plain/qwen-7b-chat --cpu-only訪問方式:啟動後,直接在終端的
User>提示符後輸入問題即可。如圖所示:
步驟四:(可選)通過TNG增強通道安全
為了實現從用戶端到雲端機密環境的全鏈路加密,可使用可信網路網關(TNG)來保護通訊通道,防止推理提示詞和推理響應結果在傳輸過程中被竊聽。
以通過API與模型對話為例,執行操作前,請確保步驟三中的OpenAI相容的API服務已啟動。
服務端(TDX執行個體)部署TNG
在TDX執行個體上開啟第四個終端,執行以下命令:
yum install -y trusted-network-gateway tng launch --config-content '{ "add_egress": [{ "netfilter": { "capture_dst": { "port": 7860 }, "capture_local_traffic": true, "listen_port": 40001 }, "attest": { "aa_addr": "unix:///run/confidential-containers/attestation-agent/attestation-agent.sock" } }] }'
用戶端(本地機器)部署TNG
在您的本地機器上下載並運行TNG。
TNG更多版本
本地為x86_64
# x86_64 wget https://github.com/inclavare-containers/TNG/releases/download/v2.2.4/tng-v2.2.4.x86_64-unknown-linux-gnu.tar.gz tar -zxvf tng-v2.2.4.x86_64-unknown-linux-gnu.tar.gz && chmod +x tng ./tng launch --config-content '{ "add_ingress": [{ "http_proxy": { "proxy_listen": { "host": "127.0.0.1", "port": 41000 } }, "verify": { "as_addr": "http://<TDX執行個體公網IP地址>:50005", "policy_ids": [ "default" ] } }] }'本地為aarch64
# aarch64 wget https://github.com/inclavare-containers/TNG/releases/download/v2.2.4/tng-v2.2.4.aarch64-unknown-linux-gnu.tar.gz tar -zxvf tng-v2.2.4.aarch64-unknown-linux-gnu.tar.gz && chmod +x tng ./tng launch --config-content '{ "add_ingress": [{ "http_proxy": { "proxy_listen": { "host": "127.0.0.1", "port": 41000 } }, "verify": { "as_addr": "http://<TDX執行個體公網IP地址>:50005", "policy_ids": [ "default" ] } }] }'
通過TNG代理訪問服務
開啟新的本地命令列,執行以下命令,配置HTTP代理後,通過加密通道與模型對話:
# 臨時設定環境變數,配置HTTP代理 export http_proxy=http://127.0.0.1:41000 # 通過API與模型對話 curl -X POST http://<TDX執行個體公網IP地址>:7860/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "Qwen", "messages": [ { "role": "system", "content": "You are a helpful assistant." }, { "role": "user", "content": "Who are you?" } ] }'
常見問題(FAQ)
安裝trustee時報錯"Error: Transaction test error"
原因:系統中已安裝的SGX/TDX依賴與trustee衝突。
解決:
yum remove libsgx-dcap-default-qpl libsgx-dcap-quote-verify後再重新安裝。
wget下載加密模型時串連被拒絕 (Connection refused)原因:步驟一中第5步啟動的
python3 -m http.server服務已停止。解決:返回到執行該命令的終端(第一個終端),確保服務仍在運行。如果已停止,請重新進入
/cai/trustee/mount/cipher目錄並再次啟動它。
瀏覽器無法訪問Web UI(
http://<ECS公網IP地址>:7860)原因與排查:
安全性群組規則:檢查安全性群組是否已為公網允許存取TCP 7860連接埠。
服務監聽地址:確保啟動命令中包含了
--server-name 0.0.0.0。服務運行狀態:在第三個終端檢查
web_demo.py進程是否仍在正常運行。
擷取密鑰檔案時報錯:
{code: 111, kind: ConnectionRefused, message: "Connection refused"}原因:通過
systemctl status trustee命令檢查執行個體的trustee服務是否處於運行中。若為inactive,代表未運行。解決:執行
systemctl start trustee命令啟動trustee服務。