跳到内容
documentation.suse.com / AMD 安全加密虚拟化 (AMD-SEV) 指南
SUSE Linux Enterprise Server 15 SP4

AMD 安全加密虚拟化 (AMD-SEV) 指南

出版日期: 2025 年 3 月 20 日

AMD 的安全加密虚拟化 (SEV) 可让您加密虚拟机的内存。SEV with Encrypted State (SEV-ES) 更进一步,能够加密虚拟机的 CPU 寄存器内容。这些技术提高了系统安全性,非常适合云计算等多租户环境。它们可以防范各种跨 VM 和基于超级管理程序的攻击。举例来说,某个恶意 VM 即使逃脱了超级管理程序强制实施的限制,能够读取任意内存,它仍无法从 SEV 或 SEV-ES VM 窃取敏感数据。

本文旨在提供 SEV 和 SEV-ES 的工作原理以及如何启用和配置这些功能的基本知识。文中还涉及了与非加密虚拟化相比使用 SEV 和 SEV-ES 的一些限制。

1 SEV 简介

对磁盘上储存的计算机数据进行加密这项功能已得到广泛部署,但 RAM 中储存的数据并未加密。这可能会导致这些数据暴露给通过软件或硬件嗅探入侵主机系统的攻击者,在有许多租户共享物理资源的云计算环境中更是如此。假设某个恶意租户的虚拟机利用超级管理程序 Bug 逃离了沙箱,并在内存中搜索敏感数据。

AMD 的 SEV(安全加密虚拟化)技术通过独有的密钥以透明方式加密每个 VM 的内存,可以保护 Linux KVM 虚拟机。SEV 还可计算出内存内容的签名,该签名可发送给 VM 的所有者,作为固件已正确加密内存的证明。SEV 特别适用于云计算环境,在此环境中,VM 托管在远程服务器上,并不在 VM 所有者的控制之下。SEV 可以减少需要置于超级管理程序及其主机系统管理员控制之下的可信 VM 的数量。

当虚拟机正在处理敏感数据时,它可以存在于 CPU 寄存器以及内存中。如果处理出于某种原因(例如需要提供中断或与其他进程共享时间)而停止,虚拟机的 CPU 寄存器内容将会保存到超级管理程序内存中。超级管理程序可以读取此内存,即使启用了 SEV 也是如此。SEV-ES 可以防范这种情况,它会在虚拟机的处理停止时对所有 CPU 寄存器内容进行加密。SEV-ES 在 SEV 的基础上构建而成,能够为在多租户环境中运行的虚拟机缩小受攻击面。

2 VM 主机要求

VM 主机硬件必须支持 AMD 的 SEV 技术。要检测主机硬件是否支持 SEV,请检查 libvirt 的功能中是否包含 sev 属性,并且该属性的值是否设置恰当:

<domainCapabilities>
   ...
   <features>
   ...
   <sev supported='yes'/>
   ...
   </sev>
   </features>
</domainCapabilities>

此外,请确保已为 kvm_amd 内核模块启用 sev 参数:

/sys/module/kvm_amd/parameters/sev = 1

3 VM 要求

VM 必须为新型 Q35 计算机类型且必须使用 UEFI 固件。可以让 libvirt 自动选择启用了 SEV 或 SEV-ES 的适当 UEFI 固件,也可以手动指定。目前仅支持 /usr/share/qemu/ovmf-x86_64-code.bin/usr/share/qemu/ovmf-x86_64-4m-code.bin 固件。有关如何使用 UEFI 固件以及自动选择功能的更多细节,请参见Book “虚拟化指南”, Chapter 6 “安装虚拟化组件”, Section 6.3 “安装 UEFI 支持”

注意
注意:Q35 中无 IDE 支持

Q35 计算机类型没有 IDE 控制器,不支持 IDE 磁盘。

所有 virtio-net 设备都需要配置为禁用 iPXE 选项 ROM。iPXE 目前与 SEV 和 SEV-ES 不兼容。此外,必须锁定对 VM 使用的所有内存区域的直接内存访问 (DMA),以防发生交换。其中包括 VM 的内存以及 QEMU 为支持 VM 运行而分配的任何内存区域,例如用于固件和变量储存的 UEFI pflash,视频 RAM 等。

4 VM 配置

例 1︰ 示例配置文件

例如,配置了 4 GB 内存的 SEV 加密 VM 将包含以下 XML 配置:

<domain type='kvm'>
    <memory unit='KiB'>4194304</memory>
    <currentMemory unit='KiB'>4194304</currentMemory>
    <memoryBacking>
    <locked/> 1
    </memoryBacking>
    <os>
    <type arch='x86_64' machine='pc-q35-2.11'>hvm</type>
    <loader readonly='yes' type='pflash'>/usr/share/qemu/ovmf-x86_64-ms-4m-code.bin</loader>
    <nvram>/var/lib/libvirt/qemu/nvram/sles15-sev-guest_VARS.fd</nvram>
    <boot dev='hd'/>
    </os>
    <launchSecurity 2 type='sev'>
    <cbitpos>47</cbitpos> 3
    <reducedPhysBits>1</reducedPhysBits> 4
    <policy>0x0033</policy> 5
    <dhCert>AAAABBBB=CCCCCDDDDD</dhCert> 6
    <session>AAAABBBB=EEEEEFFFFF</session> 7
    </launchSecurity>
    <devices>
    <interface type='bridge'>
    <source bridge='br0'/>
    <model type='virtio'/>
    <rom enabled='no'/> 8
    </interface>
    ...
    </devices>
    ...
    </domain>

1

使用 memoryBacking 元素及其子元素 locking 来放宽 libvirt 对 VM 的 cgroup 施加的内存限制。如果不这样做,当 QEMU 尝试锁定 VM 的内存区域以及用于支持 VM 操作的其他区域时,VM 创建将会失败。如需详细了解 SEV VM 的 VM 内存配置要求,请访问 https://libvirt.org/kbase/launch_security_sev.html#memory

2

launchSecurity type='sev' 元素及其内容用于启用 VM 内存内容加密。

3

启用内存加密后,如果某个内存页受保护,会使用其中一个物理地址位(也称为 C 位)进行标记。必要元素 cbitpos 提供 Guest 页表项中 C 位的位置。例如,值 47 表示页表项中的第 47 位将决定该页是否加密。C 位数字从主机的 CPUID 读取,因此与硬件相关。cbitpos 的值与超级管理程序相关,可从域功能中的 sev 元素获取。

4

启用内存加密后,我们会丢失物理地址空间的某些位。必要元素 reducedPhysBits 提供此物理地址位缩减。与 cbitpos 类似,reducedPhysBits 的值与处理器系列相关,可从域功能中的 sev 元素获取。

5

必要元素 policy 提供必须由 SEV 固件维护的 Guest 策略。此策略由固件强制实施,用于限制在 VM 上可由超级管理程序执行的配置和操作命令。启动 VM 时提供的 Guest 策略与该 VM 绑定在一起,且在其整个生命周期都无法更改。

6

可选元素 dhCert 提供 Guest 所有者的 base64 编码 Diffie-Hellman (DH) 密钥。该密钥用于在 SEV 固件与 Guest 所有者之间协商主机密密钥。此主机密密钥之后会用于在 SEV 固件与 Guest 所有者之间建立可信通道。

7

可选元素 session 提供 Guest 所有者的 base64 编码会话 Blob(如 SEV API 规范中所定义)。请参见 SEV 规范中针对会话 Blob 格式的 LAUNCH_START 部分。

8

除了 launchSecurity 设置以外,SEV 加密的 VM 的所有 virtio-net 设备上都必须禁用 iPXE 选项 ROM。目前,iPXE 与 SEV 加密的 VM 不兼容。

Guest 策略是定义如下的 4 个无符号字节:

表 1︰ Guest 策略定义

定义

0

如果设置,则不允许调试 Guest

1

如果设置,则不允许与其他 Guest 共享密钥

2

如果设置,则需要 SEV-ES

3

如果设置,则不允许将 Guest 发送到其他平台

4

如果设置,则不得将 Guest 传送到不属于该域的其他平台

5

如果设置,则不得将 Guest 传送到不支持 SEV 的其他平台

6-15

保留

16-32

不得将 Guest 传送到固件版本更低的其他平台

5 VM 安装

virt-install 支持安装 SEV 和 SEV-ES 虚拟机。除了标准安装参数以外,还需要为 virt-install 提供用于满足 VM 要求的选项以及 --launchSecurity 选项。

下面的示例会启动通过 SEV-ES 提供保护的 SLES 15 SP4 虚拟机的网络安装。

   virt-install --name sles15sp4-sev-es --location http://192.168.0.1/install/sles15sp4/x86_64 --disk size=20 --network=bridge=br0,model=virtio,rom.bar=off 1 --vcpus 4 --memory 4096 --noautoconsole --events on_reboot=destroy --machine q35 --memtune hard_limit=4563402 --launchSecurity sev,policy=0x07 2 --boot firmware=efi 3 --vnc --serial pty

1

iPXE 选项 ROM 与 SEV 加密的 VM 不兼容,必须在所有 virtio-net 设备上将其禁用。libvirt 支持使用 rom 元素的 enabledbar 属性禁用选项 ROM,而 virt-install 仅支持使用 bar 属性来禁用选项 ROM。

2

launchSecurity 选项指定 SEV 固件要强制实施的类型和策略。策略设置详见表 1 “Guest 策略定义”

3

boot 选项可用于指定许多与引导相关的设置,包括虚拟机使用的固件。指定 efi 固件类型表示允许 libvirt 的固件自动选择功能为虚拟机选择支持 SEV 的适当固件。

6 SEV 与 KubeVirt

KubeVirt 从版本 0.49.0 开始支持运行 SEV Guest。该功能可通过启用 WorkloadEncryptionSEV 功能门控来激活:

> kubectl edit kubevirt kubevirt -n kubevirt
[...]
spec:
  configuration:
    developerConfiguration:
      featureGates:
      - WorkloadEncryptionSEV
[...]

要运行 SEV 加密的 Guest,必须在虚拟机规范中的 launchSecurity 域元素下包含 sev: {} 条目。此外,您还需要将 firmware/bootloader 参数配置为使用 efi 选项,并将 secureBoot 标志设置为 disabled。相应的 YAML 代码段将如下所示:

[...]
spec:
  domain:
    firmware:
      bootloader:
        efi:
          secureBoot: false
    launchSecurity:
      sev: {}
[...]

7 当前限制

SUSE 不建议在第一代 AMD EPYC™ 7000 系列处理器(代号 Naples)上将 SEV 和 SEV-ES 功能与 SUSE Linux 产品搭配使用。建议至少使用第二代 7002 系列处理器(代号 Rome)。此外,SEV 和 SEV-ES VM 还存在以下限制。

  • 在 SEV 加密的 VM 内运行的 Guest 操作系统必须包含 SEV 支持。SUSE Linux Enterprise Server 12 SP4 及更高版本以及所有 SUSE Linux Enterprise Server 15 版本都支持 SEV。

  • 当前不支持涉及保存及恢复实例的内存和状态的任何操作。这意味着 SEV 加密的 VM 无法从快照恢复,也无法保存/恢复或实时迁移。加密的 VM 可照常在其他主机上关闭和重启动。

  • SEV 加密的 VM 无法包含可直接访问的主机设备(即 PCI 直通)。

  • SEV 加密的 VM 与安全引导不兼容。包含安全引导支持的 UEFI 固件不适用于 SEV 或 SEV-ES VM。

  • SEV-ES VM 无法使用 rebootshutdown -r now 等命令重引导。必须通过关闭 VM 并再次启动来进行重引导。此限制不适用于 SEV VM,仅适用于 SEV-ES VM。

未来,当硬件、固件和各层软件具有新的功能时,将会去除这些限制。

8 更多信息