
我經常收到投訴,稱用戶無法在我的虛擬化主機上硬重置其虛擬機器。因此,我決定設定某種方式來終止 VM,而不是向使用者提供對 QEMU 控制台的完全存取權。這是我的想法:
while true ; do
nc -l $USERPORT > /dev/null
echo "quit" | nc 127.0.0.1 $QEMUCONSOLE
done
$USERPORT
是每個使用者的個人觸發連接埠。與此類連接埠的連線受到stunnel
基於憑證的身份驗證的保護。生產級安全嗎?我的意思是netcat
伺服器像這樣運行可以被某種緩衝區佔用等利用嗎?我不一定是在談論特權升級,而是在談論任何形式的嚴重系統不穩定,例如。通過填充 RAM 或其他東西。
編輯:
由於最初的回應非常詳細並且與一般的 bash 腳本相關,我想我會發布實際的腳本(上面的程式碼更像是偽代碼,因為我想避免陷入太多細節)
#!/bin/bash
if [ ! -e "$HOME/kvm" ] ; then
>&2 echo "kvm dir not detected - creating"
/common/spawnVM.sh
if [ x"$?" != x"0" ] ; then
>&2 echo "qemu image creation failed - aborting"
exit 1 ; fi
fi
cd $HOME
VNCDISP=`cat /common/stunnelsrv.conf | grep "\[.*\]\|connect" | sed -e '$!N;s/\n/ /' | grep "^\[${USER:2}\]" | grep -o ":[0-9]\+" | grep -o "[0-9]$"`
if [ x"$VNCDISP" = x"" ] ; then
>&2 echo "stunnel section not found"
exit 2 ; fi
MONITORPORT="6`printf '%.3d' $VNCDISP`"
CMDPORT=`cat /common/stunnelsrv.conf | grep "\[.*\]\|connect" | sed -e '$!N;s/\n/ /' | grep "^\[cmd-${USER:2}\]" | grep -o ":[0-9]\+" | grep -o "[0-9]\+"`
TAPNAME="tap${USER:2}"
ip link show dev "$TAPNAME" > /dev/null
if [ x"$?" != x"0" ] ; then
>&2 echo "tap device not found"
exit 3 ; fi
NICMACADDR="`/common/qemu-mac-hasher.py \"$USER\"`"
CDISO=/common/arch.iso
if [ -e ./kvm/boot.iso ] ; then
CDISO=./kvm/boot.iso ; fi
if [ x"$CMDPORT" = x"" ] ; then
>&2 echo "stunnel cmd section not found - skip"
else
{
nc -l 127.0.0.1 -p "$CMDPORT" > /dev/null
if [ x"$?" != x"0" ] ; then
>&2 echo "error occured while running cmd"
else
echo "quit" | nc 127.0.0.1 "$MONITORPORT"
fi
} &
fi
echo "Params: VNC :$VNCDISP TAP $TAPNAME MAC $NICMACADDR MONITOR $MONITORPORT CMD $CMDPORT"
DISPLAY=:0
qemu-system-x86_64 -enable-kvm -machine type=pc,accel=kvm -monitor telnet:127.0.0.1:$MONITORPORT,server,nowait \
-nographic -vga virtio -vnc 127.0.0.1:$VNCDISP -usbdevice tablet -cpu host -smp 2 -m 4G -device virtio-balloon \
-boot menu=on -cdrom $CDISO -drive file=./kvm/root-$USER.img,format=qcow2,if=virtio,cache=off \
-net nic,model=virtio -net tap,ifname=$TAPNAME,script=no,downscript=no
echo "Waiting for reboot interrupt... ($0)"
sleep 10
exec $0
exit 0
答案1
是實際導出的環境變數嗎USERPORT
?QEMUCONSOLE
如果沒有看到“shell 腳本中的變數有命名約定嗎?」
另外,既然您擔心安全問題,您是否知道忘記在 bash/POSIX shell 中引用變數的安全隱患?
nc
接下來,您是否考慮過如果此處的第一個命令無法綁定到該連接埠(例如另一個進程已在偵聽該連接埠)的影響?您不會以任何方式檢查其退出狀態。我希望你會得到一個連續的循環,每秒向 QEMUCONSOLE 發送“退出”很多次。
我想說的是不是生產準備就緒。我什至不會擔心“安全”,因為你一開始還沒有處理基本的邊緣情況,所以它是脆弱的無論是否可以被遠端利用。