LUKS

LUKS – El estándar de cifrado de discos para Linux que protege tus datos con múltiples capas de seguridad

Descripción del programa LUKS

LUKS (Linux Unified Key Setup) es una especificación de cifrado de discos diseñada específicamente para sistemas Linux, creada por Clemens Fruhwirth en 2004 con el objetivo de estandarizar la gestión de claves de cifrado en plataformas Linux.

A diferencia de los métodos de cifrado ad-hoc, LUKS proporciona un formato de disco independiente de la plataforma que garantiza la interoperabilidad entre diferentes herramientas y distribuciones Linux, además de ofrecer un sistema seguro y documentado para la gestión de contraseñas.

La implementación de referencia de LUKS utiliza cryptsetup como herramienta de gestión, trabajando sobre el subsistema dm-crypt del kernel de Linux, que proporciona cifrado transparente a nivel de bloque. Esta arquitectura permite cifrar desde particiones individuales hasta discos completos, incluyendo volúmenes RAID, LVM y hasta la partición de intercambio (swap).

Actualmente existen dos versiones principales de LUKS. LUKS1 es la versión original, que soporta hasta 8 ranuras de clave y utiliza PBKDF2 como función de derivación de clave. LUKS2 es la versión moderna introducida en 2018, que amplía el número de ranuras de clave a 32, utiliza el algoritmo Argon2 (más resistente a ataques de hardware) por defecto, y almacena metadatos en formato JSON, lo que mejora la robustez ante la corrupción de cabeceras. LUKS2 también permite el uso de autenticación mediante tokens FIDO2, TPM y tarjetas inteligentes.

Su principal fortaleza radica en ser el estándar de facto para el cifrado de discos en Linux, utilizado por todas las distribuciones principales (Ubuntu, Fedora, Debian, Red Hat, Arch Linux, etc.) e integrado directamente en sus instaladores. LUKS está disponible para Windows a través del Subsistema de Windows para Linux (WSL), y también es compatible con DragonFly BSD.

¿Necesitas proteger tus datos en Linux contra robos o pérdidas con un sistema de cifrado robusto, estándar y completamente integrado en el sistema operativo?

Características clave de LUKS

1. Cifrado a nivel de bloque con dm-crypt

LUKS utiliza el subsistema dm-crypt del kernel de Linux, que proporciona cifrado transparente a nivel de bloque. Esto significa que el cifrado se aplica directamente al dispositivo de bloque (disco, partición o volumen lógico) antes de que el sistema de archivos se monte sobre él. La ventaja principal es que cualquier sistema de archivos puede utilizarse sobre el dispositivo cifrado, y todas las operaciones de lectura/escritura se cifran/descifran automáticamente sin intervención del usuario.

El cifrado opera con algoritmos de alta seguridad. Por defecto, las distribuciones modernas utilizan AES-256 en modo XTS, que es el estándar recomendado para cifrado de discos. LUKS soporta múltiples algoritmos de cifrado, modos de operación y funciones hash, permitiendo la flexibilidad para elegir el nivel de seguridad deseado. El tamaño de clave predeterminado para XTS es de 256 bits, que internamente se duplica a 512 bits debido al funcionamiento del modo XTS.

2. Múltiples ranuras de clave (Key Slots)

Una de las características más distintivas de LUKS es su sistema de múltiples ranuras de clave independientes. LUKS1 permite hasta 8 ranuras, mientras que LUKS2 permite hasta 32 ranuras. Cada ranura puede contener una clave diferente derivada de:

  • Una contraseña proporcionada por el usuario
  • Un archivo clave (keyfile)
  • Autenticación mediante FIDO2 (llaves de seguridad físicas)
  • TPM (Trusted Platform Module) en sistemas compatibles
  • Tarjetas inteligentes o tokens criptográficos

Este diseño de múltiples ranuras permite que varios usuarios tengan sus propias contraseñas para el mismo disco cifrado, y facilita el cambio de contraseñas sin necesidad de reencriptar todo el disco. Cada ranura almacena la clave maestra de volumen cifrada con una clave derivada de la credencial del usuario mediante una función de derivación de clave (PBKDF2 en LUKS1, Argon2 en LUKS2).

3. Jerarquía de claves: Master Key y User Keys

LUKS implementa una arquitectura de claves en dos niveles que es fundamental para su flexibilidad:

  1. Clave Maestra de Volumen (Master Key): Es la clave real que se utiliza para cifrar y descifrar los datos del disco. Esta clave se genera aleatoriamente durante el cifrado inicial del volumen.
  2. Claves de Usuario (User Keys): Son las contraseñas, archivos clave o tokens de hardware que el usuario proporciona para desbloquear el volumen. Cuando el usuario introduce una contraseña, el sistema deriva una clave de cifrado mediante una función KDF (PBKDF2 o Argon2), y con ella descifra la Clave Maestra almacenada en la ranura correspondiente.

Esta jerarquía permite que los usuarios cambien sus contraseñas sin necesidad de reencriptar todo el disco. Solo es necesario volver a cifrar la Clave Maestra con la nueva clave derivada de la nueva contraseña y almacenarla en la ranura de clave correspondiente.

4. Funciones de derivación de clave modernas

LUKS utiliza funciones de derivación de clave (KDF) robustas para proteger las contraseñas contra ataques de fuerza bruta:

  • LUKS1: Utiliza PBKDF2 (Password-Based Key Derivation Function 2) como algoritmo de derivación. Por defecto, la iteración se ajusta para que el proceso de derivación tome aproximadamente 2 segundos en el hardware actual, lo que dificulta significativamente los ataques de fuerza bruta.
  • LUKS2: Utiliza Argon2 (el ganador del Password Hashing Competition) por defecto. Argon2 está diseñado específicamente para resistir ataques con hardware personalizado (como GPUs o FPGAs) y es considerado más seguro que PBKDF2. Argon2 permite configurar tres parámetros principales: tiempo de iteración, uso de memoria y paralelismo, lo que lo hace adaptable a diferentes entornos.

Es importante notar que para entornos que requieren certificación FIPS (Federal Information Processing Standards), Argon2 aún no está aprobado, por lo que debe utilizarse PBKDF2.

5. Cabecera LUKS con redundancia (LUKS2)

La cabecera LUKS almacena toda la información necesaria para descifrar el volumen: los parámetros de cifrado, las sales, los vectores de inicialización y las claves maestras cifradas en las ranuras.

LUKS2 mejora significativamente el manejo de la cabecera mediante:

  • Formato de metadatos JSON: Los metadatos se almacenan en formato legible y extensible, facilitando la interoperabilidad y la recuperación en caso de corrupción.
  • Cabecera redundante: LUKS2 mantiene una copia de seguridad de la cabecera en una ubicación separada del disco, lo que permite la recuperación incluso si la cabecera principal se daña.
  • Área de metadatos ampliable: A diferencia de LUKS1, que tiene un tamaño fijo de cabecera, LUKS2 permite expandir el área de metadatos para futuras extensiones.

La pérdida o corrupción de la cabecera LUKS hace que los datos sean irrecuperables, incluso si se conoce la contraseña correcta. Por esta razón, LUKS2 incluye la posibilidad de hacer copias de seguridad de la cabecera con el comando cryptsetup luksHeaderBackup.

6. Anti-forensic striping (AFsplitter)

LUKS1 implementa una técnica llamada AFsplitter (Anti-Forensic Splitter) que distribuye las claves maestras en «tiras» a través del espacio del disco. Cuando se elimina una clave (por ejemplo, al revocar una contraseña), las tiras asociadas se sobrescriben con datos aleatorios, lo que dificulta la recuperación forense de claves eliminadas. Esta característica está presente en LUKS1, mientras que LUKS2 maneja este aspecto de manera diferente debido a su estructura de metadatos JSON.

7. Integración nativa con instaladores de distribuciones Linux

La mayoría de las distribuciones Linux modernas ofrecen soporte nativo para LUKS durante la instalación:

  • Ubuntu: Ofrece la opción «Encrypt system» en el instalador Ubiquity, que cifra todas las particiones excepto /boot.
  • Fedora: Proporciona opciones de cifrado de disco tanto durante la instalación como mediante el comando systemd-cryptenroll para añadir tokens FIDO2 o TPM.
  • Debian: El instalador Debian-Installer permite configurar particiones cifradas con LUKS durante la instalación.
  • Arch Linux: Soporta LUKS completamente a través del comando cryptsetup, con documentación extensa en ArchWiki.

8. Integración con LVM y RAID

LUKS puede combinarse con LVM (Logical Volume Manager) y RAID de software de dos maneras:

  • LVM sobre LUKS: Todo el grupo de volúmenes LVM reside dentro de un único contenedor LUKS. Esto simplifica la gestión porque una sola contraseña descifra todas las particiones LVM. Es la configuración típica de las instalaciones de Ubuntu con cifrado de disco completo.
  • LUKS sobre LVM: Cada volumen lógico se cifra individualmente. Esto proporciona un control más granular, permitiendo que diferentes volúmenes tengan diferentes claves o algoritmos de cifrado. La estructura LVM es visible incluso antes de descifrar los volúmenes.

LUKS también funciona correctamente bajo configuraciones RAID de software (mdadm), ya que el cifrado opera a nivel de bloque y es independiente de la disposición física de los discos.

Explicación detallada del funcionamiento

La arquitectura de LUKS se basa en una interacción cuidadosamente diseñada entre varios componentes del sistema Linux: cryptsetup (la herramienta de usuario), dm-crypt (el módulo del kernel) y el dispositivo de bloque subyacente.

El flujo de trabajo típico para cifrar un nuevo dispositivo con LUKS es el siguiente:

  1. Preparación del dispositivo: Se identifica el dispositivo a cifrar (por ejemplo, /dev/sdb1). Opcionalmente, se puede sobrescribir el dispositivo con datos aleatorios para eliminar cualquier rastro de datos anteriores (dd if=/dev/urandom of=/dev/sdb1).
  2. Inicialización LUKS (luksFormat): Se ejecuta cryptsetup luksFormat /dev/sdb1. Este comando:
    • Genera la Clave Maestra de Volumen aleatoria.
    • Crea la cabecera LUKS al inicio del dispositivo, que incluye los parámetros de cifrado (algoritmo, modo, función hash, etc.).
    • Solicita al usuario una contraseña, la procesa mediante una función KDF (PBKDF2 o Argon2) y la utiliza para cifrar la Clave Maestra, almacenando el resultado en una ranura de clave (keyslot).
    • El usuario debe confirmar la operación escribiendo YES (en mayúsculas).
  3. Apertura del dispositivo (luksOpen): Una vez formateado, el dispositivo debe abrirse para poder utilizarlo: cryptsetup open /dev/sdb1 nombre_dispositivo. Este comando:
    • Lee la cabecera LUKS y solicita la contraseña.
    • Deriva una clave a partir de la contraseña e intenta descifrar la Clave Maestra en cada ranura de clave.
    • Si tiene éxito, utiliza la Clave Maestra descifrada para configurar un mapeo device-mapper en /dev/mapper/nombre_dispositivo. Este nuevo dispositivo de bloque se comporta como el original, pero todos los datos se descifran al leer y se cifran al escribir de forma transparente.
  4. Creación del sistema de archivos: Finalmente, se crea un sistema de archivos en el dispositivo mapeado: mkfs.ext4 /dev/mapper/nombre_dispositivo.
  5. Montaje: El dispositivo mapeado se monta como cualquier otro dispositivo de bloque: mount /dev/mapper/nombre_dispositivo /mnt/mipunto_montaje.

El flujo de trabajo para el montaje automático al inicio del sistema implica dos archivos clave:

  • /etc/crypttab: Este archivo especifica qué dispositivos LUKS deben abrirse automáticamente durante el inicio del sistema. Su formato es: <nombre_mapeo> <dispositivo> <archivo_clave> <opciones>. Por ejemplo: cryptdata /dev/sda3 none luks. El valor none indica que el sistema debe solicitar la contraseña interactivamente en la consola.
  • /etc/fstab: Una vez que el dispositivo está abierto y mapeado en /dev/mapper/nombre_mapeo, se monta en el sistema de archivos mediante una entrada en /etc/fstab, igual que cualquier otro dispositivo.

Para configurar el montaje sin contraseña interactiva, se puede crear un archivo clave (keyfile) y añadirlo al dispositivo LUKS con cryptsetup luksAddKey /dev/sda3 /ruta/al/keyfile. Luego, se referencia este archivo en la tercera columna de /etc/crypttab, lo que permite que el sistema abra el dispositivo sin intervención del usuario.

Descarga e instalación de LUKS

  • Página oficial: gitlab.com/cryptsetup/cryptsetup (implementación de referencia)
  • Especificación LUKS: LUKS On-Disk Format Specification
  • Versión actual de cryptsetup: 2.7.5 (2025) – la implementación de referencia de LUKS
  • Sistemas operativos compatibles:
  • Linux: Todas las distribuciones principales (compatible con kernels 2.6+)
  • Windows: A través del Subsistema de Windows para Linux (WSL)
  • BSD: DragonFly BSD
  • Otros: No compatible de forma nativa
  • Requisitos mínimos:
  • Kernel de Linux con soporte para dm-crypt y dm-integrity
  • Paquete cryptsetup instalado
  • Permisos de administrador (root)
  • Licencia: GPL-2.0+ para la implementación de referencia (cryptsetup)
  • Idiomas: Herramientas de línea de comandos en inglés; soporte Unicode para contraseñas
  • Soporte técnico: Documentación oficial (man cryptsetup), ArchWiki, listas de correo, foros de distribuciones

Instalación en distribuciones Linux:

  • Debian/Ubuntu: sudo apt install cryptsetup
  • Fedora/RHEL/CentOS: sudo dnf install cryptsetup
  • Arch Linux: sudo pacman -S cryptsetup
  • openSUSE: sudo zypper install cryptsetup

Cómo usar LUKS

Esta sección proporciona una guía práctica para las tareas más comunes con LUKS.

Paso 1: Verificar el estado de instalación de cryptsetup

Comprueba si cryptsetup está instalado en tu sistema:

cryptsetup --version

Si no está instalado, procede a instalarlo con el gestor de paquetes de tu distribución.

Paso 2: Cifrar un nuevo dispositivo (ejemplo: memoria USB)

Advertencia: Este proceso destruirá todos los datos existentes en el dispositivo. Asegúrate de seleccionar el dispositivo correcto y de haber hecho una copia de seguridad de los datos importantes.

  1. Identificar el dispositivo: Conecta el dispositivo y ejecuta lsblk para identificar su nombre (ej. /dev/sdb). lsblk
  2. (Opcional) Sobrescribir con datos aleatorios: Para mayor seguridad, puedes llenar el dispositivo con datos aleatorios. Este paso puede llevar mucho tiempo. sudo dd if=/dev/urandom of=/dev/sdb bs=1M status=progress o utiliza shred para un proceso más rápido pero menos seguro: sudo shred -v --iterations=1 /dev/sdb
  3. Formatear el dispositivo con LUKS: sudo cryptsetup luksFormat /dev/sdb Escribe YES (en mayúsculas) para confirmar e introduce una contraseña segura.
  4. Abrir el dispositivo LUKS: Asígnale un nombre (ej. mi_disco_cifrado). Se creará un mapeo en /dev/mapper/. sudo cryptsetup open /dev/sdb mi_disco_cifrado
  5. Crear un sistema de archivos: Formatea el dispositivo mapeado (ej. ext4). sudo mkfs.ext4 /dev/mapper/mi_disco_cifrado
  6. Montar el dispositivo:
    bash sudo mkdir -p /mnt/disco_cifrado sudo mount /dev/mapper/mi_disco_cifrado /mnt/disco_cifrado
    El dispositivo ahora está listo para usarse. Los datos se cifrarán y descifrarán automáticamente.

Paso 3: Cerrar y desmontar un dispositivo LUKS

  1. Desmontar el sistema de archivos: sudo umount /mnt/disco_cifrado
  2. Cerrar el mapeo LUKS: Esto elimina la entrada de /dev/mapper.
    bash sudo cryptsetup close mi_disco_cifrado

Paso 4: Gestionar contraseñas (ranuras de clave)

  1. Listar las ranuras de clave existentes: sudo cryptsetup luksDump /dev/sdb La salida muestra información sobre el cifrado y el estado de cada ranura de clave (activada/desactivada).
  2. Añadir una nueva contraseña (ranura de clave): sudo cryptsetup luksAddKey /dev/sdb Se te pedirá una contraseña existente (cualquiera de las ranuras activas) y luego la nueva contraseña a añadir.
  3. Cambiar una contraseña existente: sudo cryptsetup luksChangeKey /dev/sdb Se te pedirá la contraseña antigua y luego la nueva.
  4. Eliminar una contraseña: Necesitas saber qué ranura de clave ocupas.
    bash sudo cryptsetup luksRemoveKey /dev/sdb
    Se te pedirá la contraseña que deseas eliminar.

Paso 5: Configurar el montaje automático en el inicio del sistema

  1. Crear un archivo clave (keyfile): sudo dd if=/dev/urandom of=/etc/keys/luks-key bs=32 count=1 sudo chmod 0400 /etc/keys/luks-key El archivo clave debe tener permisos restringidos (solo lectura para root).
  2. Añadir el archivo clave al dispositivo LUKS: sudo cryptsetup luksAddKey /dev/sdb /etc/keys/luks-key Se te pedirá una contraseña existente para autorizar la operación.
  3. Editar /etc/crypttab: Añade una línea para el dispositivo. sudo nano /etc/crypttab Formato: <nombre_mapeo> <dispositivo> <archivo_clave> <opciones>
    Ejemplo: mi_disco_cifrado UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /etc/keys/luks-key luks Puedes obtener el UUID del dispositivo con sudo blkid /dev/sdb.
  4. Editar /etc/fstab: Añade una línea para montar el sistema de archivos.
    bash sudo nano /etc/fstab
    Ejemplo:
    /dev/mapper/mi_disco_cifrado /mnt/disco_cifrado ext4 defaults 0 2

Observaciones sobre LUKS

Frente a otras soluciones de cifrado de disco como VeraCrypt (multiplataforma) o BitLocker (Windows), LUKS destaca por ser el estándar nativo y mejor integrado en el ecosistema Linux. Su presencia directa en el kernel (a través de dm-crypt) y su integración con herramientas de sistema como systemd-cryptenroll y los instaladores de distribuciones lo convierten en la opción más transparente y de menor fricción para los usuarios de Linux.

Para el usuario final, el beneficio práctico de LUKS es no tener que aprender herramientas adicionales. Si se activa durante la instalación del sistema operativo, el proceso de cifrado es completamente transparente. El sistema solicitará la contraseña al inicio, y el resto de la experiencia de usuario es idéntica a la de un sistema sin cifrar.

LUKS2, introducido en 2018, resolvió las principales limitaciones de LUKS1. El cambio a metadatos JSON y la cabecera redundante hacen que los volúmenes LUKS2 sean mucho más resistentes a la corrupción de datos. La adopción de Argon2 como KDF por defecto mejora significativamente la resistencia contra ataques de fuerza bruta con hardware especializado.

La integración con FIDO2 y TPM es una de las evoluciones más importantes recientes. Permite desbloquear el sistema con una llave de seguridad física (como una YubiKey) o mediante el TPM del equipo, lo que añade una capa de autenticación de dos factores muy valiosa. Fedora, en particular, ha liderado la integración de FIDO2 con LUKS2 a través de systemd-cryptenroll.

En cuanto a la compatibilidad entre versiones, LUKS2 puede leer cabeceras LUKS1, pero LUKS1 no puede leer cabeceras LUKS2. Se puede convertir un volumen LUKS1 a LUKS2 con el comando cryptsetup convert --type luks2, aunque no todas las características de LUKS2 estarán disponibles después de la conversión.

Una consideración importante es que la partición /boot a menudo no está cifrada en configuraciones típicas, porque el gestor de arranque (GRUB) necesita leer el kernel y el initramfs. Sin embargo, GRUB tiene soporte limitado para LUKS2 (aunque no para LUKS2 con Argon2), y algunos sistemas pueden cifrar /boot con configuraciones específicas. Existen soluciones como sbctl para sistemas con SecureBoot que permiten tener /boot sin cifrar pero firmado criptográficamente para garantizar su integridad.

Limitaciones importantes

  • Soporte limitado para Windows: Aunque puede usarse a través de WSL, no hay una integración nativa como en Linux.
  • Partición /boot problemática: El gestor de arranque GRUB tiene soporte limitado para LUKS2, especialmente con Argon2, lo que a menudo obliga a dejar /boot sin cifrar o a usar configuraciones complejas.
  • Recuperación de cabecera crítica: La pérdida de la cabecera LUKS (especialmente en LUKS1) hace que los datos sean irrecuperables, incluso con la contraseña correcta. LUKS2 mejora esto con cabeceras redundantes, pero sigue siendo un punto crítico.
  • Sin negación plausible: A diferencia de VeraCrypt, LUKS no ofrece de forma nativa la posibilidad de crear volúmenes ocultos dentro de otros volúmenes para negación plausible.
  • Rendimiento en discos duros mecánicos: El cifrado puede impactar el rendimiento en HDDs antiguos, aunque en SSDs modernos con aceleración AES-NI la diferencia es imperceptible.

Alternativa recomendada

Si buscas una solución de cifrado multiplataforma (Windows, macOS, Linux) con características avanzadas como volúmenes ocultos y negación plausible, VeraCrypt es la alternativa más recomendada. Es de código abierto, gratuito y ampliamente auditado, aunque carece de la integración nativa en el kernel que tiene LUKS.

Si trabajas en entornos Windows y necesitas cifrado de disco completo, BitLocker es la solución integrada en las ediciones Pro y Enterprise de Windows. Es fácil de usar y se integra con TPM, pero es propietario y no está disponible para Linux.

Si necesitas cifrado de archivos individuales en lugar de discos completos, GnuPG permite cifrar archivos específicos con claves asimétricas o simétricas. Para cifrado de directorios sincronizados con la nube, Cryptomator es una excelente opción.

LUKS es la solución de cifrado de disco estándar para Linux, combinando seguridad robusta, flexibilidad y una integración profunda con el sistema operativo. Su adopción por todas las distribuciones principales y su soporte para tecnologías modernas como FIDO2 y TPM lo convierten en la opción indiscutible para cualquier usuario o administrador de sistemas Linux que necesite proteger datos en reposo. Puedes comenzar a usarlo activando el cifrado durante la instalación de tu distribución o utilizando cryptsetup en la línea de comandos.

Sección FAQ

¿LUKS es gratis o de pago?

LUKS es completamente gratuito y de código abierto. La implementación de referencia (cryptsetup) se distribuye bajo licencia GPL-2.0+. No tiene versiones de pago ni funcionalidades bloqueadas.

¿Funciona en Linux, macOS, Windows 10 y Windows 11?

LUKS está diseñado para Linux y funciona en todas las distribuciones principales. Es compatible con Windows a través del Subsistema de Windows para Linux (WSL). También es compatible con DragonFly BSD. No existe soporte nativo para macOS, aunque se puede acceder a volúmenes LUKS mediante herramientas de terceros o máquinas virtuales.

¿Qué diferencia a LUKS de otras alternativas similares?

Su principal diferencia es la integración nativa con el kernel de Linux. LUKS es el estándar de facto en el ecosistema Linux, soportado por todas las distribuciones e integrado en sus instaladores. A diferencia de VeraCrypt (multiplataforma) o BitLocker (Windows), LUKS está optimizado para el kernel de Linux y utiliza directamente sus capacidades criptográficas (dm-crypt). LUKS2 también introduce características modernas como el algoritmo Argon2 y metadatos JSON que mejoran la seguridad y robustez.

¿Cómo puedo recuperar el acceso si pierdo mi contraseña de LUKS?

LUKS permite múltiples contraseñas en diferentes ranuras de clave. Si has añadido más de una contraseña, puedes usar cualquiera de ellas. Si has perdido todas las contraseñas pero tienes un archivo clave (keyfile) configurado, puedes usarlo para desbloquear el volumen. Sin contraseña ni archivo clave, los datos son irrecuperables, ya que LUKS no tiene puertas traseras.

¿Qué ha pasado con el desarrollo de LUKS?

El desarrollo de LUKS está muy activo a través de la herramienta cryptsetup. La versión LUKS2 se introdujo en 2018 y ha recibido mejoras continuas. El soporte para autenticación mediante tokens FIDO2 y TPM se ha añadido en versiones recientes de systemd-cryptenroll y se integra perfectamente con LUKS2. El proyecto está alojado en GitLab y recibe contribuciones regulares de desarrolladores de Red Hat, SuSE, y la comunidad.