
Recibo quejas con bastante frecuencia de que los usuarios no pueden restablecer sus máquinas virtuales en mi host de virtualización. Así que decidí configurar alguna forma de eliminar la VM, sin dar acceso completo a la consola QEMU a los usuarios. Aquí está mi idea:
while true ; do
nc -l $USERPORT > /dev/null
echo "quit" | nc 127.0.0.1 $QEMUCONSOLE
done
$USERPORT
es el puerto de activación personal de cada usuario. La conectividad a dicho puerto está protegida mediante stunnel
autenticación basada en certificados. ¿Es seguro a nivel de producción? Quiero decir, ¿se puede netcat
explotar un servidor que se ejecuta de esta manera con algún tipo de acaparamiento del búfer, etc.? No me refiero necesariamente a una escalada de privilegios, sino también a cualquier forma de desestabilización grave del sistema, por ejemplo. llenando RAM o algo así.
EDITAR:
Dado que la respuesta inicial fue bastante detallada y estaba relacionada con las secuencias de comandos bash generales, supongo que publicaré la secuencia de comandos real (el código anterior era más como un pseudocódigo ya que quería evitar entrar en demasiados detalles).
#!/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
Respuesta1
USERPORT
¿ Son QEMUCONSOLE
variables ambientales exportadas reales? Si no ve "¿Existen convenciones de nomenclatura para las variables en los scripts de shell?"
Además, dado que le preocupa la seguridad, ¿es consciente de lasImplicaciones de seguridad de olvidarse de citar una variable en shells bash/POSIX?
A continuación, ¿ha considerado las implicaciones si el primer nc
comando aquí no puede vincularse a ese puerto (por ejemplo, si otro proceso ya está escuchando en el puerto)? No verifica su estado de salida de ninguna manera. Esperaría que obtuviera un bucle continuo que enviara "salir" a QEMUCONSOLE una gran cantidad de veces por segundo.
Yo diría que esnolisto para producción. Ni siquiera me preocuparía por "seguro" todavía porque, en primer lugar, no has manejado casos extremos básicos, por lo que esfrágilindependientemente de si se puede explotar remotamente o no.