我正在使用 libvirt 在 debian 主机上运行加密的 qemu 虚拟机。
为了设置机器,我采取了以下步骤:
- 将加密密钥
$secretfile
放在/etc/libvirt/secret
- 创建图像:
qemu-img create --object secret,id=sec0,file=$secretfile,format=raw -f qcow2 -o encrypt.format=luks,encrypt.key-secret=sec0 $vmfile $size
- 根据需要设置虚拟机
- 将虚拟机导入到 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
我的第一个猜测是,apparmor
buster 中的新功能阻止了对/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 设置正确的访问权限。