La Pereza Cómo Dogma

Cuando un señor empresario de estos importantes busca un administrador de sistemas, realmente no sabe lo que busca. El se piensa que quiere una persona que esté presente cuando algo se rompa y mientras eso no pase, tiene al típico pringado que le toca hacer de todo. Quiere verle moverse, haciendo cosas, por que si está delante del ordenador y no hay ningún problema, seguro que se está tocando las narices. Mirando facebook o peor, mirando porno, ya se sabe que a los informáticos (las informáticas no existen, ya sabéis, mujeres y tecnología no se llevan bien) les gusta mucho eso de mirar porno.

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\necho ""\necho -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
Compartir

2 Comentarios

Deja una respuesta

Your email address will not be published. Required fields are marked *

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax