Debian

升級到 buster 後加密的 qemu 虛擬機不啟動:權限被拒絕

  • July 31, 2019

我正在使用 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. 根據需要設置 VM
  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 拉伸

升級到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 設置正確的訪問權限。

引用自:https://serverfault.com/questions/974689