限制特定使用者訪問 KVM 虛擬機
在我的伺服器上,我有一個名為“cards2”的 KVM 虛擬機。它是通過執行(以 root 身份)創建的:
# virt-install --connect qemu:///system --virt-type kvm --name cards2 --ram 2048 --disk /var/kvm/cards2.qcow,size=3 --vcpus=8 --cdrom /var/kvm/debian-8.5.0-amd64-netinst.iso --vnc --os-type linux --network network=default
圖片有權限:
# ls -l /var/kvm/cards2.qcow -rwxr-xr-x 1 libvirt-qemu libvirt-qemu 3221225472 Aug 17 18:49 /var/kvm/cards2.qcow
但是我注意到任何具有 SSH 訪問權限的使用者都可以通過執行以下命令來訪問 VM:
virt-viewer --connect qemu+ssh://username@hostname.example.com/system vmname
(注意,此命令是遠端
qemu+ssh://username@hostname.example.com
執行的,而不是在伺服器上執行的。它通過 SSH 隧道連接到具有連接 URI 的管理程序)使用者
username
只是組的成員username
。當使用該username
帳戶進行 SSH 登錄時,虛擬機列表顯示為空:$ virsh list --all Id Name State ----------------------------------------------------
在通過 SSH 執行以下操作時,我也無法使用套接字進行連接:
$ virsh --connect qemu:///system list --all error: Failed to connect socket to '/var/run/libvirt/libvirt-sock': Permission denied
/usr/bin/vir*
我還嘗試為不在組中的使用者刪除所有文件的權限kvm
:# chown root:kvm /usr/bin/vir* # chmod o-rx /usr/bin/vir* # ls /usr/bin/vir* -l -rwxr-x--- 1 root kvm 321120 Jul 1 04:46 /usr/bin/virsh -rwxr-x--- 1 root kvm 32184 Dec 7 2013 /usr/bin/virt-alignment-scan -rwxr-x--- 1 root kvm 28128 Dec 7 2013 /usr/bin/virt-cat -rwxr-x--- 1 root kvm 9774 Sep 29 2014 /usr/bin/virt-clone -rwxr-x--- 1 root kvm 10277 Sep 29 2014 /usr/bin/virt-convert -rwxr-x--- 1 root kvm 806 Dec 7 2013 /usr/bin/virt-copy-in -rwxr-x--- 1 root kvm 808 Dec 7 2013 /usr/bin/virt-copy-out -rwxr-x--- 1 root kvm 54584 Dec 7 2013 /usr/bin/virt-df -rwxr-x--- 1 root kvm 33312 Dec 7 2013 /usr/bin/virt-edit -rwxr-x--- 1 root kvm 54536 Dec 7 2013 /usr/bin/virt-filesystems -rwxr-x--- 1 root kvm 30112 Dec 7 2013 /usr/bin/virt-format -rwxr-x--- 1 root kvm 14656 Jul 1 04:46 /usr/bin/virt-host-validate -rwxr-x--- 1 root kvm 7944 Sep 29 2014 /usr/bin/virt-image -rwxr-x--- 1 root kvm 44696 Dec 7 2013 /usr/bin/virt-inspector -rwxr-x--- 1 root kvm 36992 Sep 29 2014 /usr/bin/virt-install -rwxr-x--- 1 root kvm 5338 Dec 7 2013 /usr/bin/virt-list-filesystems -rwxr-x--- 1 root kvm 6686 Dec 7 2013 /usr/bin/virt-list-partitions -rwxr-x--- 1 root kvm 53816 Dec 7 2013 /usr/bin/virt-ls -rwxr-x--- 1 root kvm 18641 Dec 7 2013 /usr/bin/virt-make-fs -rwxr-x--- 1 root kvm 9600 Jul 1 04:46 /usr/bin/virt-pki-validate -rwxr-x--- 1 root kvm 36264 Dec 7 2013 /usr/bin/virt-rescue -rwxr-x--- 1 root kvm 1322488 Dec 7 2013 /usr/bin/virt-resize -rwxr-x--- 1 root kvm 1231256 Dec 7 2013 /usr/bin/virt-sparsify -rwxr-x--- 1 root kvm 1289592 Dec 7 2013 /usr/bin/virt-sysprep -rwxr-x--- 1 root kvm 8949 Dec 7 2013 /usr/bin/virt-tar -rwxr-x--- 1 root kvm 804 Dec 7 2013 /usr/bin/virt-tar-in -rwxr-x--- 1 root kvm 806 Dec 7 2013 /usr/bin/virt-tar-out -rwxr-x--- 1 root kvm 55 Jul 12 2012 /usr/bin/virtualenv -rwxr-x--- 1 root kvm 132400 May 28 2012 /usr/bin/virt-viewer -rwxr-x--- 1 root kvm 23886 Dec 7 2013 /usr/bin/virt-win-reg -rwxr-x--- 1 root kvm 3531 Jul 1 04:46 /usr/bin/virt-xml-validate
即使現在我無法通過正常 SSH 連接訪問這些命令中的任何一個,我仍然可以通過
virt-viewer
SSH 隧道遠端執行(如上)來啟動 VM。那麼,我怎樣才能做到只有特定的使用者帳戶才能訪問虛擬機呢?
編輯:
以下是我
/var/log/libvirt/qemu/cards2.log
啟動 VM 時出現的內容,以防有任何指示:LC_ALL=C PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin QEMU_AUDIO_DRV=none /usr/bin/kvm -S -M pc-1.1 -enable-kvm -m 2048 -smp 8,sockets=8,cores=1,threads=1 -name cards2 -uuid 70905b35-9df3-71c9-d5e9-f804a2826055 -no-user-config -nodefaults -chardev socket,id= charmonitor,path=/var/lib/libvirt/qemu/cards2.monitor,server,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc -no-shutdown -device piix3-usb-uhci, id=usb,bus=pci.0,addr=0x1.0x2 -驅動文件=/var/kvm/cards2.qcow,if=none,id=drive-ide0-0-0,format=raw -device ide-hd ,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1 -drive if=none,id=drive-ide0-1-0,readonly= on,format=raw -device ide-cd,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0 -netdev tap,fd=23,id=hostnet0 -設備 rtl8139,netdev=hostnet0,id=net0,mac=52:54:00:c6:14:68,bus=pci.0,addr=0x3 -chardev pty,id=charserial0 -device isa-serial,chardev=charserial0,id=serial0 -vnc 127.0.0.1:3 -vga cirrus -device virtio-balloon-pci,id=balloon0,bus=pci.0 ,地址=0x4
編輯2:
另一方面,這似乎只是 的問題
virt-viewer
,而不是virsh
。例如,這裡是在遠端客戶端上執行的一些命令:
$ virsh --connect qemu+ssh://unauthorized-user@server.com/system error: failed to connect to the hypervisor error: End of file while reading data: nc: unix connect failed: Permission denied: Input/output error $ virsh --connect qemu+ssh://authorized-user@server.com/system Welcome to virsh, the virtualization interactive terminal. Type: 'help' for help with commands 'quit' to quit
KI明白了。virt-viewer 不與 libvirtd 互動 - 它通過 ssh 連接到主機並設置隧道以允許訪問基於 VNC 的 VM 虛擬顯示器(在我的情況下為 127.0.0.1:5903)。如果沒有在 127.0.0.1 上設置防火牆 VNC,這很難解決。否則,普通使用者通常可以自由地與 localhost 建立 TCP 連接。我不知道你怎麼能只允許root,也許有辦法。
也許 selinux 會這樣做?
**因此,最簡單的做法是設置 VNC 密碼。**您可以在 SSH 中執行限制轉發和 X11forwarding 之類的操作,但這可能不是 100% 安全的,並且還可能導致 root 出現問題。使用者登錄後仍然可以訪問 127.0.0.1/vnc。
更新
根據 Mike(其他答案)和 Michael Hampton(評論)的說法,您可以使用 TLS 而不是密碼與 VNC 進行通信,因此如果密碼對您來說不夠好,您將獲得一些相當不錯的安全性。他們兩個的道具,我不知道。
http://wiki.libvirt.org/page/VNCTLSSetup
和