Cifrando discos con LUKS2
El cifrado de almacenamiento está en todas partes y en ninguna al mismo tiempo. Se utiliza en todo tipo de dispositivos, pero un estudio realizado en varios países demuestra que tanto los usuarios comunes como las empresas no se toman realmente enserio la protección de los datos personales.
Actualmente estamos viviendo una época un poco convulsa.
Con el tema de la RGPD, el NIS2, la ISO27001... Los datos personales son bastante preocupantes. Y no solo por las multas que podemos recibir, sino por el acceso a datos relevantes que ponen en riesgo no solo los propios datos, sino la integridad de la propia empresa.
Yo, a nivel particular, utilizo un sistema de cifrado fiable en todos los dispositivos que me permiten implantarlo (véase mis equipos portátiles y sobremesa).
LUKS2: ¿qué es?

LUKS (Linux Unified Key Setup) es una especificación de cifrado de disco, originalmente destinado para Linux, así como Windows dispone de Bitlocker.
Especifica un formato en disco estándar, independiente de plataforma. Facilita la compatibilidad y la interoperabilidad entre los diferentes programas mientras que ellos garanticen la gestión de contraseñas en un lugar seguro.
Utiliza dm-crypt como la interfaz de cifrado de disco (realiza el cifrado/descifrado de los sectores de datos cuando el dispositivo está abierto) y cryptsetup es la herramienta de espacio de usuario que normalmente configura y administra LUKS2.
Estructura LUKS2

La estructura contiene el header con los metadatos necesarios:
Identificación del volúmen
UUID
Versión del formato
Información sobre los segmentos
Configuración criptográfica
Keyslots
Y después tiene los datos (o bloques) cifrados mediante dm-crypt.
¿Por qué LUKS2 es seguro?
Cuando creamos el volúmen LUKS2, la contraseña (o contraseñas) proporcionadas no son almacenadas en el disco, sino que se utiliza como entrada para una función de derivación de claves (KDF).
Esto permite separar la contraseña del usuario de la clave de descifrado, de tal forma que podemos tener varios keyslots (varias contraseñas) que podrán acceder al mismo contenido. Si en algún momento queremos dar de bajar una contraseña por el motivo que sea (baja del usuario, sospecha de robo de credenciales...) podremos hacerlo sin tener que volver a cifrar todo el volúmen, conllevando así tener que formatear y volver a empezar todo el proceso.
Con un USB de 32GB puede valer, pero cuando tienes 7TB no creo que se quiera aceptar ese riesgo.
¿Qué es un keyslot?
Un keyslot es una entrada de LUKS que permite utilizar una determinada credencial para desbloquear la misma clave de volumen.
Si tuvieramos 3 contraseñas dispondríamos de 3 keyslots, los cuales los 3 accederían a la misma clave maestra que desbloquea los datos.
Hablemos de materia criptográfica
Cuando introducimos la contraseña para desbloquear el dispositivo, esta se transforma en material criptográfico mediante KDF, que generalmente usa Argon2id.
Argon2id recibe la contraseña junto con un salt aleatorio y varios parámetros de coste. El salt no es secreto y se almacena en los metadatos de LUKS2.
Un atacante que robe físicamente un SSD LUKS2 puede copiar todos sus metadatos y datos cifrados y trabajar sobre ellos sin interactuar con el sistema original. Por tanto, debe suponerse que puede realizar intentos de contraseña a voluntad.
Si cada intento consistiera simplemente en calcular un SHA-256, podría realizar una enorme cantidad de intentos utilizando hardware especializado.
Argon2id hace que cada intento requiera una cantidad considerable de memoria y tiempo, haciendo mucho más caro el ataque.
El resultado de Argon2id no se utiliza para descifrar directamente los datos del disco.
Se utiliza para desbloquear el keyslot correspondiente.
El keyslot contiene el material criptográfico necesario para recuperar la Volume Key, protegido de tal manera que solamente una persona que conozca la credencial correcta pueda recuperarla.
Por tanto, la contraseña proporciona una forma de acceder a la Volume Key, pero no es la clave con la que se cifra el filesystem.
En cuanto al cifrado utiliza aes-xts-plain64, con una clave de 512 bits.

Configuración rápida de LUKS2 en disco secundario
Indentificamos el disco.
lsblk -fCreamos una partición
fdisk /dev/vdbFormateamos con luks2
cryptsetup luksFormat --type luks2 /dev/vdb1Pedirá una contraseña para cifrar la clave maestra de LUKS2 y eliminará los datos existentes en el disco/partición.
Añadimos una segunda contraseña
cryptsetup luksAddkey /dev/vdb1Nos pedirá una contraseña ya existente y después la nueva que queramos añadir. creando así el segundo slot.
Podemos comprobarlo
cryptsetup luksDump /dev/vdb1[OPCIONAL] Crear un keyfile
Se puede desbloquear el disco mediante un fichero, pero debe tener suficiente aleatoriedad.
mkdir -p /root/luks-keys
dd if=/dev/urandom of=/root/luks-keys/datos.key bs=64 count=1 status=noneLo añadimos a las cabeceras LUKS2.
cryptsetup luksAddKey /dev/sdb1 /root/luks-keys/datos.keyAbrimos el volúmen
cryptsetup open /dev/vdb1 datosEsto nos creará un dispositivo de bloques virtuales creado por el subsistema del kernel Device Mapper, permitiendo al kernel presentar un dispositivo de bloques virtual y aplicar transformaciones sobre las operaciones de lectura/escritura.
En este caso nos habrá creado un /dev/mapper/datos .
Creamos el sistema de ficheros y lo montamos
mkfs.ext4 /dev/mapper/datos
mkdir /mnt/DatosLuks2
mount -t ext4 /dev/mapper/datos /mnt/DatosLuks2
Si cerramos el dispositivo con:
umount /mnt/DatosLuks2
cryptsetup close datos
Y si tratamos de abrirlo otra vez nos volverá a pedir la contraseña:

Y hasta aquí el post de hoy. Espero que te haya resultado útil y que te haya servido para aprender algo nuevo o resolver alguna duda.
Nos vemos en el próximo artículo.




Comentarios