Debian
升級到 buster 後加密的 qemu 虛擬機不啟動:權限被拒絕
我正在使用 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
- 根據需要設置 VM
- 將虛擬機導入 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 拉伸
升級到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 的使用者是否將 ugprade 更改為 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 的錯誤:https ://bugs.debian.org/cgi-bin/bugreport.cgi?bug=933385
感謝 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 設置正確的訪問權限。