Grupo Linuxero del Bajío

Linux Unified Key Setup

Víctor Manuel Jáquez Leal

Compré un SSD externo con interfaz USB3 como dispositivo de respaldo. En realidad ya no me cabían tantos “repositorios” en mi computadora y siempre es necesario tener espacio libre en disco para maniobrar.

No obstante, no quiero que la información que está allí almacenada pueda ser leída por cualquiera sin mi consentimiento. Son mis datos, y como la intimidad, éstos no se toman por asalto, sino por consenso. Es por ello que decidí enterarme en cómo usar el cifrado de discos duros.

Para cifrar discos duros se usa el comando cryptsetup, que es la interfaz de usuario para módulo del kernel dm-crypt, que a su vez usa la infraestructura del kernel llamada device-mapper, cuya función es mapear dispositivos físicos de bloques (discos) a un dispositivo virtual de bloques de alto nivel, donde podemos tener servicios como Linux volume manager, dm-cache, etc.. Distribuciones como Debian o Fedora instalan esta funcionalidad por defecto.

Sin embargo, cryptsetup solo es algo árido de utilizar, es como irse por la piedritas. Una forma simplificada y mejorada es a través de LUKS (Linux Unified Key Setup) y es lo que usaré.

Primero enchufemos el disco a la computadora y veamos a que dispositivo mapea (yo lo hago viendo la salida journalctl -fx). Aunque podemos cifrar particiones específicas, a mi me interesa que todo el disco lo esté. Para los fines de este documento, trabajaré con el hipotético dispositivo sdX.

Ahora inicialicemos el disco con LUKS. Tengan presente que esta operación borrará toda la información que tengan en ese disco.

sudo cryptsetup luksFormat --verbose --verify-passphrase --hash sha512 --key-size 512 luksFormat /dev/sdX

En el comando anterior (–verbose) imprimirá información del comando en ejecución, (–verify-passphrase) pedirá dos veces la contraseña para confirmar, (–hash) fijará el algoritmo SHA-2 con 512 bits para hacer el hash de la contraseña, y (–key-size) especifica una llave de 512 bits.

Ahora visualicemos la información de cifrado que quedó en el disco:

sudo cryptsetup luksDump /dev/sdX

Pero no me gusta teclear contraseñas constantemente. Lo chido sería tener un archivo con la llave para acceder al disco y no teclear contraseñas. Aquí LUKS entra al rescate: permite que un dispositivo tenga varias contraseñas. Por ejemplo, un mismo disco externo puede ser usado por varias personas sin que compartan una misma contraseña, y no sólo permite frases como contraseñas, sino también ficheros con datos aleatorios.

Generemos un archivo aleatorio que servirá como contraseña:

dd bs=1024 count=4 if=/dev/urandom of=~/extHD-1.key iflag=fullblock

En este momento tenemos un archivo con 4096 bits de contenido aleatorio en nuestro directorio de usuario. Movamos este archivo a un lugar donde pueda ser usado por todo el sistema y pongámosle permisos de acceso prudentes (sólo root):

sudo mkdir /etc/keys
sudo mv /tmp/extHD-1.key /etc/keys
sudo chown root:root /etc/keys/extHD-1.key
sudo chmod 0600 /etc/keys/extHD-1.key

Finalmente añadamos esta nueva llave para nuestro disco:

sudo cryptsetup luksAddKey /dev/sdX /etc/keys/extHD-1.key
sudo cryptsetup luksDump /dev/sdX

En este momento ya tenemos un dispositivo de bloque físico capaz de mapear a otro virtual, cifrado de manera transparente. Ahora tenemos que mapearlo al sistema para poder utilizarlo:

sudo cryptsetup luksOpen --key-file /etc/keys/extHD-1.key /dev/sdX backup

Esta función abre el dispositivo LUKS y, una vez verificada la contraseña (o, en este caso, archivo-contraseña), lo mapea al dispositivo de bloque virtual.

En este caso, una vez que se verificada la contraseña, se creará un archivo de dispositivo /dev/mapper/backup, que podremos utilizar como cualquier otro dispositivo de bloque (discos duros, memorias USB, etc.).

Toca formatear el disco, como cualquier otro disco. En este caso yo quise probar el nuevo formato Btrfs. Actualmente este formato funciona en todos los dispositivos, pero fue diseñado inicialmente para los SSD (discos de estado sólido) y está teniendo bastante aceptación en la comunidad por su eficiencia y funcionalidades.

sudo mkfs.btrfs -L backup /dev/mapper/backup

Por último ¡montemos el disco para poder usarlo!

sudo mount /dev/mapper/backup /mnt -o noatime,ssd,autodefrag,compress=lzo,space_cache

¿Qué significan todas esas opciones? ¿Son obligatorias? No son obligatorias, las opciones por defecto funcionan bien, aunque no son las más eficientes.

noatime: no registra el tiempo de acceso a los archivos, lo que reduce las operaciones a disco.

ssd: habilita ciertas operaciones optimizadas para SSD.

autodefrag: defragmenta el disco en background.

compress: habilita la compresión al vuelo de datos, usando el algoritmo lzo, que es el más rápido.

space_cache: almacena la información de espacio libre en el disco para hacer más rápido el cacheado del bloque.

Podemos ver el uso del sistema de archivos en el dispositivo con este comando:

sudo btrfs filesystem df /mnt

Como es un disco externo, normalmente queremos desconectarlo para guardarlo o llevarlo a alguna parte, pero no podemos hacer esto “a la brava”, debemos desmontar el dispositivo y cerrar el mapeo:

sudo umount /mnt
sudo cryptsetup luksClose backup