사용자가 내 가상화 호스트에서 가상 머신을 하드 리셋할 수 없다는 불만을 자주 받습니다. 그래서 사용자에게 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"를 보내는 연속 루프가 발생할 것으로 예상됩니다.
내가 말하고 싶은 것은아니요생산 준비 완료. 애초에 기본적인 엣지 케이스를 다루지 않기 때문에 "안전"에 대해서는 걱정하지도 않습니다.부서지기 쉬운원격으로 악용할 수 있는지 여부에 관계없이.