Creacion de un pendrive para descifrar un equipo con la partición raiz cifrada

Preparar el archivo de clave

Genera una clave aleatoria y guárdala en un archivo (ej. cryptkey.key):

sudo dd if=/dev/urandom of=/root/cryptkey.key bs=512 count=4
sudo chmod 600 /root/cryptkey.key

Agregar la clave al volumen LUKS

Añade el archivo como clave adicional al disco cifrado (ej. /dev/nvme0n1p3):

sudo cryptsetup luksAddKey /dev/nvme0n1p3 /root/cryptkey.key
  • Nota: Reemplaza /dev/nvme0n1p3 con tu dispositivo correcto (ver con lsblk).

Configurar el initramfs

Crea el script que buscará la clave en el USB:

sudo nano /etc/initramfs-tools/scripts/local-top/cryptusb

Contenido del script:

#!/bin/sh

# fichero en /etc/initramfs-tools/scripts/local-top/unlockusb

PREREQ=""

prereqs() { echo "$PREREQ"; }

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

. /scripts/functions

# UUIDs
USB_UUID="01a5fc97-70dd-40e7-b436-4f29f2cff5e3"
CRYPT_UUID="60d547fd-88c4-43f2-8ae3-d767039ba9c6"

USB_MOUNTPOINT="/usbkey"
KEYFILE="$USB_MOUNTPOINT/cryptkey.key"
CRYPT_NAME="root-c"

# Esperar a que aparezca el dispositivo USB (máx 10s)
echo "Esperando el dispositivo USB con UUID=$USB_UUID..."
for i in $(seq 1 10); do
    if blkid | grep -q "$USB_UUID"; then
        break
    fi
    sleep 1
done

# Montar el USB en solo lectura
mkdir -p $USB_MOUNTPOINT
mount -o ro -t ext4 UUID=$USB_UUID $USB_MOUNTPOINT 2>/dev/null

if [ -f "$KEYFILE" ]; then
    echo "Clave encontrada en $KEYFILE, intentando desbloquear el volumen..."
    cryptsetup luksOpen UUID=$CRYPT_UUID $CRYPT_NAME --key-file "$KEYFILE"
    STATUS=$?
    if [ $STATUS -eq 0 ]; then
        echo "Volumen LUKS desbloqueado correctamente usando la clave del USB."
        umount $USB_MOUNTPOINT
        exit 0
    else
        echo "Error al desbloquear el volumen con la clave del USB."
    fi
else
    echo "No se encontró el archivo de clave $KEYFILE en el USB."
fi

# Si falla, desmontar y continuar con método interactivo
umount $USB_MOUNTPOINT 2>/dev/null
echo "Fallo el desbloqueo automático. Se pedirá la contraseña manualmente."
exit 0

Hazlo ejecutable:

sudo chmod +x /etc/initramfs-tools/scripts/local-top/unlockusb

5. Configurar crypttab

Edita /etc/crypttab para usar la clave externa como respaldo:

# Ejemplo (ajusta "nvme0n1p3_crypt" a tu nombre de mapeo LUKS):
root-c	UUID=60d547fd-88c4-43f2-8ae3-d767039ba9c6	none	luks,discard

6. Preparar el USB

Copia la clave al USB:

sudo cp /root/cryptkey.key /media/usb/  # Monta el USB antes de copiar

7. Regenerar initramfs

Actualiza la imagen initramfs:

sudo update-initramfs -u -k all

8. Probar el arranque

Reinicia y verifica que el sistema lea la clave desde el USB:

sudo reboot

Notas importantes:

  • Etiqueta del USB: Asegúrate de que la etiqueta del USB coincida con el script.

  • Respaldos: Guarda una copia de la clave y la contraseña por si falla el USB.

  • Seguridad: El USB debe estar conectado solo durante el arranque.

Si encuentras errores, depura con:

sudo lsblk -f  # Verificar etiquetas y particiones
dmesg | grep -i crypto  # Buscar errores de descifrado