Bad Daemons

La Pereza Cómo Dogma

Pero el buen sysadmin es precisamente el que se está todo el dia delante del ordenador, leyendo logs, viendo cómo hacer que el windows server, que el señor empresario le obliga a usar, falle menos y muchas otras cosas. Pero una de las cosas más importantes que hace el buen sysadmin, es automatizar. Porque son perezosos. Si algo tiene que hacerse más de una vez, hay que automatizarlo y hacer que sea lo menos molesto posible.

Teniendo esto en mente, me di cuenta que de vez en cuando tenia que reiniciar mi servidor, que está cifrado. Para quien no lo sepa, un ordenador cifrado que se reinicia necesita que se meta la contraseña a mano. Entonces, yo tenia que levantarme de la silla, girar el cuerpo unos 90 grados y meter la contraseña en el servidor. Esto, cómo os imagináis, da una pereza horrible. Mi silla es muy cómoda. Por lo tanto, decidí que tenia que poder reiniciar el servidor de manera remota.

Después de mucho buscar, y muchos intentos fallidos, me di cuenta de que la solución era estúpidamente fácil, y además estaba en la documentación oficial de debian, ni siquiera tienes que hacer algo raro.

Empecemos pues.

Descifrar Debian Remotamente

Instalamos los siguientes paquetes:

# aptitude install busybox dropbear

El primero es bastante probable que esté instalado, pero más vale prevenir. En la localizaciñon /etc/initramfs-tools/etc/dropbear/ deberían haber dos claves, dropbear_dss_host_key y dropbear_rsa_host_key. Si no estuviesen, las crearemos así:

# dropbearkey -t dss -f /etc/initramfs-tools/etc/dropbear/dropbear_dss_host_key
# dropbearkey -t rsa -f /etc/initramfs-tools/etc/dropbear/dropbear_rsa_host_ke

Cómo el initramfs no está cifrado, lo lógico es usar autenticación por medio de clave pública, por eso hemos creado las anteriores claves. Esta clave deberia estar en /etc/initramfs-tools/root/.ssh/authorized_keys/id_rsa.pub, pero si no está se puede crear con el comando anterior, pero apuntando a la nueva localización. Hecho esto, añadiremos la clave pública a las llaves autorizadas.

# cat /etc/initramfs-tools/root/.ssh/id_rsa.pub >> /etc/initramfs-tools/root/.ssh/authorized_keys

El último paso antes de actualizar el initrd, es darle una IP. Esto podemos hacerlo, en /etc/initramfs-tools/initramfs.conf. Ya que los routers están configurados para dar a la misma mac la misma IP siempre, pondremos DEVICE=eth0 y ya está. Si quisiésemos una IP fija, pondremos debajo de DEVICE=eth0: IP=192.168.1.150::192.168.1.1:255.255.255.0:localhost:eth0:off.

Hecho esto, actualizamos el initrd con:

# update-initramfs -u

Sólo queda pasar la clave privada de dropbear a la/s máquinas desde las que queramos poder reiniciar el servidor. Se puede hacer con el método que prefiráis. Entonces, ya podremos descifrarlo de manera remota con el siquiente snippet. He modificado un poco el que ofrecen en la documentación.

echo $pass | md5sum > $localizacionQueQueramos/descifradoHash
# El snippet 
#!/bin/bash

localizacionQueQueramos=""

read -s -p "Introduce la contraseña de bittorrent:" pass
echo ""
tempass="$(echo $pass | md5sum | cut -d' ' -f1)"
pass_md5="$(cat $localizacionQueQueramos/descifradoHash | cut -d' ' -f1)"

if [ $tempass = $pass_md5 ];then
    echo Desbloqueando...
    ssh -o "UserKnownHostsFile=~/.ssh/known_hosts.initramfs" -i ~/.ssh/id_rsa_dropbear root@192.168.1.100 "echo -ne "$pass" >/lib/cryptsetup/passfifo"
else
    echo Nope

fi

El cambio que he hecho es añadir el hasheo de la contraseña para comprobar que esté correcta antes de enviarla, ya que si enviamos una incorrecta, no nos enteraremos y estaremos esperando sin que pase nada. Evidentemente tener el hash por ahí es un riesgo, pero teniendo en cuenta que lo suyo es que cualquier ordenador que poseáis esté cifrado y que además deberíais usar un passphrase para el cifrado que fuese difícil o imposible de calcular, tampoco es exponerse tanto.

Felicidades, habéis conseguido el pin nivel uno de la pereza. Pero el realmente importante es el de nivel dos. Imaginaros que no estáis en el ordenador, estáis en el sofa viendo vuestra serie favorita usando una Raspberry Pi que tiene instalado peerTV. Tenéis que reiniciar el servidor y ahora no tenéis que levantaros de la silla, tenéis que levantaros del sofá!! Que hacéis? Pues prepararlo todo para reinciar el servidor desde el móvil, evidentemente.

Dado que Android no puede usar ssh desde la terminal (a menos que uséis Debian Kit o Lil' Debi), tendremos que usar ConnectBot, un cliente de ssh que permite usar claves públicas. Además, tendremos que meter un script en el initrd para que meta la contraseña. Este paso es opcional, pero sinó lo hacéis tendríais que recordar donde se tiene que meter la contraseña, que es en /lib/cryptsetup/passfifo. Para meter el script, descomprimiremos el initrd, meteremos el script y lo volveremos a comprimir. Esto sería de la siguiente forma:

cp /boot/initrd.img /usr/src/initrd
# Por si acaso
cp /boot/initrd.img /boot/initrd.img.bak
cd /usr/src/initrd
# Descomprimir
gunzip < initrd.img | cpio -i --make-directories
printf 'read -s -p "Introduce la contraseña de bittorrent:" pass
echo ""
echo -ne $pass > /lib/cryptsetup/passfifo' > root/descifra
# Recomprimir
find ./ | cpio -H newc -o > initrd.cpio
gzip initrd.cpio
mv initrd.cpio.gz initrd.img

Y así hemos conseguido el pin de nivel dos en pereza. Cuando vayáis a una entrevista, no podéis, debéis! enseñarselo al señor empresario.

Fuente: Si usáis debian:

zcat /usr/share/doc/cryptsetup/README.remote.gz | less