A propósito de LUKS

El inquietante «Octopus Anti-monopoly», del artista americano George Luks, 1899
LUKS, además de un peculiar artista norteamericano, son las siglas para «Linux Unified Key Setup», que vendría a ser un conjunto de especificaciones para el cifrado de discos duros. Aunque su nombre deja claro que fue creado inicialmente para trabajar en entornos Linux, la realidad es que su implementación ha originado un estándar que es en la práctica independiente de plataforma y que puede ser utilizado por diferentes herramientas en sistemas diferentes. Concretamente, LUKS trabaja sobre dispositivos de bloque, por lo que el contenido del mismo resulta arbitrario, pudiendo funcionar con cualquier sistema de archivos. Cada volumen LUKS dispone de una cabecera con un conjunto de ranuras (slots), cada una de las cuales puede almacenar una clave de cifrado junto con los parámetros necesarios para el manejo de la misma. El número de ranuras dependerá de la versión de implementación de LUKS, siendo 8 lo más habitual.
LUKS puede ser utilizado tanto para cifrar particiones individuales como sistemas de archivos completos, incluyendo la partición de arranque. Esto es especialmente útil en portátiles, teniendo en cuenta el riesgo que supone para nuestra privacidad cualquier percance que pudiera terminar con nuestros preciados datos en manos de desconocidos.
Para el cifrado del sistema de archivos completo los asistentes de instalación de la mayoría de las distribuciones de Linux suelen incluir una opción para realizarlo de manera transparente durante la instalación, por lo que no nos vamos a detener en este punto.
En nuestro caso nos centraremos en el cifrado de un disco completo al margen de nuestro disco de sistema, ya sea porque se trate de un disco externo con copias de seguridad que queremos llevar de aquí para allá, ya sea porque queremos que los datos del disco secundario de nuestro ordenador de escritorio estén a buen recaudo.
El cifrado
Para empezar, lo primero es asegurarnos de que tenemos instalado el paquete «cryptsetup»
sudo apt install cryptsetup
Y, a continuación, ciframos el disco completo:
sudo cryptsetup -v -y luksFormat /dev/sda
Tras lo cual nos pedirá una frase de contraseña
Una vez cifrado el disco duro podremos darle el formato deseado (recordemos que, a diferencia de otros sistemas de cifrado de disco duro, LUKS es totalmente independiente del formato y compatible con cualquier formato de disco)
Montar
Supongamos que nuestro volumen está en /dev/sdb (Como estamos cifrando el disco completo utilizamos el nombre del volumen, no de una partición)
Comenzamos utilizando el comando cryptsetup para abrir el volumen cifrado y añadirlo al mapeador de dispositivos (Device Mapper) con el nombre que elijamos, en este caso, «encrypted_volume»
sudo cryptsetup luksOpen /dev/sdb encrypted_volume
Si aún no hemos creado un punto de montaje…
sudo mkdir /mnt/datos
… y montamos utilizando el nombre asignado en el mapeador
sudo mount /dev/mapper/encrypted_volume /mnt/datos
Desmontar
Lo mismo pero al revés. Desmontamos el volumen y cerramos el volumen cifrado.
sudo umount /mnt/datos
sudo cryptsetup luksClose encrypted_volume
Montaje automático
Si lo que queremos es que el montaje de la unidad cifrada se realice automáticamente al arrancar el sistema necesitamos realizar los dos pasos configurando los respectivos archivos crypttab y fstab:
- En primer lugar, añadimos el dispositivo cifrado a la tabla del archivo /etc/crypttab, especificando el nombre que queramos y el archivo de dispositivo correcto.
sudo nano /etc/crypttab # <target name> <source device> <key file> <options> encrypted_volume /dev/sdb none
La opción «none» indica que no queremos especificar un archivo de clave.
En este momento podemos reiniciar la máquina y ver qué pasa: Durante el arranque, el sistema intentará abrir el disposivo cifrado y al no disponer de un archivo de clave nos la pedirá de manera interactiva. El volumen quedará descifrado, mapeado y listo para ser montado. - Sin embargo, como es lógico, querremos que el dispositivo se monte de manera automática en un directorio de nuestra elección. Esto lo especificamos, como siempre, en el archivo fstab de la manera habitual. Únicamente que, en lugar de referirnos al dispositivo físico, lo haremos al volumen previamente descifrado y disponible en el mapeador de dispositivos.
sudo nano /etc/fstab # disco cifrado /dev/mapper/encrypted_volume /mnt/datos ext4 defaults 0 2
Ahora podemos reiniciar de nuevo. El sistema nos mostrará un diálogo para pedirnos la contraseña y, al finalizar el arranque, el disco estará montado y disponible en nuestro sistema de archivos.
Montaje automático desatendido
Puede interesarnos que el montaje de la unidad cifrada se realice sin necesidad de introducir manualmente la contraseña. Esto es particularmente útil cuando queremos iniciar servidores de forma remota o automática. Existen varias maneras de implementar esta función, pero la más sencilla consiste en utilizar un fichero de clave almacenado en el propio servidor.
Que quede claro: el fichero puede ser cualquiera y tener cualquier contenido. Es habitual crear largos archivos con una sucesión aleatoria de datos pero, sinceramente, si alguien se hace con el fichero, tanto da la complejidad del mismo. Para que el fichero pueda ser utilizado para descifrar el disco deberá ser añadido a una de las ranuras de la cabecera del volumen LUKS
Por convención, guardaremos el fichero en la siguiente ruta:
/root/luks_keyfile
A continuación añadimos el fichero a las claves de LUKS
sudo cryptsetup luksAddKey /dev/sda/ /root/luks_keyfile
Nos pedirá una contraseña válida para este volumen.
Ahora, para que el descifrado se realice con dicho fichero, sólo queda especificarlo en el archivo crypttab en lugar de «none»
sudo nano /etc/crypttab
# <target name> <source device> <key file> <options>
encrypted_volume /dev/sda /root/luks_keyfile
Y… ya está.
Nota: En tanto que cualquier fichero puede servir de clave y, en este caso, debe residir necesariamente en el servidor, es una buena idea disimular un poco de qué fichero se trata. En este ejemplo se lo hemos puesto a huevo a cualquiera que se quiera hacer con el contenido de nuestro disco duro (aunque si nos roban el servidor, teniendo en cuenta que se monta solo, tampoco harían falta muchas luces). En cualquier caso, si lo que queremos es ponerlo un poquito más difícil a un ladrón despistado, la posibilidad más obvia es utilizar un fichero arbitrario con un nombre arbitrario y un contenido arbitrario guardado en un lugar arbitrario. Ah! y no debemos tener miedo de perderlo, ya que la contraseña que hayamos utilizado para cifrar inicialmente el volumen siempre nos va a servir.