lunes, 11 de junio de 2012

Cifrado de disco duro usb con cryptsetup

Hace pocos días me compré una caja de disco duro usb para poder tener una copia de seguridad actualizada y accesible desde varios ordenadores. Aprovechando la situación, le puse un disco duro de 200 GB y le cifré una partición siguiendo los pasos de un muy buen y completo manual que vi en conocimiento libre, que recomiendo encarecidamente a todo el mundo visionar aunque la resumiré a continuación (además de añadir alguna cosilla de otras partes).

Hacer particiones del disco duro que se vaya a usar (si es que no lo quieres cifrar entero). En el caso de que ya lo tengas particionado o que quieras usarlo todo cifrado en una única partición, lo único que debes es tener muy claro cual es el nombre de tu partición (en mi caso /dev/sdb2, usaré la misma palabra que en conocimiento libre para referirme a ella $PARTICION). Esto es importante ya que todo lo que haya en la partición que deseemos cifrar se borrará durante todo el proceso. Para ver un listado de las particiones disponibles:

# fdisk -l

Una vez que tenemos claro cual es, procedemos a desmontarla:

# umount $PARTICION

Procedemos a instalar cryptsetup (usando el gestor que corresponda, yo soy debianita, así que aptitude):

# aptitude install cryptsetup

Comprobamos el tamaño del bloque de nuestra partición:

# tune2fs -l $PARTICION | grep -i 'Block size'

El tamaño de bloque nos servirá para comprobar que no hay errores en los bloques de nuestra partición:

# badblocks -s -w -t random $PARTICION -b $TAMAÑO_BLOQUE

El parámetro -t random es opcional pero ahorra mucho tiempo, con lo que lo recomiendo.

Para minimizar posibles hackeos a nuestra partición cifrada, es recomendable aleatorizar su contenido:

# shred -n 1 -v $PARTICION

El parámetro -n 1 es para hacerlo con una sola pasada, cosa que es en principio suficiente.

Ya estamos preparados para cifrar la partición:

# cryptsetup -c aes -h sha256 -y -s 256 luksFormat $PARTICION

En el caso de dar un error del tipo que el kernel no soporta el cifrado (a mí no me dio este error), lo más probable es que sea porque no tiene cargado el módulo dm-crypt, así que para cargarlo:

# modprobe dm-crypt

Y para que se cargue automáticamente con cada arranque se añade al archivo /etc/modules una línea con el nombre del módulo: dm-crypt

Si todo ha ido bien y has puesto una contraseña lo suficientemente larga y buena (no la olvides o adiós a todo lo que tienes dentro...), ya podemos comprobar que todo está correcto:

# cryptsetup luksOpen $PARTICION $NOMBRE

Donde $NOMBRE puedes poner el que más te guste.

Toca darle formato, con el sistema que gustes (ext3, ext4...):

# mkfs.ext4 [-L $ETIQUETA] -m 1 /dev/mapper/$NOMBRE

A mí el parámetro -L para ponerle la etiqueta no me funcionó bien, así que tuve que cambiarle la etiqueta desde la utilidad de discos del menú accesorios en aplicaciones.

A continuación cerramos el volumen cifrado:

# cryptsetup luksClose /dev/mapper/$NOMBRE

Y listo, a funcionar sin problemas; cuando quieras lo conectas y el asistente te pide la clave para montar la partición cifrada, y para salir lo desmontas como cualquier usb. En el caso de no estar en gnome y no contar con asistentes, se puede hacer desde la terminal igualmente:

# cryptsetup luksOpen $PARTICION $NOMBRE
# mount /dev/mapper/$NOMBRE $PTO_MONTAJE

Eso sí, tienes que recordar el $NOMBRE que le pusiste; y para desmontarlo:

# umount $PTO_MONTAJE && cryptsetup luksClose /dev/mapper/$NOMBRE

De donde entiendo que && es para darle tiempo a umount antes de cerrar el cifrado, pero en mi ordenata parece no reconocerlo.

Hasta aquí es básicamente y resumido lo que nos cuentan en conocimiento libre; pero yo tuve alguna incidencia más, y es que al realizarlo todo como root (fíjate en los #), solo podía acceder a la partición cifrada como lectura, lo cual no es práctico, así que tuve que cambiar los permisos (estando montado en $PTO_MONTAJE) para poder acceder al contenido desde cualquier usuario de cualquier ordenador (siempre usando la superclave secreta que hayas puesto claro):

# chmod -R 777 $PTO_MONTAJE

Como no me funcionó el etiquetado, recuerdo de nuevo que lo hice con la utilidad de discos (que por cierto es la primera vez que me sirve para algo jeje), pero es cómodo ya que permite personalizar la etiqueta de la partición y por tanto simplificar la dirección del $PTO_MONTAJE.
Otra incidencia más que me ocurrió es que el asistente de desmontaje no funcionaba bien en algún pc, con lo que me construí el siguiente script para desmontar y mandar a dormir el disco duro; lo deja sin rotar pero se activa y monta automáticamente en el momento que usando nautilus te vayas al punto de montaje. Este es mi script para desmontar y dejar el disco duro externo en hibernación:

#!/bin/bash
#Para desmontar el disco
sudo umount $PTO_MONTAJE;
#Para dar tiempo a desmontar antes de la hibernación del hd:
sleep 5;
#Para hibernar el disco IDE
sudo hdparm -y /dev/sdb;
exit

Un par de aclaraciones sobre este script: es obvio, pero bueno, el usuario debe ser sudoers, con lo que se debe agregar a la lista del archivo /etc/sudoers; el comando hdparm solo funciona para discos IDE, con lo que si tienes un SATA no te servirá ese comando, pero puedes probar con este otro (el mío es IDE así que no lo he probado):

# rmmod ehci_hcd usb_storage libusual

Y una vez apagado el disco duro usb, se debe reactivar la conexión usb mediante:

# modprobe ehci-hcd

Que parece ser una forma muy recomendable de desmontar totalmente un disco duro usb.

Como última nota comentaré que esta partición cifrada es compatible y se puede usar también en windows gracias a FreeOTFE, pero esto lo dejo para otro día que ya está bien ;).