文档中心>云服务器>实践教程>构建 AMD SEV 机密计算环境

构建 AMD SEV 机密计算环境

最近更新时间:2026-02-06 17:08:41

我的收藏
AMD SEV(Secure Encrypted Virtualization,安全加密虚拟化)技术基于 CPU 内置的安全处理器(SP),实现对虚拟机内存、寄存器等运行时状态的透明加密与全方位防护,有效抵御来自宿主机的恶意篡改与数据窃取。此外,借助其基于硬件的强大密码学能力,该技术还可在虚拟机启动阶段,保障镜像的完整性。AMD SEV 技术详情请参见 AMD Secure Encrypted Virtualization (SEV)。本文为您介绍基于 AMD SEV 技术,如何构建机密虚拟机,以及在机密虚拟机内部远程证明的过程。

使用限制

实例限制:支持标准型 SA5 128核及以下实例规格开启计算加密功能。
镜像限制:支持 TencentOS Server 4镜像,且仅适用于 UEFI 启动模式,不支持传统 BIOS 模式。公共镜像启动模式介绍请参见 公共镜像启动模式说明
说明:
CPU 机密计算(AMD SEV-SNP)公测申请中,如有需要,请联系 在线支持 处理。

创建 SEV 机密计算虚拟机

1. 登录 云服务器购买页,选择满足 使用限制 的实例配置,勾选开启机密计算。其他配置信息与创建云服务器一致,详情请参见 购买方式

2. 使用 SSH 登录 Linux 实例,执行以下命令验证 SEV 功能是否开启。
dmesg -T | grep -i sev
返回如下结果,表示 SEV 功能已经开启。


远程证明

创建 SEV 机密计算虚拟机后,您可借助 AMD 推出的开源工具 snpguest,开展远程证明操作。通过这一方法,机密虚拟机的所有者能够证明其内部运行的工作负载处于完整未被篡改的状态,从而保障业务数据的安全性与可靠性。
AMD 提供的 snpguest 工具封装了 AMD SP firmware 远程证明相关的各类命令,例如获取证明报告(attestation report)等。借助该工具能够证明其运行的工作负载未遭受任何形式的篡改,保障数据安全。该工具的主要功能如下:
1. 在 SEV 机密计算虚拟机中生成远程证明报告。
2. 下载根证书和 VCEK 证书。
3. 验证远程证明报告真实性。
4. 显示报告,将二进制格式转换为可读格式。

远程证明整体流程

一次完整的工作负载证明,涉及机密计算虚拟机,snpguest 工具,AMD 安全处理器(AMD SP)和 AMD 密钥分发服务(AMD KDS)之间的协作,如下图所示。



远程证明步骤演示

生成初始信任版本的工作负载摘要

首先为您的工作负载生成摘要,并妥善保管,作为后续数据验证的依据。详情请参见 生成工作负载摘要

构建 snpguest

启动并登录 SEV 机密计算虚拟机,执行以下命令获取并编译 snpguest 工具:
说明:
执行以下命令需要安装相关工具。如未安装,可执行yum install -y cargo git
cargo build -r 依赖 rust 1.86.0, 可以使用如下命令安装:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env
rustup install 1.86.0
git clone https://github.com/virtee/snpguest.git
cd snpguest
cargo build -r
cd target/release

生成工作负载摘要

启动并登录 SEV 机密计算虚拟机,执行以下命令生成工作负载摘要:
openssl dgst -sha512 -binary path_to_user_data > userdata.sha512
其中,path_to_user_data 即需要处理的原始数据文件路径,请根据您的实际业务调整。其内容举例如下:
hexdump ./userdata.sha512
0000000 429d 1536 b4e3 3807 bf17 a8cf a059 473e
0000010 851d c548 7999 7018 13ee 1d8d 2971 52fe
0000020 b497 443a 9ffd e213 aa3c 51bc a341 bb7c
0000030 dd25 0cf8 f2e4 c4c8 4c4c 0f61 cc7c b0e0
如果需要为多份工作负载生成摘要,您可参考下图示例。假设存在三份工作负载需要进行远程证明,且包含 APP 二进制文件、环境变量文件和其他任意数据如配置信息,此时您可以为每一份数据生成一个摘要,将生成的三个摘要保存至新文件中。然后对新文件进行二次摘要计算,获取最终工作负载摘要。后续使用最终工作负载摘要进行相关的远程证明即可。


生成远程证明报告

将生成的工作负载摘要作为输入,使用 snpguest 工具生成远程证明报告(attestation report)。
./snpguest report ./report.bin ./userdata.sha512
其中,report.bin 即远程证明报告。该报告为二进制文件,文件大小1184字节,其中,签名512字节,剩余672字节为正文。正文中包含64字节的工作负载摘要。
说明:
生成工作负载摘要生成远程证明报告 步骤需要访问机密计算虚拟机中的工作负载或 AMD 安全处理器硬件,请在机密计算虚拟机中执行相关命令。后续步骤主要为验证报告,您可按需在其他环境中操作。

下载证书

使用 snpguest 工具下载根证书。其中,genoa 是处理器硬件平台模型(Platform Processor Model),您可按需调整。
./snpguest fetch ca der ./cert genoa -e vcek
使用 snpguest 工具下载 VCEK 证书:
./snpguest fetch vcek der ./cert ./report.bin --processor-model genoa
以上证书均保存至以下路径:
ls ./cert/
ark.der ask.der vcek.der

验证报告的真实性

验证下载证书的真实性:
./snpguest verify certs ./cert
返回结果如下:
The AMD ARK was self-signed!
The AMD ASK was signed by the AMD ARK!
The VCEK was signed by the AMD ASK!
验证证书签名:
./snpguest verify attestation ./cert ./report.bin --processor-model genoa
返回结果如下:
Reported TCB Boot Loader from certificate matches the attestation report.
Reported TCB TEE from certificate matches the attestation report.
Reported TCB SNP from certificate matches the attestation report.
Reported TCB Microcode from certificate matches the attestation report.
VEK signed the Attestation Report!

显示报告

由于 report.bin 是二进制格式,您可通过以下命令将其转换成可读格式。
./snpguest display report ./report.bin > report.txt
可读格式文件 cat report.txt 中的 Report Data 即为您输入的工作负载信息。
Attestation Report:
Version: 2
Guest SVN: 0
Guest Policy (0x30000):
ABI Major: 0
ABI Minor: 0
SMT Allowed: true
Migrate MA: false
Debug Allowed: false
Single Socket: false
Family ID:
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Image ID:
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
VMPL: 1
Signature Algorithm: 1
Current TCB:
TCB Version:
Microcode: 21
SNP: 21
TEE: 0
Boot Loader: 9
FMC: None
Platform Info (1):
SMT Enabled: true
TSME Enabled: false
ECC Enabled: false
RAPL Disabled: false
Ciphertext Hiding Enabled: false
Alias Check Complete: false
Key Information:
author key enabled: false
mask chip key: false
signing key: vcek
Report Data:
429d 1536 b4e3 3807 bf17 a8cf a059 473e
851d c548 7999 7018 13ee 1d8d 2971 52fe
b497 443a 9ffd e213 aa3c 51bc a341 bb7c
dd25 0cf8 f2e4 c4c8 4c4c 0f61 cc7c b0e0
......

对比 Report Data 和初始摘要

对比上述远程证明报告中的 Report Data 和初始摘要内容,如果内容一致,即工作负载没有被篡改。
报告中的摘要信息:
429d 1536 b4e3 3807 bf17 a8cf a059 473e
851d c548 7999 7018 13ee 1d8d 2971 52fe
b497 443a 9ffd e213 aa3c 51bc a341 bb7c
dd25 0cf8 f2e4 c4c8 4c4c 0f61 cc7c b0e0
初始摘要内容:
0000000 429d 1536 b4e3 3807 bf17 a8cf a059 473e
0000010 851d c548 7999 7018 13ee 1d8d 2971 52fe
0000020 b497 443a 9ffd e213 aa3c 51bc a341 bb7c
0000030 dd25 0cf8 f2e4 c4c8 4c4c 0f61 cc7c b0e0

注意事项

开启 SEV 机密计算特性相比普通虚拟机存在一定的性能损失。
资源预留规则:系统自动划分实例内存的6%(上限 1 GiB) 作为非加密 DMA 缓冲区,该区域:
不计入用户可见内存总量。
可通过内核参数动态扩容,详情请参见 动态扩容
当挂载多张多队列虚拟网卡时,缓冲池可能因初始化阶段超额申请而报错,表现为:virtio-pci 0000:02:02.0: swiotlb buffer is full (sz: 32752 bytes), total 131072 (slots), used 129952 (slots) ,对此您可通过控制台卸载故障网卡后重新启动实例。
注意:
重启期间实例将无法正常提供服务,因此在重启之前,请确保云服务器已暂停业务请求。

性能调优策略

容量监控
当实时检测缓冲池使用峰值/sys/kernel/debug/swiotlb/io_tlb_used_hiwater中的值接近/sys/kernel/debug/swiotlb/io_tlb_nslabs,请考虑通过扩容完成性能调优。

动态扩容
操作
警告:
错误配置可能导致系统启动阶段报错,请谨慎操作。
基础扩容(1GiB):
grubby --update-kernel=ALL --args=swiotlb=524288
进一步扩容(1GiB以上):目标大小以MiB为单位,且为512的整数倍。
grubby --update-kernel=ALL --args=swiotlb=4194304,any