Cómo encriptar una partición de disco duro con dm-crypt

A mi me surgió esta "necesidad" porque quería asegurarme de que nadie pueda leer mi disco duro externo portátil en caso de que me lo roben, pero hay muchos motivos para hacerlo. Unos ejemplos:

  1. Quieres encriptar un disco duro externo USB por si te lo roban. En ese caso, podrias encriptarlo con una contraseña que solo tú sabes, y debes teclear cada vez que lo enchufas. Es el ejemplo más sencillo.
  2. Quieres encriptar todos los datos privados que hay en tu ordenador (carpetas personales, fotos, documentos, etc): si se te estropea el ordenador, quieres estar seguro de que el servicio técnico no toqueteará en tus cosas. En ese caso podrías usar una contraseña tecleada cada vez que arrancas la máquina, pero es un poco peñazo, ¿no?. Es más práctico generar una contraseña aleatoria de, por ejemplo, 1024 bytes y meterla en un fichero en un lápiz USB, de tal forma que si el ordenador arranca con ese lápiz metido, puedes acceder a tus datos, pero si no, no.
  3. Quieres encriptar un disco duro externo USB por si te lo roban, pero manejas datos empresariales, o muy confidenciales (como datos médicos), o simplemente eres un paranoico del carajo. En ese caso puede que desconfies de una contraseña tan sencilla como para poder recordarla, y tampoco te fias de que no te roben el lápiz USB con la contraseña aleatoria. En ese caso, puedes encriptar el fichero con la clave con GNUpg, de tal forma que te pida una contraseña tecleada para poder usarlo. Parece un trabalenguas, pero en la práctica significa que para que alguien pueda leer el disco duro USB necesita tener el lápiz USB con la contraseña, y saber la frase de paso que hay que teclear (y que solo tu sabes). Tendrían que robarte, registrarte y torturarte a la vez, vamos. ;-)

Hay mucha documentación en la red para los que quieren encriptar una partición o un fichero loopback con dm-crypt. Por lo que tengo entendido, es el sistema recomendado, incluso por encima de loop-AES, que sería la alternativa más cercana. Si quieres probar con loop-AES, puedes echar un vistazo a la documentación. Yo lo he probado y te aseguro que funciona a la perfección.

Pero como parece que en los foros se recomienda más dm-crypt, al final me decidí por él.

Como está todo bien explicado en la red, lo que te pongo aquí es solo un resumen rápido de los pasos que seguí yo. Asumo que tienes Gentoo como yo, pero se puede hacer lo mismo en una Debian o un Ubuntu con muy pocas modificaciones. Si quieres más detalles o hacer algunas virguerías, échale un vistazo al HOWTO en castellano, al Tutorial resumido que usé yo, o al Gentoo Wiki más completo, que viene con un montón de detalles.

Lo primero que necesitas es un kernel adecuado. Muchas distribuciones ya incluyen el soporte a la encriptación dm-crypt de serie, como por ejemplo Fedora. Si no es así, entonces tendrás que compilar uno a medida.

Te animo a que compiles un kernel propio, incluso aunque el kernel de serie te funcione sin problemas. Un kernel propio te proporciona mucha flexibilidad a la hora de añadir cosas "finas" a tu sistema. Encriptar una partición de disco duro es un ejemplo, pero como esto hay muchas más, cosas que puedes ajustar o añadir, pero necesitas activar ciertas opciones del kernel. Modificar un kernel ya creado es muy facil, pero hacer uno nuevo desde cero puede ser un poco tortuoso, asi que piensa que tener un kernel propio es como tener mucho trabajo adelantado de cara al futuro.

Haz un "make menuconfig", entra en "Device Drivers" y luego en la opción que dice "RAID and LVM support". Activa las opciones "Multiple devices driver support (RAID and LVM)", "Device mapper support", y "Crypt target support". Ahora vuelve a la raiz y entra en "Cryptographic Options". Ahí yo lo activaría todo como módulos, pero tú tienes que activar al menos "AES cipher algorithims (i586)". Ahora vuelve a la raiz y entra en "Device Drivers" y luego en "Block Devices". Ahí, activa "Loopback device support". Vuelve al sistema y recompila.

Ojo, si quieres tener simultáneamente una unidad loop-AES, además de dm-crypt, has de saber que loop-AES te exige que desactives la opción "Loopback device support" del kernel, y que hagas un "emerge loop-aes" para compilar una versión modificada del módulo "loop" que está en Portage. Hazlo así, a dm-crypt no le importará, siempre y cuando te acuerdes de hacer un "modprobe loop" para que dm-crypt no se queje de que le falta el soporte de dispositivos loopback.

Bien, si vas a usar un fichero de contraseña, lo primero es crear el fichero, claro. Esto lo puedes hacer así, lo que crearía una contraseña fuerte de 1024 caracteres aleatorios (a que no hay narices a memorizarlos):

[root@jeanne ~]# head -c 1024 /dev/urandom > /mnt/usbdisk/.clave_discoduro.txt
[root@jeanne ~]# chown lacofi:users /mnt/usbdisk/.clave_discoduro.txt
[root@jeanne ~]# chmod go-rwx /mnt/usbdisk/.clave_discoduro.txt

Si quieres encriptar ese fichero con GnuPG, entonces será necesario teclear una passphrase cada vez que quieras usar el archivo de contraseña. Eso es algo así como usar una contraseña para desencriptar tu contraseña:

[root@jeanne ~]# head -c 3172 /dev/urandom | \
				uuencode -m - | grep -v ==== | tail -n 65 | \
				gpg --symmetric -a > /mnt/usbdisk/.clave_discoduro.txt
[root@jeanne ~]# chown lacofi:users /mnt/usbdisk/.clave_discoduro.txt
[root@jeanne ~]# chmod go-rwx /mnt/usbdisk/.clave_discoduro.txt

Y por supuesto, si no quieres complicarte la vida, puedes no especificar ningún fichero de contraseña. Te pedirá una sobre la marcha y tendrás que teclearla a mano todas las veces que montes la unidad.

Observa que me he asegurado de que el fichero que contiene la contraseña es accesible por mí y por nadie más, pero ahí puedes jugar un poco con los permisos según tus necesidades.

Ahora instala cryptsetup.

[root@jeanne ~]# emerge cryptsetup

Ahora MACHACA el contenido de la partición. ¡Cuidado, este comando que sigue destruirá permanentemente cualquier dato que esté en la partición!. ¡De eso se trata, así que no te confundas!.

[root@jeanne ~]# shred -n 1 -v /dev/lacie_backup1
shred: /dev/lacie_backup1: pass 1/1 (random)...
shred: /dev/lacie_backup1: pass 1/1 (random)...16MiB/120.0GiB 1%
shred: /dev/lacie_backup1: pass 1/1 (random)...87MiB/120.0GiB 2%
shred: /dev/lacie_backup1: pass 1/1 (random)...108MiB/120.0GiB 3%
(tómate un café, porque esto puede tardar un buen rato...)

Luego crea un dispositivo mapper (al final, lo que acabarás montando será este dispositivo mapper, y no el dispositivo real). Las instrucciones originales recomiendan también encriptar la partición swap, para que nadie pueda acceder a los datos temporales, pero como yo solo quiero proteger un disco duro portátil y ahí no habrá ninguna partición swap, puedo saltarme este paso.¡Cuidado, este comando que sigue también destruirá permanentemente cualquier dato que esté en la partición, no te confundas de sitio!.

Si estás usando un fichero de contraseña:

[root@jeanne ~]# cryptsetup -v luksFormat /dev/lacie_backup1 /mnt/usbdisk/.clave_discoduro.txt

WARNING!
========
This will overwrite data on /dev/lacie_backup1 irrevocably.

Are you sure? (Type uppercase yes): <YES>
Command successful.

Si omites /mnt/usbdisk/.clave_discoduro.txt te pedirá una passphrase en la línea de comandos. En ese caso te recomiendo que uses la opción "-y", para que te la pida dos veces, y así no tendrás problemas en caso de que te equivoques al teclear.

Si prefieres encriptar el fichero de contraseña con GnuPG:

[root@jeanne ~]# gpg --quiet --decrypt /mnt/usbdisk/.clave_discoduro.txt | \
> cryptsetup -v luksFormat /dev/lacie_backup1
Introduce la passphrase: <aqui metes la passphrase>
gpg: ATENCIÓN: la intgridad del mensaje no está protegida
Command successful.

Observa que el dispositivo que uso es /dev/lacie_backup1 y no /dev/sdb1. Eso es porque tengo bien configurado UDEV. Te lo recomiendo sinceramente.

Ahora tienes que abrir el dispositivo mapper que acabas de crear.

Si usas un fichero de contraseña:

[root@jeanne ~]# cryptsetup --key-file /mnt/usbdisk/.clave_discoduro.txt \
> luksOpen /dev/lacie_backup1 encriptado
key slot 0 unlocked.
Command successful.

Si omites "--key-file /mnt/usbdisk/.clave_discoduro.txt" debería pedirte la contraseña en línea de comandos. Obviamente no serás capaz de recordarla, si la contraseña son 1024 caracteres aleatorios, pero sí si es solo una contraseña tecleada. En cualquier caso, con esto queda abierto y accesible el dispositivo mapper con nombre "encriptado".

Si usas un fichero de contraseña encriptado con GnuPG:

[root@jeanne ~]# gpg --decrypt /mnt/usbdisk/.clave_discoduro.txt 2>/dev/null | \
> cryptsetup luksOpen /dev/lacie_backup1 encriptado
key slot 0 unlocked.
Command successful.

Ahora ya tienes el dispositivo /dev/mapper/encriptado que es con lo que vas a trabajar. Para tí, /dev/lacie_backup1 ya no importa. Bien, pues ahora tienes que formatear el dispositivo. Algunos recomiendan no usar un sistema con journaling porque teoricamente puede producir corrupción de datos. Yo estoy usando ext3 hasta ahora sin problemas.

[root@jeanne ~]# mkfs.ext3 /dev/mapper/encriptado

Y ahora ya puedes crear el punto de montaje y montarlo:

[root@jeanne ~]# mkdir /mnt/lacie_backup
[root@jeanne ~]# mount /dev/mapper/encriptado /mnt/lacie_backup -t ext3 -o rw

El siguiente paso sería meter una entrada nueva en tu fstab:

/dev/mapper/encriptado  /mnt/lacie_backup  ext3  user,noauto,rw  0 0

Con esto, la configuración ya está.

A partir de ahora, para acceder a tu partición metiendo la contraseña a mano (sin fichero de contraseñas) tendrás que ejecutar, también a mano:

[root@jeanne ~]# cryptsetup luksOpen /dev/lacie_backup1 encriptado
(aquí pedirá la contraseña)
[root@jeanne ~]# exit
[lacofi@jeanne ~]$ mount /mnt/lacie_backup

Aunque si estás usando un fichero de contraseña en un lápiz USB, puedes meter los comandos en los scripts de inicio del sistema, de tal forma que si está el lápiz enchufado, la máquina desencripte y monte los directorios seguros automáticamente.

Y para desmontar:

[lacofi@jeanne ~]$ umount /mnt/lacie_backup
[lacofi@jeanne ~]$ su
password:
[root@jeanne ~]# cryptsetup remove encriptado
(mientras no hagas esto último, la partición seguirá estando accesible sin
contraseña)

Si usas un fichero de contraseñas encriptado con GnuPG, tendrías que hacer más o menos lo mismo. Para montar:

[root@jeanne ~]# gpg --decrypt /mnt/usbdisk/.clave_discoduro.txt 2>/dev/null |\
> cryptsetup luksOpen /dev/lacie_backup1 encriptado
(aquí pedirá la passphrase)
[root@jeanne ~]# exit
[lacofi@jeanne ~]$ mount /mnt/lacie_backup

Y para desmontar, igual que antes.

Otra opción para automatizar el proceso sería por ejemplo, entrar en /etc/udev/rules.d/10-local.rules, ir a la entrada que identifica el disco duro lacie_backup1 y añadir en esa entrada una regla tal que así:

RUN+="cryptsetup --key-file /mnt/usbdisk/.clave_discoduro.txt luksOpen /dev/lacie_backup1 encriptado"

Con lo que cada vez que enchufes el disco duro portátil en ese ordenador, se abrirán todos los cerrojos y quedará listo para montarlo (siempre y cuando esté metido el lápiz USB con las claves):

[lacofi@jeanne ~]$ mount /mnt/lacie_backup

Observa que ya ni siquiera necesitamos ser root.

Pero la mejor automatización es la que viene ya de serie en todas las distribuciones Linux actuales, que tienen luksOpen integrado en el sistema, de tal manera que si tienes encriptado un disco, será reconocido directamente en el arranque sólo configurando /etc/crypttab con las claves y /etc/fstab con el punto de montaje.

Así, puedes introducir en /etc/crypttab una línea tal que así:

# /etc/crypttab: mappings for encrypted partitions.
#
# Each mapped device will be created in /dev/mapper, so your /etc/fstab
# should use the /dev/mapper/ paths for encrypted devices.
#
# See crypttab(5) for the supported syntax.
#
# NOTE: Do not list your root (/) partition here, it must be set up
#       beforehand by the initramfs (/etc/mkinitcpio.conf). The same applies
#       to encrypted swap, which should be set up with mkinitcpio-openswap
#       for resume support.
#
#
#                                                                                                                          
encriptado	UUID=bb792154-e58e-4fd8-a2c0-ba3c8cb4cbd8	/mnt/usbdisk/.clave_discoduro.txt

Observa la última línea, donde se especifica el dispositivo mapper que estará asociado al disco, el UUID del disco y el fichero de claves. Esta configuración será leída en el arranque, después de montar todas las unidades, con lo que el dispositivo mapper estará listo y cargado para que que /etc/fstab pueda montarlo.

/dev/mapper/encriptado  /mnt/lacie_backup  ext3  user,noauto,rw  0 0

Que lo disfrutes.

Be Sociable, Share!

Puedes seguir cualquier respuesta a esta entrada mediante el canal RSS 2.0. Puedes dejar un comentario o enviar un trackback desde tu propio sitio.

5 comentarios »

 
  • avatar avatarPedro dice:

    Tras leer detenidamente tus instruccuines para encriptar un dico duro externo debo decirte que te dediques a otra cosa. NO he entendido nad en absoluto.

  • avatar avatarlacofi dice:

    La verdad es que me dedico a otra cosa… :-D

  • avatar avatarBeto dice:

    La verdad es algo complejo esto. Agradezco tu tiempo por haber explicado esto..
    Gracias ;D

  • avatar avatarcesar dice:

    @Pedro
    Que no hayas entendido nada de este artículo no quiere decir que no cumpla sus objetivos, esté mal escrito o el autor desconozca el tema. En cambio, en mi opinión, no solo es correcto es más. La distro Gentoo Linux es una distribución basada en Linux utilizada por usuarios avanzados. No pretendo ofender, pero las cosas como son. Linux es Genial!

    Un saludo

  • avatar avatarAlex dice:

    Muchísimas gracias por tu artículo. Me ha sido muy útil. Encontré otros artículos más breves en internet, pero el tuyo es perfecto, más explicativo y mucho más completo. Lo estoy utilizando para cifrar una partición con llave, cosa que no había encontrado en otros artículos y no podría hacer sin tu ayuda.

    Gracias por tu tiempo y saludos des de Barcelona

 

Deja un comentario

Disculpa, debes iniciar sesión para escribir un comentario.