인터넷 고양이 보안

인터넷 고양이 보안

사용자가 내 가상화 호스트에서 가상 머신을 하드 리셋할 수 없다는 불만을 자주 받습니다. 그래서 사용자에게 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에 "exit"를 보내는 연속 루프가 발생할 것으로 예상됩니다.

내가 말하고 싶은 것은아니요생산 준비 완료. 애초에 기본적인 엣지 케이스를 다루지 않기 때문에 "안전"에 대해서는 걱정하지도 않습니다.부서지기 쉬운원격으로 악용할 수 있는지 여부에 관계없이.

관련 정보