Criptografía.

Cómo encriptar o cifrar un dispositivo de almacenamiento USB con ‘Linux Unified Key Setup’ (LUKS)

LUKS (de sus siglas en inglés, Linux Unified Key Setup) es una especificación de cifrado de disco creado por Clemens Fruhwirth, originalmente destinada a sistemas GNU/Linux. Mientras que la mayoría del software de encriptación de discos se basan en diferentes formatos no documentados e incompatibles entre sí, LUKS especifica un formato estándar en disco, independiente de la plataforma, para usar en diversas herramientas. Esto facilita la compatibilidad y la interoperabilidad entre los diferentes programas.

La aplicación de referencia funciona en GNU/Linux y se basa en una versión mejorada de cryptsetup, utilizando dm-crypt como la interfaz de cifrado de disco. En Microsoft Windows, los discos encriptados con LUKS pueden ser utilizados con FreeOTFE (proyecto abandonado) o DoxBox.

En septiembre de 2013, Phoronix publicó una comparativa de rendimiento entre LUKS y eCryptfs. Obtuvo mejor rendimiento encriptando todo el disco con LUKS, que sólo el directorio de datos de usuario con eCryptfs.

Hay varias maneras de usar LUKS para encriptar los datos almacenados en un dispositivo USB. En esta ocasión, sólo contemplaré una de las maneras de encriptar una partición. En otro artículo veremos cómo encriptar un archivo.

En cualquier caso, es necesario tener instalado el paquete cryptsetup y todas sus dependencias. En Debian:

~$ su -
~# apt-get update
~# apt-get upgrade
~# apt-get install cryptsetup

Encriptar una partición con LUKS

Debido a la falta de funcionalidad de Windows, sólo puede ser utilizada la primera partición de la unidad. Así que, si quieres encriptar una partición y que ésta sea portable entre los dos sistemas operativos (GNU/Linux y Windows), tendrás que formatear la unidad USB con una sola partición.

Los gestores de archivos actuales, como Thunar (Xfce) o Nautilus (Gnome), soportan el reconocimiento automático de particiones de LUKS. Estos gestores solicitarán la contraseña del dispositivo encriptado cuando éste se conecte y montará la partición como una unidad extraible. Esta integración es extremadamente útil para el trabajo diario pero implica que no podrás usar un “archivo-llave”, sólo será posible introducir la contraseña manualmente.

Recuerda que los siguientes pasos eliminarán todo el contenido del dispositivo de almacenamiento empleado. Haz copias de seguridad de todo y, para evitar confusiones desagradables, desconecta todos los dispositivos de almacenamiento antes de empezar.

1. Extrae todos los dispositivos de almacenamiento USB

Desmonta y desconecta todos los dispositivos de almacenamiento que estén pinchados a cualquier puerto USB (discos duros, memorias USB, incluso tarjetas SD).

2. Conecta el dispositivo de almacenamiento a encriptar

Conecta a un puerto USB fiable la unidad de almacenamiento que vayas a encriptar. Si es un disco duro con fuente de alimentación eléctrica propia, recuerda conectarla para que el disco funcione…

3. Determina qué unidad ha sido asignada al dispositivo a encriptar

Utiliza el comando dmesg para obtener el nombre asignado al dispositivo recién conectado. Compruébalo con sumo cuidado, si te confundes podrías eliminar todo el contenido de una partición del disco duro interno de tu ordenador.

~$ dmesg

En este caso, las últimas líneas son éstas:

sd 8:0:0:0: [sdc] Attached SCSI disk
EXT4-fs (sdc1): mounting ext3 file system using the ext4 subsystem
EXT4-fs (sdc1): mounted filesystem with ordered data mode. Opts: (null)

Así, en este ejemplo, la unidad será la sdc (/dev/sdc) y la primera y única partición será la sdc1 (/dev/sdc1).

4. Desmonta la partición

A partir de aquí es necesario que inicies sesión como usuario root:

~$ su -

Desmonta la partición con el comando umount:

~# umount /dev/sdc1

5. Elimina la tabla de particiones y crea una nueva

Utiliza el comando fdisk:

~# fdisk /dev/scd

Para eliminar la tabla de particiones existente actualmente en la unidad y crear una nueva tabla vacía, utiliza la opción o:

Command (m for help): o

Que devolverá algo similar a esto:

Building a new DOS disklabel with disk identifier 0x2a43cc04.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Ahora escribe los cambios con la opción w:

Command (m for help): w

Que, si todo ha ido bien, devolverá esto:

The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.

6. Crea una nueva partición

Crea la nueva partición primaria que contendrá los datos encriptados con LUKS. Para ello, utiliza fdisk de nuevo:

~# fdisk /dev/sdc

Utiliza la opción n para crear la nueva partición:

Command (m for help): n

Utiliza la opción p para que la nueva partición sea primaria (opción por defecto, pulsando Intro es suficiente):

Partition type:
p   primary (0 primary, 0 extended, 4 free)
e   extended
Select (default p): p

La nueva partición primaria será la primera (opción por defecto, pulsando Intro es suficiente):

Partition number (1-4, default 1): 1

Indica cuál será el primer sector de la nueva partición (el valor más bajo por defecto, pulsando Intro es suficiente):

First sector (2048-1953525167, default 2048): 2048

Indica cuál será el último sector de la nueva partición. En este caso, una única partición primaria ocupará todo el espacio de almacenamiento de la unidad (el valor más alto por defecto, pulsando Intro es suficiente):

Last sector, +sectors or +size{K,M,G} (2048-1953525167, default 1953525167): 1953525167

Ahora debes escribir todos los cambios realizados, usa la opción w:

Command (m for help): w

Que, si todo ha ido bien, devolverá esto:

The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.

La nueva partición estará ahora accesible en /dev/sdc1.

7. Encripta la nueva partición

Utiliza el comando cryptsetup con la opción luksFormat para cifrar con LUKS la nueva partición:

~# cryptsetup luksFormat /dev/sdc1

Te preguntará si estás seguro/a (escribre YES, en mayúsculas) y una “frase de paso” o contraseña-larga-y-compleja dos veces:

WARNING!
========
Esto sobreescribirá los datos en /dev/sdc1 de forma irrevocable.

Are you sure? (Type uppercase yes): YES
Introduzca la frase contraseña: NKu3yi8_mf93+msKL6*lg4aq
Verifique la frase contraseña: NKu3yi8_mf93+msKL6*lg4aq

8. Da formato a la nueva partición encriptada

Utiliza de nuevo el comando cryptsetup pero esta vez con la opción luksOpen para desencriptar la partición. Debes también darle un nombre único para el mapeo, en este ejemplo usaremos el nombre LUKS0001:

~# cryptsetup luksOpen /dev/sdc1 LUKS0001

Que pedirá la contraseña asignada en el paso anterior:

Introduzca la frase contraseña de /dev/sdc1: NKu3yi8_mf93+msKL6*lg4aq

Debes escoger ahora el formato que mejor se adapte a tus necesidades. Si vas a usar el dispositivo en GNU/Linux y Windows indistintamente, deberías optar por FAT32 si no vas a guardar archivos de más de 4GB (comando mkfs.vfat, requiere tener instalado el paquete dosfstools) o NTFS si vas a almacenar archivos de más de 4GB (comando mkfs.ntfs, requiere tener instalado el paquete ntfs-3g). Si sólo lo vas usar en máquinas con GNU/Linux, EXT4 (comando mkfs.ext4) será una buena opción.

Las opciones -L y -n sirven para darle un nombre reconocible a la unidad. En este ejemplo usaremos en nombre ENCRIPTADO.

Para formatear como EXT4:

~# mkfs.ext4 /dev/mapper/LUKS0001 -L ENCRIPTADO

Para formatear como FAT32:

~# mkfs.vfat /dev/mapper/LUKS0001 -n ENCRIPTADO

Para formatear como NTFS:

~# mkfs.ntfs /dev/mapper/LUKS0001 -L ENCRIPTADO

Por último, cierra la partición:

~# cryptsetup luksClose LUKS0001

9. Probando…

Desconecta ahora el dispositivo de almacenamiento y vuelve a conectarlo. Si todo ha ido bien, y dependiendo de tu entorno de escritorio y de cómo lo tengas configurado, antes de poder acceder al contenido del dispositivo de almacenamiento deberás facilitar la contraseña asignada:

Volumen LUKS en Xfce.
Xfce (Thunar) solicitará la contraseña del volumen encriptado con LUKS.

Miguel Menéndez

Administrador de sistemas, auditor de redes y seguridad.