インターネット猫セキュリティ

インターネット猫セキュリティ

ユーザーが自分の仮想化ホストから仮想マシンをハードリセットできないという苦情がよくあります。そのため、ユーザーに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

実際にエクスポートされた環境変数ですかUSERPORTQEMUCONSOLE見えないと」シェルスクリプトの変数の命名規則はありますか?

そしてセキュリティが心配ですが、ご存知ですか?bash / POSIXシェルで変数を引用することを忘れてしまうセキュリティリスク

nc次に、ここの最初のコマンドをポートにバインドできない場合(たとえば、他のプロセスがすでにポートでリッスンしている場合など)、影響を検討しましたか?いかなる方法でも終了状態を確認しません。 QEMUCONSOLEに1秒間に複数回「exit」を送信する連続ループが発生すると予想されます。

私が言いたいことはいいえ生産準備完了。そもそも基本的なエッジケースを扱わないので、「安全」については心配もありません。壊れやすいリモートで悪用できるかどうかにかかわらず。

関連情報