SSH para descifrar LVM cifrado durante el arranque del servidor sin cabeza?

59

Cuando instalé Ubuntu 10.04 y, ahora, 10.10, me ofrecieron la opción de habilitar "LVM cifrado" para mi disco duro. Después de elegir esa opción, se me solicita mi contraseña durante el arranque para descifrar el LVM.

Ahora, estoy pensando en configurar un servidor sin cabeza que ejecute Linux (no necesariamente Ubuntu), pero me preocupa que, dado que el servidor no tiene cabeza, no pueda descifrarlo durante el inicio. ¿Podría ingresar SSH durante el arranque para ingresar mi contraseña para el LVM cifrado? Si es así, ¿cómo lo configuro? ¿O hay otra solución? Nuevamente, esta pregunta NO es específica de Ubuntu. Gracias.

hpy
fuente
44
Ver también:zless /usr/share/doc/cryptsetup/README.remote.gz
0xC0000022L
Creo que la respuesta de @Nate debería ser la aceptada: esencialmente (dado que se requiere una edición para reflejar los cambios en el blog vinculado) utiliza claves públicas en lugar de privadas .
Jonathan Y.

Respuestas:

25

Para las versiones más nuevas de ubuntu, por ejemplo, 14.04, encontré una combinación de @dragly y las respuestas de este blog son muy útiles. Parafrasear:

  1. (En el servidor) Instalar Dropbear

    sudo apt-get install dropbear
    
  2. (En el servidor) Copie y asigne permisos para el inicio de sesión de clave pública / privada raíz

    sudo cp /etc/initramfs-tools/root/.ssh/id_rsa ~/.
    sudo chown user:user ~/id_rsa
    

recuerde cambiar el usuario a su nombre de usuario en el servidor

  1. (En el cliente) Obtener clave privada del servidor

    scp [email protected]:~/id_rsa ~/.ssh/id_rsa_dropbear
    
  2. (En el cliente) Agregue una entrada a ssh config

    Host parkia
        Hostname 192.168.11.111
        User root
        UserKnownHostsFile ~/.ssh/know_hosts.initramfs
        IdentityFile ~/.ssh/id_rsa_dropbear
    Remember to change _parkia_ to whatever you'd like to type `ssh my-box` to be.
    
  3. (En el servidor) Cree este archivo en/etc/initramfs-tools/hooks/crypt_unlock.sh

  4. (En el servidor) Hacer que ese archivo sea ejecutable

    sudo chmod +x /etc/initramfs-tools/hooks/crypt_unlock.sh
    
  5. Actualiza los initramfs

    sudo update-initramfs -u
    
  6. Deshabilite el servicio dropbear en el arranque para que openssh se use después de descifrar la partición

    sudo update-rc.d dropbear disable
    

Ya terminaste Pruébalo. Consulte la publicación del blog vinculada a arriba para obtener instrucciones sobre cómo configurar el servidor con una dirección IP estática si eso es algo que debe hacer.

NS G
fuente
El blog vinculado ha agregado una referencia para agregar la clave pública de un cliente a la del servidor /etc/initramfs-tools/root/.ssh/authorized_keys, incluso si todavía se copia la clave privada de Dropbear, que se puede ignorar por completo. Seguir el resto de las instrucciones funciona para mí, lo que significa que esta debería ser la respuesta aceptada (una vez que refleja ese cambio), ya que solo usa claves públicas.
Jonathan Y.
23

En esta publicación de blog se muestra una guía para realizar dicha configuración con BusyBox y Dropbear . early-ssh no funcionó para mí y aparentemente ya no es necesario.

He resumido lo que debe hacer a continuación. Para más detalles, eche un vistazo a la publicación anterior:

  1. Instale BusyBox y Dropbear en su servidor

    sudo apt-get install dropbear busybox
    
  2. Actualiza tus initramfs en el servidor

    sudo update-initramfs -u
    
  3. Copie la clave privada generada por dropbear en su máquina cliente. Es posible que deba copiar esto en un nuevo directorio y cambiar la propiedad para hacerlo. En su servidor haga lo siguiente:

    sudo cp /etc/initramfs-tools/root/.ssh/id_rsa ~/.
    sudo chown user:user ~/id_rsa
    

    Recuerde reemplazar el usuario con su nombre de usuario. Los inicios de sesión de contraseña no parecen funcionar.

  4. Ahora puede transferir la clave privada con scp llamando a lo siguiente en su cliente :

    scp [email protected]:~/id_rsa ~/.ssh/id_rsa_dropbear
    
  5. Configure el archivo ~ / .ssh / config de su cliente para iniciar sesión fácilmente. Ábralo con un editor de texto y agregue lo siguiente:

    Host myremoteserver
        HostName my.remote.server
        User root
        UserKnownHostsFile ~/.ssh/known_hosts.initramfs
        IdentityFile ~/.ssh/id_rsa_dropbear
    

    Cambie el Host a lo que quiera y HostName al nombre de su servidor. Deje que el usuario sea root. Parece ser el único usuario aceptado en Dropbear. Guarde y cierre el archivo.

  6. Reinicie su servidor y espere el mensaje de frase de contraseña. Dé a Dropbear unos segundos para detectar y configurar su conexión a Internet. Conéctese a su servidor con el siguiente comando en su cliente :

    ssh myremoteserver # or any name you chose
    
  7. Cuando inicie sesión, emita el siguiente comando en su servidor . Vea la publicación del blog para más detalles:

    pid=`ps | grep "/scripts/local-top/cryptroot" | cut -d " " -f 3`
    kill -9 $pid
    sleep 35
    /scripts/local-top/cryptroot
    pid=`ps | grep "/bin/sh" | cut -d " " -f 3`
    kill -9 $pid;
    

    Pasará algún tiempo (30 segundos) antes de que pueda escribir su frase de contraseña. Escríbalo cuando se le solicite.

  8. Cierre la conexión escribiendo

    exit
    
  9. Su servidor ahora debería haber desbloqueado su disco duro cifrado y arrancar normalmente.

(¡Muchas gracias al autor original de la publicación del blog!)

dragly
fuente
2
No entiendo muy bien la razón para moverse con claves privadas. Debería ser suficiente copiar su clave pública en la máquina cliente al servidor como clave autorizada para el servidor raíz, ¿verdad?
gertvdijk
Estoy seguro de que es posible crear el par de claves en la máquina del cliente y solo mover la clave pública desde allí al servidor, pero si recuerdo correctamente, creo que hubo algunos problemas para encontrar un formato que BusyBox aceptaría. Así que reutilizar las claves que ya estaban en el servidor fue la única opción que puse a trabajar.
dragly
1
¿Alguna idea de lo que debo hacer para que esto funcione en Arch Linux?
Gerharddc
1
@Gerhman Echa un vistazo al paquete dropbear_initrd_encrypt en AUR para obtener soporte de ssh temprano en Archlinux.
Caleb
1
@Gerhman archwiki page: Desbloqueo remoto de la raíz u otra partición Todavía no lo he hecho, pero parece interesante.
Tendré que echarle un
18

Creo que early-ssh proporciona lo que estás buscando:

Early-ssh is a simple initramfs hook, which installs Dropbear SSH server into  
your initramfs, and starts it at boottime, so you will be able to do a lot of  
things remotely over SSH, before your root partition gets mounted, for example:

* unlocking LUKS encrypted crypto devices - 
  even your root can be an encrypted filesystem
* assembling/altering RAID arrays (mdadm)
* checking the root filesystem in read-write mode, 
  taking action in case of errors
* and so on...

Ya hay un paquete .deb disponible, por lo que probablemente estés bien con Ubuntu.

meneo
fuente
Parece que esto es exactamente lo que estoy buscando, ¡gracias!
hpy
3
¿Tienes un enlace a un buen tutorial o tutorial? Estoy atascado con early-ssh en mi caja de compresión de Debian.
1
Sí, un tutorial sería genial.
hpy
16

Eche un vistazo al archivo léame cryptsetup para esto en /usr/share/doc/cryptsetup/README.remote.gz(paquete de Ubuntu cryptsetup). En hay una guía completa para lograr esto. Es similar a la respuesta de dragly , pero creo que esto es un poco más elegante. (Teclas con formato Dropbear, pasando la frase de contraseña a través de un FIFO en lugar de un script de shell frágil, etc.)

desbloqueo de rootfs a través de inicio de sesión ssh en initramfs

Puede desbloquear sus rootfs en el arranque desde el control remoto, utilizando ssh para iniciar sesión en el sistema de arranque mientras se ejecuta con el initramfs montado.

Preparar

Para que funcione el desbloqueo remoto, se deben instalar los siguientes paquetes antes de compilar initramfs: dropbear busybox

El archivo /etc/initramfs-tools/initramfs.confcontiene las opciones de configuración utilizadas al construir initramfs. Debe contener BUSYBOX=y (esto se establece por defecto cuando se instala el paquete busybox) para tener busybox instalado en initramfs, y no debe contener DROPBEAR=n, lo que deshabilitaría la instalación de dropbear en initramfs. Si se establece en DROPBEAR=y, dropbear se instalará en cualquier caso; si DROPBEARno está configurado, entonces dropbear solo se instalará en caso de una configuración de criptroot existente.

Las claves de host utilizadas para initramfs son dropbear_dss_host_keyy dropbear_rsa_host_key, ambas ubicadas en /etc/initramfs-tools/etc/dropbear/. Si no existen cuando se compila initramfs, se crearán automáticamente. Los siguientes son los comandos para crearlos manualmente:

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_key

Como los initramfs no se cifrarán, se supone la autenticación de clave pública. Las claves utilizadas para eso se tomarán de /etc/initramfs-tools/root/.ssh/authorized_keys. Si este archivo no existe cuando se compila initramfs, se creará y /etc/initramfs-tools/root/.ssh/id_rsa.pubse le agregará. Si el último archivo tampoco existe, se generará automáticamente: encontrará la clave privada correspondiente que luego necesitará para iniciar sesión en initramfs /etc/initramfs-tools/root/.ssh/id_rsa (o id_rsa.dropbearen caso de que la necesite en formato dropbear). Los siguientes son los comandos para realizar los pasos respectivos manualmente:

Para crear una clave (en formato dropbear):

dropbearkey -t rsa -f /etc/initramfs-tools/root/.ssh/id_rsa.dropbear

Para convertir la clave del formato dropbear al formato openssh:

/usr/lib/dropbear/dropbearconvert dropbear openssh \
    /etc/initramfs-tools/root/.ssh/id_rsa.dropbear \
    /etc/initramfs-tools/root/.ssh/id_rsa

Para extraer la clave pública:

dropbearkey -y -f /etc/initramfs-tools/root/.ssh/id_rsa.dropbear | \
    grep "^ssh-rsa " > /etc/initramfs-tools/root/.ssh/id_rsa.pub

Para agregar la clave pública al archivo autorizado_claves:

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

En caso de que quiera alguna de las interfaces para conseguir configurar mediante DHCP, la configuración DEVICE=en /etc/initramfs-tools/initramfs.confdebería ser suficiente. El initramfs también debe honrar el ip=parámetro del núcleo. En caso de que use grub, es probable que desee configurarlo /boot/grub/menu.lst, ya sea en la # kopt=línea ' ' o anexado a kernellíneas específicas ' '. El ip=parámetro del núcleo está documentado Documentation/nfsroot.txten el árbol de origen del núcleo.

Cuestiones

¡No olvide ejecutar update-initramfscuando cambió la configuración para que sea efectiva!

Recolectar suficiente entropía para el demonio ssh a veces parece ser un problema. El inicio del demonio ssh podría retrasarse hasta que se haya recuperado suficiente entropía. Esto no bloquea el proceso de inicio, por lo que cuando esté en la consola no tendrá que esperar a que sshd complete su inicio.

Procedimiento de desbloqueo

Para desbloquear desde el control remoto, puede hacer algo como esto:

ssh -o "UserKnownHostsFile=~/.ssh/known_hosts.initramfs" \
    -i "~/id_rsa.initramfs" [email protected] \
    "echo -ne \"secret\" >/lib/cryptsetup/passfifo"

Este ejemplo supone que tiene un known_hostsarchivo " ~/.ssh/known_hosts.initramfs" adicional que contiene la clave de host del sistema cryptroot, que tiene un archivo " ~/id_rsa.initramfs" que contiene la clave autorizada para el sistema cryptroot, que el nombre del sistema cryptroot es " initramfshost.example.com", y que el la frase de contraseña de cryptroot es " secret"

- < [email protected]>, mié, 30 sep 2009

Gracias a jap por señalarme esto en un canal diferente.

gertvdijk
fuente
1
Esto parece una idea mucho mejor (que se describe en los documentos oficiales y todo) que hackear ps-grepping. Sin embargo, como una nota al margen sobre el procedimiento de desbloqueo proporcionado, uno puede ser cauteloso al escribir la frase de contraseña directamente en la línea de comando, ya que probablemente terminará en un archivo de historial de shell en alguna parte. Una posible solución es crear una pequeña secuencia de comandos de contenedor que solicite la frase de contraseña usando read -s -p.
joelpet
1
tenga en cuenta que hay problemas con ese enfoque en las versiones recientes de Ubuntu, es decir, bugs.launchpad.net/ubuntu/+source/cryptsetup/+bug/595648
Frederick Nord
6

Si desea poder arrancar de manera desatendida y remota, también debe mirar Mandos (que yo y otros hemos escrito):

Mandos es un sistema para permitir que los servidores con sistemas de archivos raíz encriptados se reinicien de manera desatendida y / o remota. Consulte el archivo de la página del manual de introducción para obtener más información, incluida una lista de preguntas frecuentes.

En resumen, el servidor de arranque obtiene la contraseña a través de la red, de manera segura. Ver el archivo README para más detalles.

Osito de peluche
fuente
Gracias por sus contribuciones, pero tenga en cuenta que el 100% de sus publicaciones que son menciones casi idénticas de su producto es un comportamiento límite , y corre el riesgo de ser considerado spam (habría marcado sus publicaciones si Mandos no fuera software libre o no tenía un historial de publicaciones no Mandos en otros sitios).
Gilles 'SO- deja de ser malvado'
@Gilles: Hecho ahora.
Teddy
2

Servidor sin cabeza? Si tiene un puerto serie, úselo.

GRUB se puede configurar para funcionar a través del puerto serie. Su núcleo también puede configurarse utilizando el puerto serie para enviar los mensajes de arranque iniciales, ingresar la contraseña para desbloquear sus unidades e iniciar sesión. (Si su servidor admite BIOS serie, habilítelo también. Entonces nunca tendrá que conectarse un monitor a la máquina en absoluto).

Siempre es una buena idea tener una forma "no de red" de entrar en un servidor sin cabeza.

LawrenceC
fuente
Gran punto! Sin embargo, las formas " no relacionadas con la red " de entrar en un servidor sin cabeza son ( solo ) relevantes en su mayoría si la proximidad física entre el cliente / servidor es cercana; a menos que esté pasando por alto alguna otra posibilidad / característica de una conexión en serie.
ILMostro_7
2

En Arch Linux, hay un paquete AUR dropbear_initrd_encrypt que hace lo que quieres de la caja. Funciona bastante bien para interfaces cableadas. Tuve que hackearlo un poco para la conexión inalámbrica.

usuario3188445
fuente
2

Desafortunadamente, ninguna de las respuestas anteriores funcionó para mí. Además, copiar una clave privada del servidor parece paradójico.

De todos modos, las siguientes instrucciones funcionaron:

Arranque su SERVIDOR conectando y desbloqueando la partición encriptada a través de su CLIENTE

Instalar paquetes obligatorios (en el SERVIDOR)

apt-get install dropbear initramfs-tools busybox

Agregue sus claves públicas deseadas en el archivo autorizado de claves del SERVIDOR

Simplemente copie y pegue sus claves públicas en /etc/dropbear-initramfs/authorized_keysel SERVIDOR

Crea el script de desbloqueo

Crear el siguiente script en /etc/initramfs-tools/hooks/crypt_unlock.sh

#!/bin/sh

PREREQ="dropbear"

prereqs() {
  echo "$PREREQ"
}

case "$1" in
  prereqs)
    prereqs
    exit 0
  ;;
esac

. "${CONFDIR}/initramfs.conf"
. /usr/share/initramfs-tools/hook-functions

if [ "${DROPBEAR}" != "n" ] && [ -r "/etc/crypttab" ] ; then
cat > "${DESTDIR}/bin/unlock" << EOF
#!/bin/sh
if PATH=/lib/unlock:/bin:/sbin /scripts/local-top/cryptroot; then
kill \`ps | grep cryptroot | grep -v "grep" | awk '{print \$1}'\`
# following line kill the remote shell right after the passphrase has
# been entered.
kill -9 \`ps | grep "\-sh" | grep -v "grep" | awk '{print \$1}'\`
exit 0
fi
exit 1
EOF

  chmod 755 "${DESTDIR}/bin/unlock"

  mkdir -p "${DESTDIR}/lib/unlock"
cat > "${DESTDIR}/lib/unlock/plymouth" << EOF
#!/bin/sh
[ "\$1" == "--ping" ] && exit 1
/bin/plymouth "\$@"
EOF

  chmod 755 "${DESTDIR}/lib/unlock/plymouth"

  echo To unlock root-partition run "unlock" >> ${DESTDIR}/etc/motd

fi

Hazlo ejecutable:

chmod +x /etc/initramfs-tools/hooks/crypt_unlock.sh

Cree una IP estática (u omita este paso para usar DHCP)

Editar /etc/initramfs-tools/initramfs.confpara agregar (o cambiar) la línea:

#format [host ip]::[gateway ip]:[netmask]:[hostname]:[device]:[autoconf]
#([hostname] can be omitted)
IP=192.168.1.254::192.168.1.1:255.255.255.0::eth0:off

Actualizar initialramfs

update-initramfs -u

Deshabilite el servicio dropbear en el arranque para que openssh se use después de descifrar la partición

sudo update-rc.d dropbear disable

Pruebas

  • Reinicia tu servidor
  • Conéctese a su servidor a través de ssh [email protected] [-i ~/.ssh/id_rsa]
ceremcem
fuente
2

En debian 9 (estable), esta solución estaba desactualizada. Durante la instalación, recibo una advertencia dropbear: WARNING: Invalid authorized_keys file, remote unlocking of cryptroot via SSH won't work!y no pude encontrar las claves necesarias. Por cierto, este método es muy simple y me lo explicaron en el gran canal #debian (gracias de nuevo):

En primer lugar asegurarse de que busybox, dropbeary dropbear-initramfsestán instalados

sudo apt install busybox dropbear*

luego agregue su clave pública (la mayoría de las veces ~/.ssh/id_rsa.pub) en el archivo /etc/dropbear-initramfs/authorized_keys.

Actualice luego initramfspara tener en cuenta los cambios:: update-initramfs -u

¡Eso es todo!

Tenga en cuenta que si desea evitar un choque entre las teclas entre dropbeary openssh(comparten la misma ip, pero usan una clave diferente), es posible que desee poner en su cliente ~/.ssh/configalgo así:

Host myserver_luks_unlock
     User root
     Hostname <myserver>
     # The next line is useful to avoid ssh conflict with IP
     HostKeyAlias <myserver>_luks_unlock
     Port 22
     PreferredAuthentications publickey
     IdentityFile ~/.ssh/id_rsa

Luego, solo se conecta usando:

ssh myserver_luks_unlock

y una vez que reciba un mensaje, escriba como lo sugiere el mensaje de busybox:

cryptroot-unlock

y escriba su contraseña

¡Disfrutar!

tobiasBora
fuente
0

He estado utilizando la técnica explicada por otros en esta página (SSH en initramfs con un IPparámetro de kernel para configurar la red) durante bastantes años para desbloquear de forma remota servidores Ubuntu Linux sin cabeza (12.02, 14.04, 16.04 y 18.04).

Incluso llegué a desarrollar un programa Python (sistema de desbloqueo remoto ) que hace el desbloqueo real para mí, porque el proceso de hacerlo manualmente me pareció un poco frágil y comencé a temer reiniciar mis servidores, así que en el espíritu de "si le duele, vale la pena automatizarlo". Codifiqué mi conocimiento en Python 😇 (y esto ha hecho que sea mucho más fácil hacer reinicios regulares para aplicar actualizaciones de seguridad).

Desde entonces, también decidí compartir mis notas personales sobre el cifrado de disco raíz remoto con el mundo. La página vinculada contiene bastantes detalles sobre el procedimiento (también algunos consejos que no se mencionan aquí) y tengo la intención de mantenerlo actualizado.

xolox
fuente