使用 Intel TDX 在 Ubuntu 上实现机密计算

Intel Trust Domain Extensions(Intel TDX)是一项机密计算技术。它部署称为信任域(Trust Domain,TD)的硬件隔离虚拟机,将其与虚拟机管理器(VMM)、Hypervisor 以及宿主平台上的其他非 TD 软件隔离,从而抵御广泛的软件攻击。这增强了平台用户对数据安全与知识产权保护的控制,也让云服务提供商能够提供托管服务,而不必将租户数据暴露给攻击者。

Ubuntu 同时支持 Intel TDX 宿主机与客户机。客户机支持从 Ubuntu 24.04 LTS 开始,宿主机支持从 Ubuntu 25.10 开始。

支持的硬件

以下 Intel Xeon 处理器支持 Intel TDX:

处理器代号TDX 模块版本
第四代 Intel Xeon 可扩展处理器,部分支持 Intel TDX 的 SKUSapphire Rapids1.5.x
第五代 Intel Xeon 可扩展处理器Emerald Rapids1.5.x
采用 E-Core 的 Intel Xeon 6Sierra Forest1.5.x
采用 P-Core 的 Intel Xeon 6Granite Rapids2.0.x

配置宿主机

要在宿主机启用 Intel TDX,需要同时配置 BIOS 和宿主操作系统。首先,在 BIOS 中启用相关设置。

注意:以下仅为 BIOS 配置示例。不同平台所需菜单和设置可能不同,具体操作请咨询 OEM、ODM 或独立 BIOS 厂商。

进入“Socket Configuration → Processor Configuration → TME, TME-MT, TDX”,配置:

  • Memory Encryption(TME):Enable。
  • Total Memory Encryption Bypass:Enable。这是可选项,有助于获得最佳宿主系统和普通虚拟机性能。
  • Total Memory Encryption Multi-Tenant(TME-MT):Enable。
  • TME-MT memory integrity:Disable。
  • Trust Domain Extension(TDX):Enable。
  • TDX Secure Arbitration Mode Loader(SEAM Loader):Enable,允许从 ESP 或 BIOS 加载 Intel TDX Loader 和 Intel TDX Module。
  • TME-MT/TDX key split:设置为非零值。

进入“Socket Configuration → Processor Configuration → Software Guard Extension(SGX)”,将“SW Guard Extensions(SGX)”设为 Enable。保存 BIOS 设置并重启。

接着,在 /etc/default/grub 的 GRUB_CMDLINE_LINUX_DEFAULT 中添加内核参数 nohibernate kvm_intel.tdx=1,运行 sudo update-grub,然后再次重启。

重启后,确认参数已经应用:

cat /proc/cmdline 
BOOT_IMAGE=/boot/vmlinuz-6.19.0-3-generic root=UUID=f6ce4201-d6d1-4505-bdf5-019ee4fe842e ro nohibernate kvm_intel.tdx=1

然后确认 Intel TDX 已启用:

sudo dmesg | grep -i tdx
[    1.824045] virt/tdx: BIOS enabled: private KeyID range [32, 64)
[    1.824049] virt/tdx: Disable ACPI S3. Turn off Intel TDX in the BIOS to use ACPI S3.
[   24.195089] virt/tdx: 1050644 KB allocated for PAMT
[   24.195098] virt/tdx: module initialized

virt/tdx: module initialized 表示 TDX 模块确实已经初始化。

安装虚拟化组件

接下来安装运行 TD 所需的虚拟化组件:

sudo apt update
sudo apt install \
>   qemu-system-x86 \
>   ovmf-inteltdx \
>   libvirt-daemon-system \
>   libvirt-clients

这些软件包分别是:

  • qemu-system-x86:支持 Intel TDX 的 x86_64 QEMU 模拟器。
  • ovmf-inteltdx:包含支持 Intel TDX 的 OVMF 构建的 EDK II UEFI 固件。
  • libvirt-daemon-system:用于管理虚拟机的 libvirt 守护进程。
  • libvirt-clients:virsh 等 libvirt 命令行工具。

安装后,确认支持 Intel TDX 的 OVMF 固件存在:

ls -l /usr/share/ovmf/OVMF.inteltdx.ms.fd
-rw-r--r-- 1 root root 4194304 Jan 15 12:00 /usr/share/ovmf/OVMF.inteltdx.ms.fd

创建客户机镜像

下载云镜像,本例使用 Ubuntu 26.04 LTS:

wget https://cloud-images.ubuntu.com/resolute/current/resolute-server-cloudimg-amd64.img

安装所需工具:

sudo apt install cloud-image-utils

创建 cloud-init 配置文件:

cat > user-data.yaml << 'EOF'
> #cloud-config
> chpasswd:
>   list: |
>     root:root
>   expire: False
> ssh_pwauth: True
> disable_root: false
> EOF

使用该文件生成 cloud-init ISO:

cloud-localds user-data.img user-data.yaml

生成的 user-data.img 将挂载到虚拟机,用于应用配置。

注意:生产环境必须使用强密码,并配置基于 SSH 密钥的身份验证,不要使用密码身份验证。

使用 QEMU 启动 TD 客户机

准备好镜像后,可以通过 QEMU 启动 TD:

qemu-system-x86_64 \
>   -accel kvm \
>   -smp 32 \
>   -m 16G \
>   -cpu host \
>   -object '{"qom-type":"tdx-guest","id":"tdx","quote-generation-socket":{"type": "vsock", "cid":"2","port":"4050"}}' \
>   -object memory-backend-ram,id=mem0,size=16G \
>   -machine q35,kernel_irqchip=split,confidential-guest-support=tdx,memory-backend=mem0 \
>   -bios /usr/share/ovmf/OVMF.inteltdx.ms.fd \
>   -nographic \
>   -nodefaults \
>   -vga none \
>   -drive file=resolute-server-cloudimg-amd64.img,if=none,id=virtio-disk0 \
>   -device virtio-blk-pci,drive=virtio-disk0 \
>   -drive file=user-data.img,if=none,id=cloud-init,format=raw \
>   -device virtio-blk-pci,drive=cloud-init \
>   -serial stdio

关键的 Intel TDX 参数包括:

  • -object '{"qom-type":"tdx-guest","id":"tdx",...}':创建 TDX 客户机对象,启用机密计算能力。quote-generation-socket 配置生成远程证明报告的 vsock 通道,CID 为 2,端口为 4050。
  • -machine q35,kernel_irqchip=split,confidential-guest-support=tdx,memory-backend=mem0:其中 kernel_irqchip=split 用于正确隔离宿主机与客户机的中断处理;confidential-guest-support=tdx 将机器关联到 TDX 对象;memory-backend=mem0 关联受 TDX 保护的内存后端。
  • -object memory-backend-ram,id=mem0,size=16G:定义将由 Intel TDX 加密的内存后端。
  • -bios /usr/share/ovmf/OVMF.inteltdx.ms.fd:指定支持 TDX 且带 Microsoft Secure Boot 密钥的 UEFI 固件。
  • -cpu host:使用宿主 CPU 模型,向客户机暴露 Intel TDX 能力。

这些参数的进一步说明见 QEMU 文档。

在客户机内确认 Intel TDX 已启用

TD 启动后,检查内核日志:

sudo dmesg | grep tdx
[    0.000000] tdx: Guest detected
[   11.162378] systemd[1]: Detected confidential virtualization tdx.

也可以查看 Intel TDX 客户机设备:

ls -l /dev/tdx_guest
crw------- 1 root root 10, 125 Jan  1 00:00 /dev/tdx_guest

使用 libvirt 启动 TDX 虚拟机

libvirt 可以管理 Intel TDX 虚拟机。需要修改域定义,加入机密虚拟机所需的信息。下面是一个域定义示例:

cat > tdx-vm.xml << 'EOF'
> <domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
>   <name>tdx-guest</name>
>   <memory unit='GiB'>16</memory>
>   <memoryBacking>
>     <source type="anonymous"/>
>     <access mode="private"/>
>   </memoryBacking>
>   <vcpu placement="static">16</vcpu>
>   <os>
>     <type arch='x86_64' machine='q35'>hvm</type>
>     <loader type='rom' readonly='yes'>/usr/share/ovmf/OVMF.inteltdx.ms.fd</loader>
>     <boot dev='hd'/>
>   </os>
>   <features>
>     <acpi/>
>     <apic/>
>     <ioapic driver='qemu'/>
>   </features>
>   <clock offset='utc'>
>     <timer name='hpet' present='no'/>
>   </clock>
>   <cpu mode='host-passthrough'>
>     <topology sockets='1' cores='16' threads='1'/>
>   </cpu>
>   <devices>
>     <emulator>/usr/bin/qemu-system-x86_64</emulator>
>     <disk type="file" device="disk">
>       <driver name="qemu" type="qcow2"/>
>       <source file="/var/lib/libvirt/images/resolute-server-cloudimg-amd64.img"/>
>       <target dev="vda" bus="virtio"/>
>     </disk>
>     <console type='pty'>
>       <target type='virtio' port='1'/>
>     </console>
>   </devices>
>   <launchSecurity type='tdx'>
>     <policy>0x10000000</policy>
>     <quoteGenerationService>
>       <SocketAddress type='vsock' cid='2' port='4050'/>
>     </quoteGenerationService>
>   </launchSecurity>
> </domain>
> EOF

定义虚拟机:

sudo virsh define tdx-vm.xml

启动虚拟机:

sudo virsh start tdx-guest

连接控制台:

sudo virsh console tdx-guest

原文列出的关键 libvirt 配置项如下:

  • <launchSecurity type='tdx'>:为虚拟机启用 TDX 机密计算。
  • <policy>0x10000001</policy>:控制调试和其他 TD 特性的 TDX 策略。
  • <quote-generation-service>:配置远程证明的 vsock 通道。
  • <memoryBacking>:原文说明其使用 TDX 所需的 memfd 后端共享内存。
  • <loader>:指定支持 TDX 的 OVMF 固件。

管理虚拟机

列出全部虚拟机:

sudo virsh list --all

关闭虚拟机:

sudo virsh shutdown tdx-guest

强制停止虚拟机:

sudo virsh destroy tdx-guest

删除虚拟机定义:

sudo virsh undefine tdx-guest

Intel TDX 故障排查

宿主机没有启用 Intel TDX

确认 BIOS 设置正确,内核参数已经启用,然后检查以下 MSR。

安装 MSR 工具包:

sudo apt install msr-tools

检查 MSR 0x982 的第 1 位,确认多密钥全内存加密(MK-TME)已启用:

sudo rdmsr 0x982 -f 1:1 1

预期值 1 表示 BIOS 已启用 MK-TME。

检查 MSR 0x1401 第 11 位,即 SEAMRR(SEAM 范围寄存器)的启用位,确认 TDX 支持:

sudo rdmsr 0x1401 -f 11:11 1

预期值 1 表示 SEAMRR 已启用。

检查 IA32_TME_CAPABILITY MSR 的第 63:32 位,确认分配给 TD 的私有密钥数量:

echo $((0x$(sudo rdmsr 0x87 -f 63:32)))

输出以十进制显示可供信任域使用的私有密钥数量 NUM_TDX_PRIV_KEYS。非零表示已经为 Intel TDX 分配密钥。

原文再次列出了同一项检查:

echo $((0x$(sudo rdmsr 0x87 -f 63:32)))

同样,非零的十进制结果表示已为信任域分配私有密钥。

检查 Intel SGX 与 MCHECK 状态:

sudo rdmsr 0xa0

预期值 1 表示已启用。值为 1861 时,SGX 注册 UEFI 变量可能损坏。进入 BIOS,将“SGX Factory Reset”设为 Enable,这会产生两个新密钥。

dmesg 报告 module initialization failed (-5)

如果 sudo dmesg | grep -i tdx 显示 virt/tdx: module initialization failed (-5),可能使用了旧的、不受支持的 Intel TDX 模块。尝试更新到最新模块。

注意:如果选择通过二进制部署更新 Intel TDX Module,必须使用与硬件相匹配的模块版本,参见前面的硬件支持表。

重启 TD 时却关机了

传统的非 TDX 客户机可以通过重置 vCPU 上下文重启,但 TD 客户机出于安全原因不允许这样做。必须先关闭,再重新启动。


原文:Confidential Computing with Intel Trust Domain Extensions (TDX)。作者/维护者:Canonical Ubuntu Server 文档贡献者。本文为原文的中文译文;代码保留原文内容。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容