加密的 qemu 虚拟机在升级到 buster 后无法启动:权限被拒绝

加密的 qemu 虚拟机在升级到 buster 后无法启动:权限被拒绝

我正在使用 libvirt 在 debian 主机上运行加密的 qemu 虚拟机。

为了设置机器,我采取了以下步骤:

  1. 将加密密钥$secretfile放在/etc/libvirt/secret
  2. 创建图像:qemu-img create --object secret,id=sec0,file=$secretfile,format=raw -f qcow2 -o encrypt.format=luks,encrypt.key-secret=sec0 $vmfile $size
  3. 根据需要设置虚拟机
  4. 将虚拟机导入到 virt 中:virt-install -n $theName -r 2048 --os-type=linux --os-variant=debian9 --connect=qemu:///system --import --network=network:default --vnc --qemu-commandline="--object secret,id=sec0,file=$secretfile -drive driver=qcow2,file.filename=$vmfile,encrypt.key-secret=sec0" --disk none --cpu host --import

这与主机系统上的 debian stretch 配合得很好

升级到 Debian Buster 后,虚拟机无法启动,并出现以下情况

error: Failed to start domain Feigenbaum
error: internal error: process exited while connecting to monitor: 2019-07-08T11:32:00.290494Z qemu-system-x86_64: --object secret,id=sec0,file=/etc/libvirt/secret/Feigenbaum.secret: Unable to read /etc/libvirt/secret/Feigenbaum.secret: Failed to open file “/etc/libvirt/secret/Feigenbaum.secret”: Permission denied

我的第一个猜测是,apparmorbuster 中的新功能阻止了对/etc/libvirt/secret/

但是,如果我将 apparmor 设置为投诉模式,问题仍然存在,根据我的理解,这应该停止阻止对秘密文件的访问:

aa-complain /usr/sbin/libvirtd
  • 我对 apparmor 还很陌生:如何确保 apparmor 不会造成干扰?
  • 还有哪些机制可以阻止访问秘密文件?

- 编辑 -

关于访问权限的评论,我认为它们设置正确。升级前它运行良好。运行 qemu-vm 的用户是否随着升级到 buster 而发生变化?

ls -l /etc/libvirt/secret/Feigenbaum.secret 
-rw-r----- 1 root libvirt-qemu 61 Mar  8 14:13 /etc/libvirt/secret/Feigenbaum.secret

ls -ld /etc/libvirt/secret/
drwxrwx--- 2 libvirt-qemu libvirt-qemu 102 Mar  8 14:13 /etc/libvirt/secret/

ls -ld /etc/libvirt/
drwxr-xr-x 7 root root 4096 Jul  8 11:51 /etc/libvirt/

ls -ld /etc/
drwxr-xr-x 103 root root 8192 Jul 10 06:35 /etc/

- 编辑 -

报告为 Debian 的 Bug:https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=933385

答案1

感谢 Debian 项目的 Guido,我得以解决这个问题。

Apparmor 确实阻止了对秘密文件的访问。

qemu-commandline 选项不受支持,导致 apparmor 无法正确设置访问权限。这可以在 中手动配置/etc/apparmor.d/libvirt/TEMPLATE.qemu。该文件需要从 修改

#
# This profile is for the domain whose UUID matches this file.
#

#include <tunables/global>

profile LIBVIRT_TEMPLATE flags=(attach_disconnected) {
  #include <abstractions/libvirt-qemu>
}

#
# This profile is for the domain whose UUID matches this file.
#

#include <tunables/global>

profile LIBVIRT_TEMPLATE flags=(attach_disconnected) {
  #include <abstractions/libvirt-qemu>
  /etc/libvirt/secret/** r,
  /var/lib/libvirt/images/** rwk,
}

更好的解决方案是通过 libvirt 使用卷加密,如下所述:https://libvirt.org/formatstorageencryption.html#StorageEncryption。这应该允许 apparmor 设置正确的访问权限。

相关内容