
仮想化ホスト上の VM をユーザーがハードリセットできないという苦情を頻繁に受けています。そこで、ユーザーに QEMU コンソールへのフルアクセスを与えずに VM を強制終了する方法を設定することにしました。私のアイデアは次のとおりです。
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
? そうでない場合は、「シェル スクリプトの変数には命名規則がありますか?「
また、セキュリティについて心配しているのであれば、bash/POSIX シェルで変数を引用符で囲み忘れた場合のセキュリティへの影響?
次に、ここで最初のnc
コマンドがそのポートにバインドできない場合の影響 (別のプロセスがすでにそのポートでリッスンしている場合など) を考慮しましたか? 終了ステータスをまったくチェックしていません。 1 秒間に何回も QEMUCONSOLE に「quit」を送信する連続ループが発生すると予想されます。
そうだと思いますない実稼働準備完了。基本的なエッジケースをまだ処理していないので、「安全」についてはまだ心配する必要はありません。壊れやすいリモートから悪用される可能性があるかどうかに関係なく。