LUKS

Trabajando con unidades cifradas

Trabajando con unidades cifradas

A propósito de LUKS

El inquietante "Octopus Anti-monopoly", del artista americano George Luks, 1899

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. Además, aunque el cifrado del volumen se realiza con una única clave maestra, LUKS proporciona un sistema para que múltiples usuarios con distintas claves puedan acceder a dicha clave maestra. Para ello, 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. Cada clave almacenada en cada ranura permitirá el acceso a la clave maestra y, por lo tanto, el descifrado del volumen, con la ventaja de que estas claves individuales pueden ser añadidas y eliminadas a discreción, lo que permite gestionar la estrategia de accesos al volumen sin que el cifrado maestro se vea afectado..

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

Observar que como estamos cifrando el disco duro completo el nombre de dispositivo corresponde a un volumen entero, no a una partición

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 tenemos un disco duro externo para copias de seguridad que, al conectarlo, se muestra en /dev/sdb, y que queremos descifrarlo y montarlo en el directorio /mnt/external

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, para el caso de nuestro disco duro externo…

sudo mkdir /mnt/external

… y montamos utilizando el nombre previamente asignado en el mapeador

sudo mount /dev/mapper/encrypted_volume /mnt/external

Desmontar

Lo mismo pero al revés. Desmontamos el volumen y cerramos el volumen cifrado.

sudo umount /mnt/external
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 este caso se tratará de un disco interno que se muestra en /dev/sda y que queremos montar en /mnt/datos

  1. 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/sda   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 dispositivo cifrado y al no disponer de un archivo de clave nos la pedirá de manera interactiva. Una vez introducida el volumen quedará descifrado, mapeado y listo para ser montado.

  2. 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.

Publicado por David en Linux, Seguridad, 0 comentarios