本文介绍如何在基于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(北京)地域中的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
回显类似如下所示(部分字段被省略)。
[ { "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" } } } ] } } ]
说明为简单起见,您可以检查
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
也会体现在远程证明的验证结果中,您可以使用该值进行密钥交换等业务逻辑的实现。./verifier -quote <path_to_quote> |./relying_party -v -a|grep "json payload" |awk -F 'payload:' '{print $2}'|jq '.. | .tdx_reportdata? | select(. != null)'
已知功能限制
开启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