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

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

出版日期: 2024 年 12 月 12 日

AMD 的安全加密虚拟化 (SEV) 可让您加密虚拟机的内存。这是 Linux 内置的基于内核的虚拟机 (KVM) 超级管理程序的新功能。其目的是为了提高系统安全性,尤其在使用永久性内存的情况下。

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

1 SEV 简介

对磁盘上储存的计算机数据进行加密这项功能已得到广泛部署,但 RAM 中储存的数据并未加密。这可能会导致这些数据暴露给通过软件或硬件嗅探入侵主机系统的攻击者。新的永久性内存技术让此问题变得更加严重:用户可从系统上取下 NVDIMM(非易失性内存模块)实体且其上的数据将保持不变,就像硬盘或 SSD 上的数据一样。如果未加密,储存的任何信息(如敏感数据、口令或机密密钥)都可能轻易泄露。

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

在 SUSE Linux Enterprise 12 SP4 及以上版本和即将推出的 SUSE Linux Enterprise 15 维护版本中,内核、QEMU 和 libvirt 支持使用 SEV 创建和管理 VM。

2 VM 主机要求

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

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

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

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

3 VM 要求

VM 必须为新型 Q35 计算机类型且必须使用 UEFI 固件。

注意
注意:Q35 中无 IDE 支持

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

所有 virtio 设备都需要配置 iommu='on' 属性(在其 <driver> 配置中)。此外,必须锁定对 VM 使用的所有内存区域的直接内存访问 (DMA),以防发生交换。

4 VM 配置

例 1︰ 示例配置文件

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

<domain type='kvm'>
    <memory unit='KiB'>4194304</memory>
    <currentMemory unit='KiB'>4194304</currentMemory>
    <memoryBacking>
    <locked/>
    </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 1 type='sev'>
    <cbitpos>47</cbitpos> 2
    <reducedPhysBits>1</reducedPhysBits> 3
    <policy>0x0033</policy> 4
    </launchSecurity>
    <devices>
    <disk type='file' device='disk'>
    <driver iommu='on' name='qemu' type='raw'/>
    <target dev='vda' bus='virtio'/>
    <source file='/vmimages/sev-guest-disk.raw'/>
    </disk>
    <rng model='virtio'>
    <driver iommu='on'/>
    ...
    </rng>
    <memballoon model='virtio'>
    <driver iommu='on' /> 5
    ...
    </memballoon>
    <video>
    <model type='qxl' ram='65536' vram='65536' vgamem='16384' heads='1' primary='yes'/>
    </video>
    ...
    </devices>
    ...
    </domain>

1

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

2

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

3

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

4

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

5

除了 launchSecurity 设置外,SEV 加密的 VM 还必须设置 iommu='on' 属性(在每个 virtio 设备中)。需要指定此属性才能为 QEMU 内的设备启用 DMA API。

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

表 1︰ Guest 策略定义

定义

0

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

1

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

2

如果设置,则需要 SEV-ES

3

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

4

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

5

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

6-15

保留

16-32

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

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

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

SEV 加密的 VM 还必须锁定其所有内存区域,以允许 DMA 并防止发生交换。必须使用 memoryBackinglocked子元素指定内存的显式锁定。可通过将虚拟机配置为使用大页来避免进行显式内存锁定。有关在 VM 中使用大页的详细信息,请参见虚拟化最佳实践Article “虚拟化最佳实践”, Section 4.1.1 “将 VM 主机服务器和 VM Guest 配置为使用大页”

如果产生的开销与非 SEV VM 所需并无不同,那么固定内存时设置正确的硬限制就重要得多。如果限制过低,VM 将被终止。

5 当前限制

  • 在 SEV 加密的 VM 内运行的 Guest 操作系统必须包含 SEV 支持。目前 SUSE Linux Enterprise Server 12 SP4、SUSE Linux Enterprise Server 15 和 SUSE Linux Enterprise Server 15 SP1 都提供此支持。

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

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

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

6 更多信息