本文介紹如何在基于Intel? Trusted Domain Extension(Intel? TDX)技術的ECS實例(下文簡稱為TDX實例)中構建TDX機密計算環境,并演示如何運行實例代碼以驗證TDX功能。
背景信息
Intel? TDX是一項基于CPU硬件的云服務器ECS保護技術,TDX實例的CPU寄存器、內存數據、中斷處理等均受到CPU硬件的機密保護,云廠商和外部攻擊者均無法監控或篡改TDX實例的內部運行狀態(如運行的進程、計算中的敏感數據等)。關于Intel? TDX技術的更多信息,請參見Intel? Trusted Domain Extension(Intel? TDX)。
Intel? TDX可以為您的實例和應用提供默認的安全保護,即您可以將現有應用直接遷移至TDX實例上并獲得TDX能力帶來的安全保護,而無需重新開發現有的應用程序。
創建TDX實例
通過控制臺創建
在控制臺創建具備TDX特性的實例步驟與創建普通實例類似,但需要注意一些特定選項。本步驟重點介紹TDX實例相關的特定配置,如果您想了解其他通用配置,請參見自定義購買實例。
登錄ECS管理控制臺。
在左側導航欄,選擇 。
在頁面左側頂部,選擇目標資源所在的資源組和地域。
單擊創建實例,按照以下配置創建對應實例。
配置項
說明
地域與可用區
當前僅支持華北2(北京)可用區I
實例規格
當前僅支持ecs.g8i.xlarge及以上實例規格
鏡像
選擇Alibaba Cloud Linux 3.2104 LTS 64位 UEFI 版鏡像,并選中機密虛擬機復選框。
根據界面提示,完成創建實例。
通過OpenAPI或阿里云CLI創建
您可以調用RunInstances或阿里云CLI創建支持TDX安全特性的ECS實例,需要注意的參數如下表所示。
參數 | 說明 | 示例 |
RegionId | 華北2(北京) | cn-beijing |
ZoneId | 可用區I | cn-beijing-i |
InstanceType | 選擇ecs.g8i.xlarge及以上實例規格 | ecs.g8i.2xlarge |
ImageId | 指定支持TDX的鏡像ID,當前僅內核版本大于等于5.10.134-16.al8.x86_64的Alibaba Cloud Linux 3.2104 LTS 64位 UEFI 版鏡像支持。 | aliyun_3_9_x64_20G_uefi_alibase_20231219.vhd |
SecurityOptions.ConfidentialComputingMode | 配置機密計算模式。 | TDX |
CLI示例
aliyun ecs RunInstances \
--SecurityOptions.ConfidentialComputingMode TDX \
--Region cn-beijing \
--ZoneId cn-beijing-i \
--SystemDisk.Category cloud_essd \
--ImageId 'aliyun_3_9_x64_20G_uefi_alibase_20231219.vhd' \
--InstanceType 'ecs.g8i.2xlarge' \
--SecurityGroupId 'sg-[SecurityGroupId]' \
--VSwitchId 'vsw-[VSwitchID]' \
--KeyPairName [KEY_PAIR_NAME] \
操作步驟
步驟一:檢查TDX使能狀態
在使用TDX機密計算環境前,建議您先檢查對應實例的TDX使能狀態,以確保對應實例處于安全保護中。
檢查TDX使能狀態。
lscpu |grep -i tdx_guest
下圖所示表示TDX已經被正確使能。
檢查TDX相關驅動安裝情況。
ls -l /dev/tdx_guest
下圖所示表示已經安裝TDX相關驅動。
步驟二:構建TDX機密計算環境
正常情況下,運行于非TDX環境下的程序可直接遷移至TDX實例中,而無需額外開發,且您可以像使用普通實例一樣使用TDX實例。阿里云建議您利用下文所述的相關功能,以充分利用TDX所提供的額外安全能力,并更好地保護實例的安全。
TDX Report是由CPU硬件直接生成的代表了TDX實例身份的數據結構,其包含了TDX實例的屬性(ATTRIBUTES)、動態度量值(RTMR)、TCB SVN等關鍵信息,并以密碼學方法保護其完整性。更多信息,請參見Intel TDX Module。
導入阿里云機密計算yum軟件源。
公網地址格式:
https://enclave-[Region-ID].oss-[Region-ID].aliyuncs.com/repo/alinux/enclave-expr.repo
。VPC內網地址格式:
https://enclave-[Region-ID].oss-[Region-ID]-internal.aliyuncs.com/repo/alinux/enclave-expr.repo
。請將上述地址中的[Region-ID]替換為TDX實例所在地域的ID。當前僅支持在華北2(北京)地域創建TDX實例,華北2(北京)地域中的VPC內網導入示例:
region="cn-beijing" sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://enclave-${region}.oss-${region}-internal.aliyuncs.com/repo/alinux/enclave-expr.repo
安裝編譯工具及相關示例代碼。
sudo yum groupinstall -y "Development Tools" sudo yum install -y sgxsdk libtdx-attest-devel
編譯示例代碼TDXReportParse。
進入TDXReportParse目錄。
cd /opt/alibaba/teesdk/intel/sgxsdk/SampleCode/TDXReportParse
編譯TDXReportParse。
sudo make
運行編譯出的可執行文件。
sudo ./tdx_report_parse
執行的樣例結果如下,
attributes
中的NO_DEBUG
表示當前的TDX實例處于非調試狀態,即處于安全的受保護模式。
驗證TDX遠程證明
在阿里云TDX加密環境中,遠程證明可以用于驗證平臺的可信度和在該平臺中運行的代碼的完整性和機密性。更多遠程證明服務說明,請參見遠程證明服務。
平臺指阿里云所使用的硬件平臺及其虛擬化軟件棧。
平臺中運行的代碼指運行在TDX環境中的操作系統(如Alibaba Cloud Linux)和應用(如Nginx、Java等)。
安裝TDX遠程證明所需依賴的包。
sudo yum install -y gcc gcc-c++ make openssl-devel git jq sudo yum install -y tdx-quote-generation-sample tee-appraisal-tool libsgx-dcap-ql-devel libsgx-dcap-quote-verify-devel libsgx-dcap-default-qpl-devel tdx-quote-verification-sample
配置阿里云TDX遠程證明服務。
配置
/etc/sgx_default_qcnl.conf
文件中的PCCS_URL
,當前僅支持將PCCS_URL指向阿里云華北2(北京)的DCAP服務。sudo sed -i.$(date "+%m%d%y") 's|PCCS_URL=.*|PCCS_URL=https://sgx-dcap-server.cn-beijing.aliyuncs.com/sgx/certification/v4/|' /etc/sgx_default_qcnl.conf
進入tdx-quote-generation-sample目錄并編譯tdx-quote-generation-sample。
cd /opt/alibaba/tdx-quote-generation-sample sudo make
生成遠程證明報告(Quote)。
隨機生成report_data并簽發Quote。
sudo ./app
指定report_data并簽發Quote。
sudo ./app -d <report_data_in_hex>
<report_data_in_hex>
是一個16進制字符串,長度為64字節。您可以在
report_data_in_hex
中指定自定義數據,該數據將被包含在生成的Quote中。report_data_in_hex
因其長度有限,在實踐中通常是一個哈希值。例如,它是一個公鑰的哈希,并可以用于后續的密鑰協商流程。
說明例如:
sudo ./app -d 1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef sudo ./app -d $(cat data.dat | xxd -p)
回顯類似如下所示時,表示遠程證明報告(Quote)已生成。
驗證遠程證明報告(Quote)。
配置評估策略(Appraisal Policy)并簽名。
重要建議您在已知的安全環境下進行,而非在生產環境中按需生成。
您可以使用JSON格式描述您所需要的安全評估策略。
例如您可以配置以下安全策略以驗證您的TDX ECS是否運行在加密且不可調試的狀態,即安全的受保護模式。
您還可以在策略中配置額外參數以實現操作系統和應用的完整性校驗。關于該評估策略(Appraisal Policy)的詳細說明,請參考Intel DCAP Appraisal Engine Developer Guide。
{ "policy_array":[ { "environment":{ "class_id":"45b734fc-aa4e-4c3d-ad28-e43d08880e68", "description":"Application TD TCB 1.5" }, "reference":{ "tdx_attributes":"0000000010000000", "#NOTE": "0000000010000000 means for NO_DEBUG and SPTE_VE_DISABLE" } } ] }
您可以使用默認策略(位于
/opt/alibaba/tdx-quote-verification-sample/Policies/tenant_td_policy.json
)或編寫您的自定義策略,用于后續校驗的策略令牌(Policy Token),該策略令牌可以被傳輸至任何需要驗證遠程證明報告的環境中以進行后續的校驗流程。cd /opt/alibaba/tdx-quote-verification-sample sudo make Policies/tenant_td_policy.jwt
回顯類似如下所示時,表示已生成策略令牌(Policy Token)。
編譯TDX遠程證明所依賴的其他組件。
cd /opt/alibaba/tdx-quote-verification-sample sudo make all
回顯類似如下所示時,所依賴的組件已編譯完成
驗證遠程證明報告(Quote)。
重要以下命令中的
<path_to_quote>
請替換成實際Quote目錄,如本文示例中的/opt/alibaba/tdx-quote-generation-sample/quote.dat
。基于
Policies/tenant_td_policy.json中
的策略,驗證遠程證明生成的quote,并將對應的驗證結果以JSON Web Token (JWT)的形式輸出到標準輸出。./verifier -quote <path_to_quote>
回顯類似如下所示。
使用RelyingParty,進一步驗證JWT簽名的有效性。
./verifier -quote <path_to_quote> |./relying_party -v |grep "json payload" |awk -F 'payload:' '{print $2}'|jq
說明為簡單起見,您可以檢查
appraisal_result
中的overall_appraisal_result
字段以確認認證者是否滿足您預先設置的評估策略(Appraisal Policy)。./verifier -quote <path_to_quote> |./relying_party -v |grep "json payload" |awk -F 'payload:' '{print $2}'|jq '.[0].result.overall_appraisal_result'
此外,在生成quote時所指定的
report_data
也會體現在遠程證明的驗證結果(tdx_reportdata字段)中,您可以使用該值進行密鑰交換等業務邏輯的實現。./verifier -quote <path_to_quote> |./relying_party -v -a|grep "json payload" |awk -F 'payload:' '{print $2}'|jq '.. | .tdx_reportdata? | select(. != null)'
回顯類似如下所示(部分字段被省略)。
[ { "result": { "appraisal_check_date": 1710400829000000000, "nonce": 502551065253582, "certification_data": [ { "certification_data": { "qe_identity_issuer_chain": "LS0t...", "root_ca_crl": "MzA4...", "pck_crl": "LS0t...", "pck_crl_issuer_chain": "LS0t...", "tcb_info": "eyJ0...", "qe_identity": "eyJl...", "tcb_info_issuer_chain": "LS0t..." } } ], "overall_appraisal_result": 1, "appraised_reports": [ { "appraisal_result": 1, "detailed_result": [ { "td_mrownerconfig_check": true, "td_xfam_check": true, "td_mrservicetd_check": true, "td_attributes_check": true, "td_rtmr3_check": true, "td_mrtd_check": true, "td_mrowner_check": true, "td_rtmr0_check": true, "td_mrconfigid_check": true, "td_rtmr1_check": true, "td_rtmr2_check": true } ], "policy": { "environment": { "description": "Application TD TCB 1.5", "class_id": "45b734fc-aa4e-4c3d-ad28-e43d08880e68" }, "signature": "-6C0-...", "reference": { ... }, "signing_key": { "kty": "EC", "crv": "P-384", "alg": "ES384", "y": "CeW8...", "x": "NmSa..." } }, "report": { "environment": { "Description": "Application TD TCB", "class_id": "45b734fc-aa4e-4c3d-ad28-e43d08880e68" }, "measurement": { "tdx_mrownerconfig": "0000...", "tdx_mrservicetd": "3D03...", "tdx_xfam": "00000000000642E7", "tdx_mrtd": "0A40...", "tdx_mrowner": "0000...", "tdx_attributes": "0000000010000000", "tdx_mrconfigid": "0000...", "tdx_reportdata": "D98B...", "tdx_rtmr3": "0000...", "tdx_rtmr2": "0000...", "tdx_rtmr1": "6368...", "tdx_rtmr0": "D0FD..." } } }, { "appraisal_result": 1, "detailed_result": [ { "platform_provider_id_check": true, "sgx_types_check": true, "cached_keys_check": true, "smt_enabled_check": true, "accepted_tcb_level_date_tag_check": true, "advisory_ids_check": true, "expiration_date_check": true, "tcb_eval_num_check": true, "earliest_accepted_tcb_level_date_tag_check": true, "tcb_status_check": true, "dynamic_platform_check": true } ], "policy": { "environment": { "description": "Alibaba Cloud Evaluation Num Policy for TDX Platform", "class_id": "f708b97f-0fb2-4e6b-8b03-8a5bcd1221d3" }, "signature": "l00p...", "reference": { "accepted_tcb_status": [ "UpToDate" ], "allow_dynamic_plaform": true, "min_eval_num": 16 }, "signing_key": { "kty": "EC", "crv": "P-384", "alg": "ES384", "y": "7hlr...", "x": "OSbD..." } }, "report": { "environment": { "description": "TDX Platform TCB", "class_id": "f708b97f-0fb2-4e6b-8b03-8a5bcd1221d3" }, "measurement": { "earliest_issue_date": "2018-05-21T10:45:10Z", "is_cached_keys_policy": true, "fmspc": "90C06F000000", "is_smt_enabled": true, "earliest_expiration_date": "2024-04-02T10:22:51Z", "root_ca_crl_num": 1, "root_key_id": "9309...", "pck_crl_num": 1, "tcb_eval_num": 16, "latest_issue_date": "2024-03-13T15:45:02Z", "tcb_status": [ "UpToDate" ], "tcb_level_date_tag": "2023-08-09T00:00:00Z", "is_dynamic_platform": true, "sgx_types": 1 } } }, { "appraisal_result": 1, "detailed_result": [ { "td_qe_expiration_date_check": true, "td_qe_tcb_eval_num_check": true, "td_qe_earliest_accepted_tcb_level_date_tag_check": true, "td_qe_tcb_status_check": true, "td_qe_accepted_tcb_level_date_tag_check": true } ], "policy": { "environment": { "description": "Alibaba Cloud Num Policy for Verified TDQE", "class_id": "3769258c-75e6-4bc7-8d72-d2b0e224cad2" }, "signature": "l00p...", "reference": { "accepted_tcb_status": [ "UpToDate" ], "min_eval_num": 16 }, "signing_key": { "kty": "EC", "crv": "P-384", "alg": "ES384", "y": "7hlr...", "x": "OSbD..." } }, "report": { "environment": { "Description": "RAW TDX QE Report", "class_id": "3769258c-75e6-4bc7-8d72-d2b0e224cad2" }, "measurement": { "earliest_expiration_date": "2025-05-21T10:50:10Z", "earliest_issue_date": "2018-05-21T10:45:10Z", "root_key_id": "9309...", "tcb_eval_num": 16, "latest_issue_date": "2018-05-21T10:50:10Z", "tcb_status": [ "UpToDate" ], "tcb_level_date_tag": "2023-08-09T00:00:00Z" } } } ] } } ]
已知功能限制
開啟TDX特性的ECS的CPU寄存器和內存中的數據會通過CPU硬件進行加密保護,因此其性能相較普通ECS實例存在一定損失。
受限于TDX動態度量值(RTMR)重置/中斷保護/寄存器狀態恢復等設計,開啟了TDX特性的ECS實例不支持內部重啟(即在操作系統內部不支持執行reboot命令)。
暫不支持VNC登錄實例,但不影響SSH方式登錄,例如可以通過Workbench或第三方客戶端登錄。如需獲取實例運行時所打印的日志,請參見查看實例的系統日志和屏幕截圖或GetInstanceConsoleOutput - 獲取實例系統命令行輸出。
鏡像限制:
僅支持UEFI鏡像。
暫不支持Windows。
不支持內核版本過老的鏡像,內核版本需大于等于5.10.134-16.al8.x86_64。
暫不支持eRDMA和各類加速器等。
Linux guest kernel SWIOTLB buffer已知問題:
可見內存較常規實例較小,開啟了TDX特性的ECS實例內部將使用特定的非加密內存(SWIOTLB)用于外設通信,該內存區域的大小默認情況下為ECS實例可用內存的6%(但不大于1 GiB)。
大規格插入多張ENI彈性網卡可能導致ECS實例崩潰,原因為網卡多隊列情況下SWIOTLB內存可能不足導致內存分配失敗,您可以在控制臺將對應ECS實例關機并卸載對應彈性網卡以從啟動失敗中恢復。
如果您的實例負載涉及大量的IO通信,則可能遭遇由SWIOTLB不足導致的性能下降。您可以使用以下命令檢查此問題是否存在:
dmesg| grep 'swiotlb buffer is full'
重要錯誤配置SWIOTLB參數可能導致您的實例啟動失敗,建議您在操作前創建磁盤快照以方便在任何錯誤情況下可以安全回滾。具體操作,請參見創建快照。
如您確認該問題存在,您可以嘗試調大SWIOTLB大小以改善ECS的性能,具體操作如下:
打開/etc/default/grub文件。
vim /etc/default/grub
在GRUB_CMDLINE_LINUX字段后加入"SWIOTLB"相關參數。
例如將GRUB_CMDLINE_LINUX修改為
GRUB_CMDLINE_LINUX=".... swiotlb=524288"
以將SWIOTLB的大小修改為1 GiB。說明SWIOTLB參數取值的計算方法為:目標大小(以MiB為單位)* 512。更多信息,請參見The kernel's command-line parameters。
更新grub.cfg配置文件使上述修改生效。
grub2-mkconfig -o /boot/efi/EFI/alinux/grub.cfg