it-swarm-es.com

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

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.

62
hpy

Para las versiones más nuevas de ubuntu, por ejemplo, 14.04, encontré una combinación de @dragly y this blogposts ' respuestas 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 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) Crear 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 anteriormente para obtener instrucciones sobre cómo configurar el servidor con una dirección IP estática si eso es algo que debe hacer.

26
nsg

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. Actualice sus 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!)

23
dragly

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.

18
wag

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 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, usando 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: dropbearbusybox

El archivo /etc/initramfs-tools/initramfs.conf Contiene las opciones de configuración utilizadas al construir initramfs. Debe contener BUSYBOX=y (Esto se establece como predeterminado 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 DROPBEAR no está configurado en absoluto, 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_key Y 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 se le agregará /etc/initramfs-tools/root/.ssh/id_rsa.pub. Si el último archivo tampoco existe, se generará automáticamente: encontrará la clave privada correspondiente que luego necesitará para iniciar sesión en initramfs en /etc/initramfs-tools/root/.ssh/id_rsa (O id_rsa.dropbear En en caso de que lo 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 desee configurar alguna interfaz utilizando dhcp, establecer DEVICE= En /etc/initramfs-tools/initramfs.conf Debería ser suficiente. Los initramfs también deben respetar el parámetro del kernel ip=. En caso de que use grub, es probable que desee establecerlo en /boot/grub/menu.lst, Ya sea en la línea '# kopt=' O anexado a líneas específicas 'kernel'. El parámetro del kernel ip= Está documentado en Documentation/nfsroot.txt En el árbol de fuentes del kernel.

Cuestiones

¡No olvides ejecutar update-initramfs Cuando cambiaste 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 archivo adicional known_hosts "~/.ssh/known_hosts.initramfs" Que contiene la clave Host del sistema cryptroot, que tiene un archivo "~/id_rsa.initramfs" Que contiene el archivo autorizado clave para el sistema cryptroot, que el nombre del sistema cryptroot es "initramfshost.example.com", y que la frase de contraseña cryptroot es "secret"

- <[email protected]>, Mié, 30 de septiembre de 2009

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

16
gertvdijk

Si desea poder arrancar desatendido así como de forma remota, también debe mirar Mandos (que yo y otros haber escritó):

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 la página del manual de introducción para obtener más información, incluida una lista FAQ.

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

6
Teddy

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

GRUB se puede configurar para trabajar sobre el puerto serie. Su kernel 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.

2
LawrenceC

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

De todos modos, siguiendo las instrucciones funcionó:

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_keys en el SERVIDOR

Crea el script de desbloqueo

Crea 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 "\[email protected]"
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.conf para 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

Update 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]
2
ceremcem

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.

2
user3188445

En debian 9 (estable), esta solución estaba desactualizada. Durante la instalación, recibo una advertencia sobre 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):

Primero asegúrese de que busybox, dropbear y dropbear-initramfs está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 initramfs para tener en cuenta los cambios:: update-initramfs -u

¡Eso es todo!

Tenga en cuenta que si desea evitar tener un choque entre las teclas entre dropbear y openssh (comparten la misma ip, pero usan una clave diferente), puede poner su cliente ~/.ssh/config algo como eso:

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 obtenga un mensaje, escriba como lo sugiere el mensaje busybox:

cryptroot-unlock

y escribe tu contraseña.

¡Disfrutar!

2
tobiasBora

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

Incluso fui tan lejos como para desarrollar un programa Python ( nlock-remote-system ) que hace el desbloqueo real para mí, porque el proceso de hacerlo manualmente se sintió un poco frágil y comencé a temer reiniciar mis servidores, así que en el espíritu de "si duele vale la pena automatizar" codifiqué mi conocimiento en Python ???? (y esto ha sido realmente hizo mucho más fácil hacer reinicios regulares para aplicar actualizaciones de seguridad).

Desde entonces, también decidí compartir mis notas personales sobre 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.

1
xolox

Escribí un papel de Ansible que hace esto por ti. Simplemente obtenga el rol debops-contrib.dropbear_initramfs y ejecútelo. Consulte documentación del rol para más detalles.

0
ypid