ユーザーが自分の仮想化ホストから仮想マシンをハードリセットできないという苦情がよくあります。そのため、ユーザーに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
次に、ここの最初のコマンドをポートにバインドできない場合(たとえば、他のプロセスがすでにポートでリッスンしている場合など)、影響を検討しましたか?いかなる方法でも終了状態を確認しません。 QEMUCONSOLEに1秒間に複数回「exit」を送信する連続ループが発生すると予想されます。
私が言いたいことはいいえ生産準備完了。そもそも基本的なエッジケースを扱わないので、「安全」については心配もありません。壊れやすいリモートで悪用できるかどうかにかかわらず。