SSD Nodes Learn Hosting plans →
指南 Matt Connor作者: Matt Connor

VPS 机密计算:AMD SEV-SNP 与 Intel TDX

普通 VPS 的主机可读取来宾内存。了解 AMD SEV-SNP 和 Intel TDX 如何改变这一点、远程证明能证明什么,以及如何检查您租用的服务器是否支持。

VPS 上的机密计算实际意味着什么

VPS 上的机密计算是指,处理器使用虚拟机监控程序永远无法获取的密钥加密虚拟机内存。因此,物理服务器的运营方无法读取服务器正在处理的数据。如今销售的 VPS 几乎没有采用这种方式。对于普通 VPS,提供商的虚拟机监控程序可以读取客户机内存中的每个字节;而加密磁盘并不能改变这一点。

公开发布的指南面向两类用户,VPS 租户不属于其中任何一类。Canonical 的机密计算资料要么介绍如何在云服务商平台上启动镜像(例如特定的 Azure 规格或 Google Confidential VM),要么介绍如何将自有硬件配置为机密虚拟机主机。这两类资料都假定你是云服务商,或是主机运营方。它们都没有说明:租用 4 GB VPS 的用户,能否在自己已经付费使用的服务器上获得这项能力。应先明确威胁模型,因为所有实际结论都取决于此。

谁现在可以读取您的 VPS 内存

您的 VPS 是一个来宾系统。其他组件负责创建它、为其分配内存,并将其调度到物理核心上。大多数 Linux VPS 托管服务使用 KVM。此时,来宾系统的 RAM 是主机上 QEMU 进程持有的普通匿名内存。主机上的 root 用户可以像读取其他进程一样读取该进程的内存,可以通过 /proc/<pid>/mem 完成,也可以使用 virsh dump 将来宾系统的完整内存映像写入文件。您的虚拟机内部无法阻止这种操作,也无法检测这种操作,因为执行读取的一方控制着负责进行检测的那一层。

这不是某个服务提供商的缺陷,而是虚拟化的工作方式。管理程序的职责是管理来宾系统的内存,因此它能够读取该内存是这一设计的直接结果。这也是 VPS 托管是否适合真实工作负载 取决于运营方的操作规范和员工访问控制,而不是技术本身的原因:单靠技术无法限制运营方。基于容器的套餐隔离性更弱,因为 LXC 或 OpenVZ 来宾系统与主机共享内核,主机无需生成内存转储即可读取您的进程。在比较价格之前,应当理解这一差异;KVM、Xen 和 LXC 虚拟化之间的区别 就在于此。

为什么全盘加密无法解决这个问题

VPS 上使用全盘加密仍然有价值,但它无法解决这里的问题。LUKS(Linux unified key setup)在数据块写入磁盘时对其加密,在读取时对其解密。为此,只要卷处于挂载状态,卷密钥就必须一直保留在内核内存中。因此,密钥在内存中,传输中的明文数据也在内存中,而内存正是主机可以读取的内容。

静态数据加密确实能提供实际保护:离开机房的磁盘仍然无法读取。返还给供应商的故障磁盘受到保护。有人遗忘的已分离备份卷也受到保护。这些风险不同于运行中的主机读取运行中的 guest,但它们都被归在“加密”这个词下。因此,“我们的所有存储都已加密”虽然是真实表述,却回答了另一个问题。

租用机器还存在第二个特有陷阱。加密根文件系统后,每次启动都必须由某个组件提供口令。将口令存放在同一台机器上,例如存放在 keyfile 或未加密的 initramfs 中,主机就可以读取它。将口令输入由供应商控制的控制台,主机同样可以读取它。启动时从其他位置获取口令,只是转移了信任,并没有消除信任,因为提供密钥的服务现在必须确认发起请求的机器确实是你认为的那台机器。最后这个要求正是 attestation 要解决的问题。

AMD SEV-SNP 和 Intel TDX 实际实现了什么

这是两件不同的事。将它们区分开,是理解这一主题的关键:内存加密和远程证明。

先看内存加密。AMD SEV-SNP(Secure Encrypted Virtualization with Secure Nested Paging)为每个来宾分配独立的内存加密密钥。密钥存储在 AMD Secure Processor 中。它是同一芯片上的独立核心,虚拟机管理程序无法看到该密钥。内存控制器只为密钥所属的来宾在写入时加密、读取时解密。主机仍然可以转储这段内存,但得到的内容是密文。

Intel TDX(Trust Domain Extensions)通过另一种方式实现相同的结果。来宾会变成一个信任域,其内存会关联一个私有密钥标识符。所有进出信任域的转换都由 TDX module 监管。TDX module 是一段由 Intel 签名的代码,运行在虚拟机管理程序无法进入的处理器模式中。从租户的角度看,结果相同:虚拟机管理程序可以分配你的内存并调度你的 CPU,但无法读取你的内存。

SEV-SNP 中的 SNP 部分经常被忽略,但它承担了关键作用。加密可以阻止主机读取页面,但不能阻止主机移动页面。能够重新映射来宾物理页面的虚拟机管理程序可以重放旧内容、让两个来宾地址指向同一个页面,或返回一个此前被换出的页面。这些操作都可以在不解密任何内容的情况下构成有效攻击。SNP 添加了 Reverse Map Table。CPU 在访问内存时会查询该结构,以记录每个页面属于哪个来宾。未经来宾请求的重新映射会触发错误,而不会成功执行。TDX 也有对应的机制。没有这一完整性层,你只能防御被动主机,无法防御主动主机。

两者都不会改变这一点:主机仍然可以启动你的 VM、停止它、决定何时为它分配 CPU 核心,也可以直接丢弃它。机密计算可以保护机密性和完整性,但可用性和性能仍完全由主机控制。因此,嘈杂邻居导致的 CPU steal time 不会受到任何影响。

远程证明如何证明仅加密无法证明的事实

仅靠加密仍会留下一个漏洞。您向云服务商申请机密虚拟机,对方提供了一台虚拟机。您如何确认内存加密已启用?您无法通过询问虚拟机来确认,因为虚拟机对整个系统的认知都由 hypervisor 提供,而您要检查的正是 hypervisor。不诚实的主机,或配置错误的主机,可以向您提供一台完全普通的虚拟机;您在其中运行的每条命令,都是由您不信任的那一层返回结果。

远程证明可以闭合这个验证链路。CPU 本身会生成一份带签名的报告。在 SEV-SNP 中,报告由该物理芯片专属的密钥签名,并由 AMD 自己的证书链认证。您从 AMD 获取这条证书链,而不是从云服务商获取。TDX 会生成一份由 Intel 签发的证明密钥支持的 quote。报告包含启动度量值,即虚拟机启动时所用完整内存的哈希,其中包括固件、内核、initrd 和内核命令行。您在机器外部,根据芯片厂商的根证书验证签名,再将该度量值与预期启动内容进行比对。

直接说明它的作用。远程证明让不在这台机器上的一方能够决定是否信任这台机器。它之所以有用,是因为可以根据证明结果释放机密:数据库密码和解密密钥根本不会存放在镜像中,而是由其他位置的服务保存。该服务只有在检查新鲜报告并确认其中包含预期度量值后,才会将这些机密交给虚拟机。如果主机启动了被修改的内核,或在完全未启用 SEV-SNP 的情况下运行虚拟机,度量值就会改变,或者无法生成有效报告,机密也就不会被释放。没有远程证明的加密,只能保护数据免受您已经选择信任的主机攻击。远程证明让您不必再预先选择信任对象。

相关工具是开放的,您可以阅读其代码。snpguest命令行工具会在 AMD guest 内部与 /dev/sev-guest设备通信,请求报告,并根据证书链验证报告。平台细节在这里很重要:在 Azure 机密虚拟机上,该设备通常不会以这种方式暴露给 guest,因此工具需要使用不同的构建版本和不同的标志。远程证明已经可以工作,但目前还不能在所有平台上以完全相同的方式工作。

机密计算无法防护的内容

遭入侵的来宾系统。 SEV-SNP 可保护 VM 免受外部攻击,但无法处理已经进入 VM 的攻击者,因为对 CPU 而言,该攻击者就是你自己。未打补丁的 Web 应用,或逃逸容器并进入你自己的内核,在机密 VM 上同样有效。此时,加密反而也在为入侵者提供保护,因为主机同样无法检查这部分内存来帮助你。RAM 已加密,并不会让 VPS 遭入侵后的恢复变得更容易。

你自己的应用。 保护边界止于 VM 边缘。代码写入日志文件,或发送到第三方 API 的数据,已经离开了 TEE(受信执行环境),这是受保护区域的名称。加密内存不会审计你的代码。

被盗用的凭据。 证明报告会说明启动了哪些软件,但不会说明之后是谁登录。泄露的 SSH 密钥可以像打开其他 VM 一样快速地进入机密 VM,因此对几乎所有读者来说,加固 VPS 的 SSH 访问仍然是更有价值的工作。

所有不属于内存的内容。 SEV-SNP 和 TDX 会加密 RAM。虚拟磁盘、网络流量、快照和备份不在保护范围内,除非你自行加密。在超大规模云厂商提供的机密 VM 产品中,OS 磁盘由独立机制处理,并使用独立的密钥管理,正是因为 CPU 功能无法覆盖磁盘。

物理攻击,这是最棘手的一类。 多项已发表的研究表明,内存总线是一个薄弱边界。BadRAM(CVE-2024-21944,2024)篡改内存模块上的 SPD 芯片,使 CPU 将物理地址视为别名地址,所需零件成本约为十美元。Battering RAM(2025)在 CPU 与 DDR4 内存之间安装了一个成本低于五十美元的中间设备,并绕过了为应对此类问题而加入的启动时地址别名检查。TEE.fail(2025)将这一思路扩展到 DDR5,并报告称可以从已完全更新的 Intel TDX 和 AMD SEV-SNP 服务器中提取秘密密钥,其中包括证明密钥。DDRop(于 September 2026 披露)使用成本低于两百美元的 DDR5 中间设备,使内存写入静默丢失;在 Intel TDX 上,研究人员伪造了证明报告;在 SEV-SNP 上,他们复制了受害者页面的内容。确定性内存加密也会造成影响:相同地址上的相同明文会产生相同密文,学术研究已将这一特性单独转化为侧信道。上述每一种攻击都需要对机器进行物理访问,即使只需短暂接触。注意这意味着什么。 其中两种攻击甚至影响了证明机制本身,因此来自一台曾被他人接触过的机器的报告,其证据强度低于表面看起来的程度。机密计算将主机读取内存的方式,从执行一条命令变为需要硬件、物理访问和实际操作。这确实是重大改进,但其保护范围小于“主机无法读取内存”这一说法。

今天可以买到支持机密计算的 VPS 吗

机密 VM 主要由超大规模云服务商提供,但现在已不再局限于此。Microsoft Azure 提供 SEV-SNP 规格和 TDX 规格。Google Cloud 提供 Confidential VM。AWS 在三个实例系列(m6a、c6a 和 r6a)中提供 AmdSevSnp CPU 选项:共享租户仅在美国东部(俄亥俄)和欧洲(爱尔兰)可用,Dedicated Host 则可在任何商业区域使用。超大规模云服务商之外,提供此功能的厂商不多,但确实存在。VPSBG 于 2025 年 4 月 1 日宣布其云服务器支持 SEV-SNP;截至 2026 年 10 月 12 日,其网站显示 Cloud VPS 和 VDS 产品线均支持 SEV-SNP,并可在来宾系统内部手动执行远程证明。IONOS Cloud 提供基于 SEV-SNP 硬件的 Confidential VM 产品,目前仅在其法兰克福(de/fra/2)数据中心提供,并按硬件配置定价。大多数独立 VPS 主机商仍未列出此功能,因此最稳妥的做法是直接询问,不要自行假定。

这些限制由基础架构决定。了解原因后,你就能正确解读服务商的回复。

  • 硅片要求特定。SEV-SNP 需要第三代 AMD EPYC 或更新型号,TDX 需要较新的 Intel Xeon Scalable。按每核心成本分多年采购的服务器集群通常包含不同硬件,因此该功能可能只在部分节点上可用。
  • 主机软件版本较新。Ubuntu 从 24.04 LTS 开始支持 SEV-SNP 来宾系统,而主机端支持(包括 QEMU 和 OVMF 固件支持)要到 25.04 才加入。这比稳定托管平台通常运行的软件栈更新。
  • 实时迁移更复杂。在主机之间迁移运行中的来宾系统时,需要复制其内存,而主机无法读取这些内存。服务商依靠实时迁移在维护前疏散节点,因此失去该能力会改变整个云平台的运维方式。
  • 部署密度会降低。单台主机可同时运行的机密来宾系统数量受硬件限制,远低于大型节点可承载的普通来宾系统数量。低价 VPS 依赖这种部署密度。
  • 远程证明会增加持续的支持负担。除非租户能够获取证书链,并知道应验证哪些度量值,否则远程证明报告没有实际价值。因此,服务商必须发布并维护相关信息,而每次固件更新都可能导致这些信息变化。

这些并不是对任何服务商的抱怨,而是说明该功能目前为何处于这种状态。

如何询问主机是否支持 SEV-SNP 或 TDX

技术支持部门通常只会回答您提出的问题,而模糊的问题往往会得到一个令人宽心但毫无意义的答复。如果您询问数据是否加密,对方会回答所有存储在静态时均已加密;这虽然属实,但指的是磁盘。请务必询问具体细节。以下五个问题建议按原样发送。

  1. 你们是否提供启用了 AMD SEV-SNP 或 Intel TDX 的客户机实例?具体适用于哪些套餐?
  2. 该功能是在创建实例时手动选择,还是主机本身固有的属性,且无法由我选择?
  3. 我能否在客户机内部获取硬件认证报告?系统中是否存在 /dev/sev-guest?
  4. 你们是否提供或透传验证该报告所需的 CPU 厂商证书链?
  5. 该功能支持哪些区域和主机代际?它是否会限制实例的调整大小或迁移?

请按以下方式解读回复。若第 1 个问题回答“是”,但第 3 和第 4 个问题回答“否”,则意味着您拥有的内存加密无法验证。这对于防范二手内存模块有一定作用,但对于防范主机商作用甚微,因为您是在信任运营商关于某项功能的承诺,而该功能的目的恰恰是消除对运营商的信任需求。如果回复内容涉及合规性或泛泛的加密说明,则视为否定。对于第 5 个问题保持沉默,通常意味着该功能可能仅限于特定区域的某个实例系列。

在价格和实例选择方面,预计可选项会较少,而非简单的加价。机密计算实例往往形成一个独立的系列,其规格和可用区域较少,真正的成本通常在于这种限制,而非每小时费率。请按您实际运行的具体规格进行定价。

如何检查您现有的 VPS

以下命令在客户机内部运行,耗时约 1 分钟。请将输出结果视为强有力的提示而非最终证明,因为客户机所见的一切均由虚拟机管理程序(hypervisor)中转。

systemd-detect-virt
systemd-detect-virt --cvm

第一个命令打印内核检测到的虚拟化技术。第二个命令报告机密虚拟机技术,其值包括 sev、 sev-es、 sev-snp 和 tdx。--cvm 属于较新的选项,如果您的系统无法识别,请先运行 systemctl --version。

sudo dmesg | grep -i -E 'sev|tdx|memory encryption'
sudo journalctl -k | grep -i -E 'sev|tdx|memory encryption'

运行 AMD 内存加密的客户机在启动时会打印以 Memory Encryption Features active: 开头的启动行,随后列出所使用的技术。信任域(Trust Domain)在早期启动阶段会打印其特有的 TDX 行。同时也请运行 journalctl 命令,因为对于长期运行的服务器,dmesg 环形缓冲区可能已经循环覆盖,导致启动信息丢失。

grep -m1 ^flags /proc/cpuinfo | tr ' ' '\n' | grep -i -E 'sev|tdx'
ls -l /dev/sev-guest /dev/tdx-guest

请谨慎对待 CPU 标志。/proc/cpuinfo 显示的是虚拟机管理程序选择呈现的 CPU 型号,因此 sev 标志可能仅代表底层芯片支持该功能,而您的虚拟机并未实际使用。tdx_guest 是更直接的信号,因为该标志描述的是客户机本身。设备文件是认证工具所必需的,AMD 上为 /dev/sev-guest,Intel 上为 TDX 客户机设备;如果不存在该文件,ls 会直接报告。在某些平台上,即使虚拟机是机密的,该设备也会被故意对客户机隐藏,因此该检查仅用于确认,而非反驳。

如果这些命令都没有发现任何信息,则您的服务器对该功能的回答为否。这在普通 VPS 托管中是预期结果,并不代表系统存在故障。

不行时该怎么做

答案确实会是不行。正确做法不是放弃这个问题,而是降低解决它所需付出的代价。几个习惯就能解决大部分问题,而且都不需要特殊硬件。

在本机加密离开本机的数据。 备份最重要。restic 和 age 等工具会在客户端加密数据,然后才将数据发送到目标位置,因此存储提供商只能保存密文,无法接触密钥。自有服务器之间的流量也应使用 TLS(传输层安全),包括通过提供商的私有网络传输的流量,因为私有网络仍然是由他人管理的网络。

不要将密钥放进镜像或 git。 写入 VM 镜像或提交到仓库的密钥,任何能读取其中任一项的人都可以获取;这类人员远多于负责运行 hypervisor 的人员。应将密钥存放在加密存储中,并在部署时解密。使用 Ansible Vault 加密密钥是配置成本较低的方案,足以满足大多数小型服务器集群的需求。

限制每台服务器所能访问的资源。 这是最能改变结果的习惯。设想攻击者读取了这台机器的全部内存后,能够获取什么。如果其中包括一个可以解密十年客户记录的密钥,那么 hypervisor 只是问题中较小的一部分:这个密钥正存放在面向公网的 Web 服务器上。为每台服务器配置仅能完成其工作所需的最小权限凭据,并设置较短的有效期和经过演练的轮换流程。这样,读取某台主机内存的后果,就只会暴露该主机原本能够执行的操作。

不要将无法轮换的密钥放在 VPS 上。 密钥轮换是能够在实际环境中持续生效的控制措施。本页的其他内容都假设你最终会发现问题。发现问题后,真正需要执行的就是密钥轮换。

修复真正正在攻击你的问题。 对几乎所有读者而言,导致服务器被入侵的现实路径是未打补丁的服务或被窃取的凭据,而不是数据中心的工程师读取 RAM。检查服务器是否存在已知 CVE以及Ubuntu Pro 如何扩展服务器的补丁覆盖范围,比任何 CPU 功能都更能降低风险。在新机器上执行新 VPS 上线后的前十分钟中的操作,是你能完成的成本最低的安全工作。

如果确实有一个工作负载需要硬件信任边界,就只为这个工作负载提供该边界。将这部分运行在提供商提供的机密 VM 上,或运行在你控制的硬件上,其余部分继续留在成本更低的环境中。按敏感性拆分系统是常见的架构方式,而且今天几乎可以在任何主机上实施;机密 VPS 则未必如此。

FAQ

我的 VPS 提供商能读取服务器内存吗?

在普通 VPS 托管中,可以。虚拟机监控程序负责分配和映射来宾系统的 RAM,因此主机上的 root 用户可以读取这些内存,例如通过 /proc/<pid>/mem 中的 QEMU 进程读取,或将来宾系统的内存转储到文件中。来宾系统内部无法阻止或检测此操作。AMD SEV-SNP 和 Intel TDX 可用于消除这种能力,但大多数 VPS 套餐并不提供这些功能。在普通 VPS 上,限制提供商访问权限的主要是提供商自身的控制措施和员工政策,而不是技术本身。

全磁盘加密能保护 VPS 数据不被托管提供商读取吗?

服务器运行时不能。文件系统要保持可读,卷密钥就必须留在内核内存中,因此密钥和经过解密处理的数据都会存在于主机可以读取的内存中。磁盘加密可以保护静态数据,例如故障后返还给供应商的磁盘,或已分离但被遗忘的备份卷。这些风险值得防护,但它们不同于运行中的主机读取运行中的来宾系统这一风险。

如何检查 VPS 是否使用 AMD SEV-SNP 或 Intel TDX?

在来宾系统中运行 systemd-detect-virt --cvm,然后运行 sudo dmesg | grep -i -E 'sev|tdx' 和 ls -l /dev/sev-guest。启用了 AMD 内存加密的来宾系统会输出以 Memory Encryption Features active: 开头的启动行;Intel 信任域会在 /proc/cpuinfo 中包含 tdx_guest 标志。所有这些结果都由虚拟机监控程序传递给你,因此只能作为参考。唯一的证明是经过签名的证明报告,并且你需要在机器外部根据 CPU 厂商的证书链验证该报告。

证明在内存加密之上增加了什么?

它证明加密确实处于启用状态,并且机器启动了你预期的软件。无法验证的内存加密,仍然要求你相信运营方的说法。证明报告由 CPU 签名,包含虚拟机初始内存的度量值,其中涵盖固件、内核、initrd 和内核命令行;同时,报告会在机器外部根据芯片厂商的根证书进行验证。这样才能实现值得采用的模式:只有在报告验证通过后,才将其他位置保存的机密信息释放给虚拟机。

为机密计算支付额外费用值得吗?

这取决于基础设施运营方是否属于你的威胁模型。对于受监管数据,或用于保护他人数据的密钥,这是唯一可用的技术方案;与其他选择相比,超大规模云厂商的机密计算实例价格并不高。对于个人网站或小型服务,将同样的资金用于打补丁和凭据管理,通常能获得更高的安全性。在购买具备这些硬件功能的设备前,应先如实判断你运行的是什么。