Partición cifrada con TRUECRYPT

Este artículo explica cómo cifrar una partición de datos de forma que podamos alojar en ella datos sensibles, incluyendo el perfil de Firefox, la configuración de pidgin, documentos, etc.

Aunque un tercero lograra hacerse con acceso físico a nuestro disco duro, no tendría forma de leer los datos de la partición cifrada. No sólo resulta útil como almacen de datos "estáticos", sino que como veremos en este mismo "howto", podemos alojar en la partición cifrada los perfiles de Firefox, pidgin, etc (con sus bookmarks, contraseñas, caché…) y hacer que la partición cifrada se monte al hacer login mediante la introducción manual de la passphrase de desbloqueo del cifrado.

Utilizaremos truecrypt, que se puede instalar en Linux y que, a diferencia de dmcrypt permite que montemos las particiones en sistemas Windows (por ejemplo para llaveros o discos USB externos).


Cifrado de una partición

Instalamos el software necesario desde la web de TrueCrypt.

A continuación creamos una partición sin datos (importante, ya que la vamos a formatear). En el ejemplo he usado /dev/sdX, aunque lo normal es que la creemos en /dev/sda (primer disco) o en un disco USB que comunmente será /dev/sdb en adelante.

# fdisk /dev/sdX

Opcionalmente, si tenemos suficiente tiempo (este comando tardará mucho en ejecutarse, especialmente en discos USB o discos grandes), podemos rellenar el disco con datos aleatorios (más seguro que simplemente hacer un wipe de su contenido):

# badblocks -c 10240 -s -w -t random -v /dev/sdX1

A continuación creamos un "volumen cifrado", que es el contenedor sobre el cual crearemos después el filesystem, utilizando truecrypt en modo texto (-t):

# truecrypt -t -c
Volume type:
 1) Normal
 2) Hidden
Select [1]: 1

Enter volume path: /dev/sdb2
Enter your user password or administrator password: (password_de_root)

Encryption algorithm:
 1) AES
 2) Serpent
 3) Twofish
 4) AES-Twofish
 5) AES-Twofish-Serpent
 6) Serpent-AES
 7) Serpent-Twofish-AES
 8) Twofish-Serpent
Select [1]: 4

Hash algorithm:
 1) RIPEMD-160
 2) SHA-512
 3) Whirlpool
Select [1]: 2

Filesystem:
 1) None
 2) FAT
 3) Linux Ext2
 4) Linux Ext3
 5) Linux Ext4
Select [2]: 1

Enter password: 
WARNING: Short passwords are easy to crack using brute force techniques!

We recommend choosing a password consisting of more than 20 characters.
Are you sure you want to use a short password? (y=Yes/n=No) [No]: No

Enter password: 
Re-enter password: 

Enter keyfile path [none]: 

Please type at least 320 randomly chosen characters and then press Enter:

Done: 100,000%  Speed:   23 MB/s  Left: 0 s                 

The TrueCrypt volume has been successfully created.

(También podemos ejecutarlo en modo gráfico sin -t).

Nótese que hemos seleccionado un doble cifrado (AES-Twofish) por seguridad. Un triple cifrado puede ser tal vez excesivo. Un cifrado único puede resultar demasiado débil si los datos son muy privados.

Creamos el contenedor cifrado, le asignamos una passphrase y dentro de él creamos el filesystem. Este filesystem se puede montar siempre que el contenedor esté desbloqueado:

# truecrypt --filesystem=none /dev/sdb2
# mkfs.ntfs -f /dev/mapper/truecrypt1
# mkdir /media/disco_cifrado
# mount /dev/mapper/truecrypt1 /media/disco_cifrado

El Filesystem creado es NTFS para permitir su uso en sistemas Windows. Podría ser ext3 ó ext4 si no tuvieramos intención de montar esta partición cifrada en sistemas no UNIX.

Tras desmontar el disco, no debemos olvidar el cerrar el contenedor de cifrado:

# umount /media/disco_cifrado
# truecrypt -d /dev/sdb2


Trabajando con el disco

Ahora podemos ya acceder a la partición cifrada mediante:

1.- Desbloqueo del volumen:

# truecrypt /dev/sdb2 --filesystem=ntfs --fs-options=user,defaults /media/disco_cifrado

Esto montará automáticamente /dev/mapper/truecryptX en /media/disco_cifrado. Si queremos que nos solicite el password en modo texto, bastará con añadir el flag -t.

2.- Trabajamos con nuestro disco en /media/disco_cifrado .

3.- Desmontamos y desbloqueamos el volumen:

# truecrypt -d /dev/sdb2


Aliases útiles en .bashrc

Para no requerir el password de root en el uso de truecrypt, añadir los siguientes 2 aliases en .bashrc:

alias tc='sudo /usr/bin/truecrypt'
alias tcm='tc -M uid=$(id -u),gid=$(id -g)'

Y lo siguiente en /etc/sudoers:

sromero ALL=NOPASSWD:/bin/mount,\
                 NOPASSWD:/bin/umount,\
                 NOPASSWD:/sbin/fdisk,\
                 NOPASSWD:/usr/bin/truecrypt


Montar partición NTFS con permisos para usuario

Para poder escribir como usuario en el disco NTFS necesitamos montarlo con la opción "user". Podemos añadirlo en el mount con "-o defaults,user" o bien añadir la siguiente línea en el /etc/fstab:

# Disco duro externo Verbatim
/dev/mapper/truecrypt1 /media/disco_cifrado  ntfs   noauto,defaults,user  0 0

De esta forma, ya podemos montar la partición de la siguiente forma y poder escribir como usuario:

sudo mount /media/disco_cifrado


Script de montaje de disco cifrado en arranque de GNOME

En el caso de que el disco sea un disco de sistema (no USB) y sepamos de antemano el device a montar, y vayamos a hacer uso del disco para datos del sistema (por ejemplo, partes necesarias de funcionamiento de gnome o de aplicaciones como el perfil de firefox u otros programas), necesitaremos montar el disco cifrado en el arranque de GNOME, antes de lanzar el resto de aplicaciones.

Para eso, agregar lo siguiente en “Aplicaciones al inicio” de GNOME:

gksu /home/sromero/bin/monta_disco_cifrado_TC.sh

El contenido de dicho script es:

#!/bin/sh
export DEVICE_DESTINO_RAW="/dev/sda1"
export MOUNT_POINT="/cifrado"

COUNT="0"
TRY="4"

while /bin/true;
do

   # 3 intentos
   COUNT="`expr $COUNT + 1`"
   if [ "x${COUNT}" == "x${TRY}" ];
   then
      zenity --info --text="Error desbloqueando unidad cifrada."
      exit
   fi

  truecrypt $DEVICE_DESTINO_RAW --filesystem=ntfs \
           --fs-options=user,defaults $MOUNT_POINT

   if mount | grep -q $MOUNT_POINT ;
   then
      exit
   fi

done

Si colocamos el anterior script en el arranque de gnome, tras logarnos con nuestro usuario se nos pediría el password del mismo (por gksu) y luego el password de desbloqueo del contenedor de cifrado. Si se introduce correctamente, se desbloquearía el disco y se montaría en /cifrado.

El siguiente script permite desmontar el disco:

[sromero@compiler:~/bin]$ cat desmonta_disco_cifrado_TC.sh 
#!/bin/sh

export DEVICE_DESTINO="/dev/sda1"
sudo truecrypt -d $DEVICE_DESTINO


Ubicar perfil de firefox y pidgin en disco cifrado

Una vez funcional el sistema de montaje del disco cifrado al arrancar sesión en gnome, bastará con mover y enlazar los directorios apropiados. Paramos las aplicaciones y ejecutamos:

mkdir -p /cifrado/home/usuario/
cd $HOME
mv .mozilla /cifrado/home/usuario/
ln -s /cifrado/home/usuario/.mozilla .
mv .purple/ /cifrado/home/usuario/
ln -s /cifrado/home/usuario/.purple/ .
mv .gaim .gaimrc /cifrado/usuario/sromero/
ln -s /cifrado/home/usuario/.gaim* .


Script de montar y desmontar disco USB

También existe la posibilidad de que el disco a montar sea un disco USB, por lo que no podemos saber de antemano el dispositivo /dev/sdX que se le va a asignar (a menos que lo establezcamos con reglas de udev).

A continuación se muestran 3 scripts para montar, desmontar y alternar el estado de montaje de un disco USB externo cuya partición 2 está cifrada (sdb2).

Según el orden en que pinchemos los discos en el PC, el dispositivo USB puede tener un /dev/sdx diferente, y nuestro script con un /dev/sdX fijo no funcionaría. Pero podemos hacer uso de udev y de los enlaces simbólicos en /dev/disk/by-id/ para, desreferenciando dicho enlace simbólico, utilizar readlink para obtener el /dev/sdX correcto:

$ readlink -e /dev/disk/by-id/usb-Verbatim_000000001DD2-0\:0-part2
/dev/sdb2

Podemos crear los scripts de gestión del disco USB cifrado (montar/desmontar/alternar) para que detecte así el dispositivo correcto para trabajar con el disco. Recordar que debéis cambiar la referencia /dev/disk/by-id de mis ejemplos por la de vuestro disco, pinchando este en el puerto USB y haciendo un ls -l /dev/disk/by-id/ para obtener el enlace a vuestro disco y partición cifrado correcto.

Montaje:

$ cat monta_USB_cifrado_TC.sh 
#!/bin/sh

# Cambiar el dispositivo por el que se corresponda con nuestro disco y particion:
export DEVICE="`readlink -e /dev/disk/by-id/usb-Verbatim_000000001DD2-0\:0-part2`"
export MOUNT_POINT="/media/verbatim/"
truecrypt $DEVICE --filesystem=ntfs --fs-options=defaults,user $MOUNT_POINT

Desmontaje:

$ cat desmonta_USB_cifrado_TC.sh 
#!/bin/sh

# Cambiar el dispositivo por el que se corresponda con nuestro disco y particion:
export DEVICE="`readlink -e /dev/disk/by-id/usb-Verbatim_000000001DD2-0\:0-part2`"

export MOUNT_POINT="/media/verbatim"

truecrypt -d $DEVICE

Alternar:

$ cat toggle_USB_cifrado_TC.sh 
#!/bin/sh
# Si le pasamos un 1 como parametro, abrira el nautilus tras
# montar el disco, y nos informara con un pop tras desmontarlo.

MOUNT_SCRIPT="/home/sromero/bin/monta_USB_cifrado_TC.sh"
DISMOUNT_SCRIPT="/home/sromero/bin/desmonta_USB_cifrado_TC.sh"
export MOUNT_POINT="/media/usbcifrado"

SHOW_MEDIA="$1"

# Si el disco ya esta montado, lo desmontamos y salimos
if mount | grep -q $MOUNT_POINT ;
then
   sh $DISMOUNT_SCRIPT
   if [ "x${SHOW_MEDIA}" == "x1" ];
   then
      zenity --info --text="Unidad USB desmontada."
   fi
   exit
fi

# El disco no estaba montado, lo montamos
if [ "x${SHOW_MEDIA}" == "x1" ];
then
   sh $MOUNT_SCRIPT && nautilus $MOUNT_POINT
else
   sh $MOUNT_SCRIPT
fi

Finalmente, debemos editar el fichero de sudoers y permitir la ejecución de toggle_USB_cifrado.sh sin password:

sromero ALL=NOPASSWD:/bin/mount,\
                 NOPASSWD:/bin/umount,\
                 NOPASSWD:/sbin/fdisk,\
                 NOPASSWD:/usr/bin/truecrypt,\
                 NOPASSWD:/home/sromero/bin/toggle_USB_cifrado.sh

A continuación podemos asociar en la barra de iconos de GNOME/KDE un nuevo "elemento" que ejecute "sudo toggle_USB_cifrado_TC.sh 1" y que nos permita montar y desmontar nuestro disco cifrado.


Utilizar imágenes loopback cifradas en lugar de particiones

Si ya no tenemos espacio para crear particiones, es perfectamente posible cifrar imágenes de loopback (ficheros formateados), creando primero el dispositivo correspondiente (en el ejemplo, de 2GB) con:

# dd if=/dev/urandom of=container.loop bs=2048M count=10 
# losetup /dev/loop/0 container.loop 
# losetup -d /dev/loop0

A continuación podemos utilizar como dispositivo a cifrar / descifrar el device /dev/loop/0, igual que si fuera, por ejemplo, /dev/sdb2.



<Volver a la sección de GNU/Linux>