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.
Notael cifrado de disco protege los datos en reposo, por ejemplo si un disco se retira, se reutiliza o se copia sin el servidor en marcha. Con el volumen abierto, los datos son accesibles para cualquiera con acceso al sistema, así que LUKS complementa, no sustituye, el control de acceso y las copias de seguridad.
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
Importanteel archivo de clave está en el disco del sistema sin cifrar. Esto protege el volumen de datos si se copia o se retira por separado, pero no si alguien obtiene también el disco del sistema. Si necesitas que nadie pueda abrir el volumen sin intervención humana, omite este paso y usa la opción
noautodescrita en el paso 5.
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
Advertenciano elimines nunca la última clave válida. Antes de revocar una ranura, comprueba con
luksDumpque quedará al menos otra y que la conoces.
Solución de problemas
Device datos is still in useal cerrar: el sistema de archivos sigue montado o un proceso lo usa. Desmonta consudo umount /mnt/datosy, si falla, busca el proceso consudo 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 encrypttabo permisos incorrectos en el archivo de clave. - El servidor tarda en arrancar o entra en modo de emergencia: falta
nofailenfstab. 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.
