Revista Tecnología

Cómo crear un volumen cifrado en un archivo

Publicado el 14 marzo 2014 por Gaspar Fernández Moreno @gaspar_fm
votar

Cómo crear un volumen cifrado en un archivo
Queremos alojar en un archivo un sistema de archvos, ya sea para probarlo, para organizarnos o para almacenar información sensible. También puede ser una buena solución si tenemos una unidad con una partición en un sistema de archivos FAT32 y queremos establecer permisos de Linux a ciertos archivos, esos archivos podemos almacenarlos en nuestro nuevo volumen, que residirá en un archivo muy grande dentro de la partición FAT.

Lo primero que debemos hacer es crear un archivo con el tamaño del volumen que queremos crear, no importa lo que escribamos dentro, podemos copiar un fichero grande, o escribir desde un fichero de texto… pero vamos a lo fácil, vamos a crear un archivo que sólo contenga ceros. En este ejemplo, la unidad que vamos a crear será de 10Gb por lo tanto escribimos:

dd if=/dev/zero of=destino.img bs=1024000 count=10240
…y al cabo de un tiempo aparecerá algo parecido a esto…
10240+0 registros leídos
10240+0 registros escritos
10485760000 bytes (10 GB) copiados, 233,616 s, 44,9 MB/s

Cómo funciona esto?

Lo importante es que estemos en un directorio de donde podamos disponer de los 10Gb, ya sea en una unidad flash, disco duro, disco externo, etc, y nuestro archivo se llamará destino.img.
El origen de datos será /dev/zero , esto es un dispositivo especial que nos da el kernel Linux que sólo contiene ceros.
El argumento bs indica los bytes que se escribirán de cada vez, como si recopiláramos en un buffer este número de bytes y los mandáramos todos juntos al destino.
Y por último, el argumento count indica cuántos bloques de bs bytes vamos a escribir en el dispositivo.
Más o menos podemos optimizar las escrituras tocando bs y count, no es lo mismo hacer 1000 envíos de 1 byte que 10 envíos de 100 bytes, lo mismo que si queremos enviar 100 cajas de refrescos desde el almacén a una tienda, no se mandarán de 1 en 1 (al final tardamos más gestionando los envíos y recepciones), pero tampoco queremos sobrecargar el camión, si le caben 90 cajas no tenemos más remedio que fragmentar los envíos, o comprar un camión más grande.
Por eso tampoco es plan de poner en bs=10485760000 y en count=1 , los datos se mandarán al final, pero estaremos utilizando 10Gb de memoria, aunque sólo gestionemos un envío, pero el camión tendrá que ir con cuidado y hacer malabares para no perder la mercancía.

Un detalle más, puede que volvamos pronto a la terminal y dd nos diga que ha terminado, eso sólo significa que ha terminado de realizar los envíos, muchas veces la unidad se queda un tiempo recibiendo la información.

Lo que tenemos que saber del kernel

Necesitamos soporte para “loopback devices”, en muchas de las distribuciones modernas viene ya compilado en el kernel, por lo que lo tendremos de serie, en otras ocasiones encontramos un módulo que podemos cargar (loop). Este nos permitirá asignar ficheros a dispositivos virtuales, el ejemplo más común es montar un archivo ISO de CD/DVD para ver su contenido sin tener que grabarlo. Para comprobar si tenemos este soporte en nuestro kernel podemos hacer:

$ls /dev/loop*

si vemos /dev/loop0, /dev/loop1 y algunos más, significa que podemos continuar. Si no lo tenemos, podemos probar:

$ sudo modprobe loop

(o sin sudo si somos root)
Si no dice nada, todo habrá ido bien, podremos repetir el primer paso y ver que efectivamente ahora sí tenemos /dev/loop*
Si sigue sin funcionar, debemos recompilar el kernel con soporte para loopback devices, y seguro que por Internet se pueden encontrar referencias detalladas.

Lo siguiente es la configuración criptográfica, necesitamos cargar el módulo cryptoloop:

$ sudo modprobe cryptoloop

Si no tenemos el módulo, podemos saltar este paso y ver si está compilado en nuestro kernel, si no funciona, tendremos que dar soporte recompilando.

También puede ser necesario cargar el módulo del algoritmo de cifrado (si no está cargado, es interesante ver la respuesta de:

$ sudo modprobe -l | grep crypto

Con los diferentes módulos de cifrado, también podemos consultar el archivo /proc/crypto para ver los algoritmos disponibles para cifrado (aquí veremos algunos algoritmos que no podremos utilizar en nuestro volumen, no todos los algoritmos tienen la misma utilidad).

Configurando nuestro dispositivo

Para ello, primero vamos a hacerlo sin cifrado, ya que es muy sencillo, lo haremos con “losetup”

$ sudo losetup /dev/loop0 destino.img

Estamos asignando el archivo destino.img al dispositivo /dev/loop0, primero debemos asegurarnos de que /dev/loop0 no tiene nada asignado. Aunque tenemos otra opción, para asignarlo al primer dispositivo libre:

$ sudo losetup -f –show destino.img

Cuando termine de configurar el dispositivo, nos dirá qué dispositivo ha utilizado.

Ahora bien, si queremos cifrar nuestros datos, debemos indicar qué algoritmo de cifrado queremos utilizar, por ejemplo (des, blowfish, aes, serpent, twofish, arc4 y más). Cada uno tiene sus ventajas e inconvenienes en materia de memoria/cpu/seguridad, podemos encontrar algunas comparativas en Entropy Security.
Para establecer el algoritmo, basta con añadir un argumento a losetup (por ejemplo, para cifrado por AES):

$ sudo losetup -f –show -e aes destino.img

Nos pedirá contraseña (una vez) y listo, a partir de ahora trabajaremos con el dispositivo que nos ha devuelto la línea, en este caso /dev/loop0.

Formateando el volumen

El siguiente paso es crear un sistema de archivos, y podemos formatearlo con el sistema que queramos, en este caso he elegido un ext3:

$ sudo mkfs.ext3 /dev/loop0

Podemos utilizar los argumentos que queramos para configurar los detalles del formato.

Empezamos a trabajar con la unidad!

Ya está terminado, sólo queda montar la unidad, y esto es lo que tendremos que hacer siempre que queramos trabajar con ella.

$ sudo mount /dev/loop0 /punto/de/montaje

Donde el punto de montaje podrá ser cualquier directorio, los típico es crear un directorio en /media/ o /mnt/ y montarlo dentro, por ejemplo /media/destino o /mnt/destino, pero el punto de montaje puede estar en nuestra home si queremos.
Para montar el volumen, debemos haber hecho antes “losetup”, y si la clave especificada no es válida, no nos dejará montar el volumen.

Otra opción para montar el volumen (si no queremos hacer losetup, aunque losetup es necesario para la primera vez), es la siguiente:

$ sudo mount destino.img /punto/de/montaje o loop,encryption=aes

Y ya está listo para trabajar.

Desmontando la unidad

Para desmontar, es como cualquier otro dispositivo:

$ sudo umount /dev/loop0

o

$ sudo umount /punto/de/montaje

Y si hemos utilizado losetup al principio, también debemos desasociar el dispositivo virtual y el archivo de la siguiente manera:

$ sudo losetup -d /dev/loopX

donde X será el dispositivo utilizado

Un pequeño extra

Si no sabemos qué dispositivos loopX están siendo utilizados, podemos escribir esto:

$ sudo losetup -a
/dev/loop0: [0811]:14 (/home/ordenador/destino.img), cifrado aes (tipo 18)

Recapitulando

Ya que en el artículo he dado varias opciones para hacer las cosas, voy a poner una pequeña guía rápida de consulta de los comandos que se pueden utilizar para cada caso.

Crear la unidad (sin cifrado)

Una unidad de 10Gb.

$ dd if=/dev/zero of=destino.img bs=1024000 count=10240
$ sudo losetup /dev/loop0 destino.img
$ sudo mkfs.ext3 /dev/loop0
$ sudo losetup -d /dev/loop0

Montar la unidad (sin cifrado, en dos pasos)

$ sudo losetup -f –show destino.img
/dev/loop1
$ mount /dev/loop1 /punto/de/montaje

(Podemos elegir qué manera de utilizar losetup queremos, especificando el dispositivo, o indicando que utilice el primero libre (importante –show para que nos diga qué dispositivo ha utilizado)

Desmontar la unidad (en dos pasos)

$ sudo losetup -a
/dev/loop0: [0811]:14 (/home/ordenador/destino.img), cifrado aes (tipo 18)
$ sudo umount /punto/de/montaje
$ sudo losetup -d /dev/loop0

Si sabemos qué dispositivo loop se ha utilizado, no es necesario hacer “losetup -a”

Montar la unidad (sin cifrado, en un paso)

$ sudo mount destino.img /punto/de/montaje -o loop

Si sólo hemos dado un paso, sólo tenemos que hacer “$ sudo umount /punto/de/montaje” para desmontar.

Crear la unidad con cifrado

Creamos una unidad de 10Gb con cifrado aes.

$ dd if=/dev/zero of=destino.img bs=1024000 count=10240
$ sudo losetup -f –show -e aes destino.img
$ sudo mkfs.ext3 /dev/loop0
$ sudo losetup -d /dev/loop0

Montar la unidad (con cifrado, en dos pasos)

Suponemos cifrado aes.

$ sudo losetup -f –show -e aes destino.img
/dev/loop1
$ mount /dev/loop1 /punto/de/montaje

Para desmontar, el cifrado no tiene nada que ver podemos utilizar el método anterior.

Montar la unidad (con cifrado, en un paso)

Suponemos cifrado aes.

$ sudo mount destino.img /punto/de/montaje -o loop,encryption=aes

Es importante que no haya espacios entre “loop,encryption=aes”.

Foto: elNico (Flickr) CC-by


Volver a la Portada de Logo Paperblog