LUKS (Linux Unified Key Setup) es el formato estándar de cifrado de disco en Linux. Cifra un dispositivo de bloques completo y guarda en una cabecera las ranuras de claves (keyslots), de modo que puedes abrir el mismo volumen con varias frases de contraseña o archivos de clave y cambiarlas sin volver a cifrar los datos. En este tutorial cifrarás un disco secundario con LUKS2 en Ubuntu 24.04 usando cryptsetup, crearás un sistema de archivos, configurarás el desbloqueo y montaje automático al arrancar, y aprenderás a gestionar claves y a hacer copia de la cabecera.

Requisitos previos

  • Un servidor con Ubuntu 24.04 LTS, por ejemplo un VPS de CubePath.
  • Un usuario no root con privilegios sudo.
  • Un segundo disco o volumen vacío conectado al servidor. En esta guía se usa /dev/vdb; el nombre en tu sistema puede ser distinto.
  • Una copia de seguridad de cualquier dato que haya en ese disco: formatearlo con LUKS borra todo su contenido.

Paso 1: Instalar cryptsetup e identificar el disco

Instala cryptsetup, la herramienta que crea y gestiona volúmenes LUKS:

sudo apt update
sudo apt install cryptsetup

Comprueba la versión instalada:

cryptsetup --version
cryptsetup 2.7.0

Lista los discos para identificar el que vas a cifrar. Asegúrate de que no tiene particiones montadas ni está en uso:

lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINTS
NAME    SIZE TYPE FSTYPE MOUNTPOINTS
vda      40G disk
├─vda1   39G part ext4   /
├─vda14   4M part
├─vda15 106M part vfat   /boot/efi
vdb      50G disk

En este ejemplo, vdb es el disco secundario vacío. Revisa dos veces el nombre antes de seguir: si te equivocas de dispositivo, perderás datos.

Si quieres saber cuánto rendimiento vas a perder, cryptsetup benchmark mide la velocidad de cada algoritmo en tu CPU. Con aceleración AES-NI, aes-xts suele superar con holgura la velocidad del disco:

cryptsetup benchmark -c aes-xts-plain64 -s 512

Paso 2: Crear el volumen LUKS

luksFormat escribe la cabecera LUKS y define la primera frase de contraseña. En Ubuntu 24.04 los valores por defecto ya son adecuados: formato LUKS2, cifrado aes-xts-plain64 con clave de 512 bits y derivación de clave argon2id. Aun así, indicar --type luks2 deja claro qué formato estás usando:

sudo cryptsetup luksFormat --type luks2 /dev/vdb
WARNING!
========
This will overwrite data on /dev/vdb irrevocably.

Are you sure? (Type 'yes' in capital letters): YES
Enter passphrase for /dev/vdb:
Verify passphrase:

Escribe YES en mayúsculas y elige una frase de contraseña larga (varias palabras al azar funcionan bien). Guárdala en un gestor de contraseñas: si la pierdes y no tienes otra clave, los datos son irrecuperables.

Comprueba que el dispositivo es ahora un volumen LUKS:

sudo cryptsetup luksDump /dev/vdb
LUKS header information
Version:        2
...
Keyslots:
  0: luks2
        Key:        512 bits
        Priority:   normal
        Cipher:     aes-xts-plain64
        Cipher key: 512 bits
        PBKDF:      argon2id
...

Paso 3: Abrir el volumen y crear el sistema de archivos

Para usar el volumen hay que abrirlo. cryptsetup open pide la frase de contraseña y crea un dispositivo descifrado en /dev/mapper/ con el nombre que elijas, en este caso datos:

sudo cryptsetup open /dev/vdb datos

Comprueba su estado:

sudo cryptsetup status datos
/dev/mapper/datos is active.
  type:    LUKS2
  cipher:  aes-xts-plain64
  keysize: 512 bits
  key location: keyring
  device:  /dev/vdb
  sector size:  512
  offset:  32768 sectors
  size:    104824832 sectors
  mode:    read/write

A partir de aquí, /dev/mapper/datos se comporta como un disco normal. Todo lo que escribas en él se cifra antes de llegar a /dev/vdb. Crea un sistema de archivos ext4 y móntalo:

sudo mkfs.ext4 /dev/mapper/datos
sudo mkdir -p /mnt/datos
sudo mount /dev/mapper/datos /mnt/datos

Verifica el montaje escribiendo un archivo de prueba:

echo "prueba de cifrado" | sudo tee /mnt/datos/prueba.txt
df -h /mnt/datos
prueba de cifrado
Filesystem         Size  Used Avail Use% Mounted on
/dev/mapper/datos   49G   24K   47G   1% /mnt/datos

Paso 4: Añadir un archivo de clave

Para que el servidor pueda desbloquear el volumen al arrancar sin que nadie escriba la frase de contraseña, añade un archivo de clave en una segunda ranura. La frase de contraseña del paso 2 sigue siendo válida y te servirá como clave de recuperación.

Crea un archivo de 4 KiB con datos aleatorios en un directorio solo accesible por root:

sudo install -d -m 0700 /etc/luks-keys
sudo dd if=/dev/urandom of=/etc/luks-keys/datos.key bs=512 count=8
sudo chmod 0400 /etc/luks-keys/datos.key

Añádelo al volumen. cryptsetup te pedirá una clave existente, es decir, tu frase de contraseña:

sudo cryptsetup luksAddKey /dev/vdb /etc/luks-keys/datos.key

Comprueba que ahora hay dos ranuras ocupadas y que el archivo abre el volumen. --test-passphrase verifica la clave sin abrir nada:

sudo cryptsetup luksDump /dev/vdb | grep -E '^\s+[0-9]+: luks2'
sudo cryptsetup open --test-passphrase --key-file /etc/luks-keys/datos.key /dev/vdb && echo "La clave funciona"
  0: luks2
  1: luks2
La clave funciona

Paso 5: Desbloquear y montar automáticamente al arrancar

Ubuntu lee /etc/crypttab al arrancar para abrir volúmenes cifrados y después /etc/fstab para montarlos. Usa el UUID del dispositivo LUKS en lugar de /dev/vdb, porque los nombres de disco pueden cambiar:

sudo cryptsetup luksUUID /dev/vdb
4c1b2f6e-8a3d-4f7a-9c21-5e0d7b3a9f12

Edita /etc/crypttab:

sudo nano /etc/crypttab

Añade esta línea, sustituyendo el UUID por el tuyo:

datos UUID=4c1b2f6e-8a3d-4f7a-9c21-5e0d7b3a9f12 /etc/luks-keys/datos.key luks,discard

Los campos son: nombre del dispositivo en /dev/mapper/, dispositivo LUKS, archivo de clave y opciones. discard permite que las órdenes TRIM lleguen al almacenamiento subyacente, lo que conviene en SSD y almacenamiento virtualizado. A cambio, revela qué bloques están libres; si eso es un problema para ti, quítala.

Edita /etc/fstab:

sudo nano /etc/fstab

Añade la línea de montaje:

/dev/mapper/datos /mnt/datos ext4 defaults,nofail 0 2

nofail evita que el servidor se quede detenido en el arranque si el volumen no se puede abrir, algo importante en un servidor remoto.

Si prefieres no guardar el archivo de clave y abrir el volumen a mano, pon none en el tercer campo de crypttab y luks,noauto como opciones, y añade noauto a las opciones de fstab. Después de cada arranque abrirás y montarás el volumen tú mismo con sudo cryptsetup open /dev/vdb datos y sudo mount /mnt/datos.

Prueba la configuración sin reiniciar. Desmonta y cierra el volumen, recarga systemd para que genere las unidades a partir de crypttab y ábrelo con ellas:

sudo umount /mnt/datos
sudo cryptsetup close datos
sudo systemctl daemon-reload
sudo systemctl start [email protected]
sudo mount -a
cat /mnt/datos/prueba.txt
prueba de cifrado

Por último, reinicia el servidor y comprueba que el volumen se monta solo:

sudo reboot
findmnt /mnt/datos
TARGET     SOURCE            FSTYPE OPTIONS
/mnt/datos /dev/mapper/datos ext4   rw,relatime

Paso 6: Hacer copia de la cabecera LUKS

La cabecera contiene las ranuras de claves. Si se corrompe, ninguna clave podrá abrir el volumen y los datos se pierden. Haz una copia ahora y guárdala fuera del servidor, junto a tus copias de seguridad:

sudo cryptsetup luksHeaderBackup /dev/vdb --header-backup-file /root/vdb-luks-header.img
sudo chmod 0400 /root/vdb-luks-header.img

Descárgala a un lugar seguro y bórrala del servidor. Ten en cuenta que esa copia, junto con cualquier clave que fuera válida cuando la hiciste, permite abrir el volumen: protégela como protegerías la frase de contraseña. Si más adelante eliminas una clave, haz una copia nueva y destruye la antigua.

Para restaurarla en caso de corrupción:

sudo cryptsetup luksHeaderRestore /dev/vdb --header-backup-file vdb-luks-header.img

Paso 7: Cambiar y revocar claves

Para cambiar una frase de contraseña existente, luksChangeKey pide la actual y la nueva, y sustituye la ranura correspondiente:

sudo cryptsetup luksChangeKey /dev/vdb

Para revocar una clave concreta, luksRemoveKey pide la clave que quieres eliminar. Por ejemplo, para retirar el archivo de clave:

sudo cryptsetup luksRemoveKey /dev/vdb /etc/luks-keys/datos.key

Si conoces el número de ranura pero no la clave (por ejemplo, la de un antiguo administrador), usa luksKillSlot, que pide una clave diferente que siga siendo válida:

sudo cryptsetup luksKillSlot /dev/vdb 1

Solución de problemas

  • Device datos is still in use al cerrar: el sistema de archivos sigue montado o un proceso lo usa. Desmonta con sudo umount /mnt/datos y, si falla, busca el proceso con sudo lsof +f -- /mnt/datos.
  • No key available with this passphrase: la frase o el archivo de clave no coinciden con ninguna ranura. Comprueba la distribución del teclado y, con un archivo de clave, que no se haya modificado.
  • El volumen no se abre al arrancar: revisa sudo journalctl -b -u [email protected]. Los fallos habituales son un UUID mal copiado en crypttab o permisos incorrectos en el archivo de clave.
  • El servidor tarda en arrancar o entra en modo de emergencia: falta nofail en fstab. Accede por consola, añádela y reinicia.

Conclusión

Has cifrado un disco con LUKS2, creado un sistema de archivos sobre él, configurado su apertura y montaje automáticos con crypttab y fstab, guardado una copia de la cabecera y aprendido a rotar y revocar claves. Como siguientes pasos, puedes programar copias de seguridad cifradas de /mnt/datos a otro servidor, mover a este volumen los datos sensibles de tus aplicaciones (bases de datos, subidas de usuarios) y documentar dónde se guardan la frase de recuperación y la copia de la cabecera.