Creando una partición cifrada en un disco externo

Hace unos días, tuve un problema con un disco externo Western Digital Elements que compré en Amazon. El disco falló, daba como espacio total 0 Gb, incluso las utilidades de WD no eran capaces de comprobar el disco. Resulta que estos discos no son discos SATA de 2,5 dentro de una caja que los convierte a USB3.0, el conector que llevan soldado en placa es directamente un USB 3.0. No fui capaz de recuperar la información que contenía. Ante este problema, y estando el disco en garantía (18 meses de uso), tenía dos posibilidades: enviarlo a Amazon, o enviarlo a WD.

Si lo enviaba a Amazon, me devolvían el dinero pero NO me garantizaban que la información se eliminara y el disco se destruyera (la operadora de Amazon no pudo asegurármelo, WTF!). Western Digital por su parte me enviaba un disco remanufacturado (reparado), tras cobrarme los portes de enviarlo a su sede central en España (unos 7€, dependiendo de con que empresa de transportes lo enviase), respetándome con ese disco nuevo el tiempo de garantía que me quedase del viejo (en mi caso 6 meses). En mi conversación con WD me quedo completamente claro que para WD la privacidad de la información de los discos enviados a ellos es crítica, y se destruiría en el caso de ser accesible de algún modo.

Resumiendo:

  • Amazon: 100% del coste del disco (o cambio por uno igual nuevo), 0€ portes, destrucción de la información: NO.
  • WD: reemplazo por disco reparado (6 meses de garantía), 7€ portes, destrucción de la información: SÍ.

Tras pensármelo unos días, me decido por enviárselo a Amazon, y comprar otro disco nuevo WD Elements (sí, es verdad, no aprendo., se que me durará 18 meses…).

El problema de los discos WD Elements, es que internamente llevan un disco se la serie Green que no están pensados para un uso intensivo, 24/7 como el que yo le quiero dar, para un servidor de archivos de red. Para eso están los discos de la serie Red. Los Blue son para alto rendimiento de sobremesa, y los Black para sobremesa normales. No encontré discos de la serie Red de más de 1TB en formato 2,5.

¿Qué puedo hacer para que cuando me falle el disco no tener problemas al enviarlo a Amazon? Lo primero es cifrar la información sensible, y segundo tener una segunda copia de la información en otro disco… Lo de la segunda copia lo obviaremos de momento, y nos centraremos en el cifrado de la información sensible en esta entrada.

A la hora de cifrar la información tenemos dos posibilidades: cifrar la información a nivel de bloque, es decir, cifrar la partición que contiene el sistema de archivos, y cifrar la información a nivel de ficheros, es decir, podemos ver los archivos, su tamaño, fechas de modificación, etc, pero no tendremos acceso a su contenido al estar cifrado.

Es más segura la primera opción ya que si no tenemos la clave para descifrar la partición no podremos obtener absolutamente ninguna información de lo que contiene. Además es algo más rápida por lo que he podido leer. Vamos a ver entonces, como creamos nuestra partición cifrada. En mi caso no va a ser ninguna partición física, usaré un archivo de 256Gb como contenedor de la información, dentro de la única partición ext4 normal que tiene el disco externo. Como es posible que dentro de un tiempo esa partición se acabe llenando y necesite más espacio, vamos a usar también LVM para solucionar el problema de las posibles ampliaciones futuras (ya que lo hacemos, lo hacemos bien, jajaja). Una vez tengamos el volumen lógico creado, usaremos LUKS para cifrarlo y luego crearemos el sistema de archivos en él.

Pasos previos: LVM

Como había dicho, antes de nada hay que crear un volumen lógico con LVM que podamos usar. Resumiendo muy muy muy mucho, con LVM podemos agrupar distintos volúmenes físicos (/dev/sdaX, o ficheros como es nuestro caso a través de /dev/loop), en volúmenes lógicos que luego podremos formatear y usar.

420px-LVM-esquema_basico

Esquema básico de LVM (Wikipedia).

En nuestro caso, convertiremos ficheros en dispositivos de bloques a través de dispositivos de loopback, después los inicializaremos para que sean reconocidos por LVM como volúmenes físicos (Physical Volumes o PV), luego crearemos un volumen lógico (Logical Volumen o LV) con ellos y finalmente daremos formato al LV para poder usarlo. Básicamente el esquema de lo que haremos es el siguiente:

lvm2

Creando los archivos físicos

Suponiendo que tenemos el disco externo montado en /mnt/Externo, la forma más rápida de crear un archivo grande (sparse file), de 256Gb en nuestro caso, es mediante el siguiente comando:

Si la seguridad es primordial, sería conveniente crear el archivo leyendo de /dev/urandom o similar en lugar de /dev/zero, y por supuesto no usar seek=256G para que todo el disco se inicialice con valores aleatorios (tardará muuuucho, horas diría yo). Lo que me interesaba es la velocidad en la creación, ya que en el caso de que alguien intente acceder al disco, lo conecte a un ordenador y no vea nada, no se molestará mas que en formatear. En el remoto caso en el que el disco llegue a manos de alguien capaz de averiguar que los ficheros Archivo1…ArchivoN, pertenecen a un sistema de archivos cifrado y quiera descifrarlos sin la clave, no me importa demasiado, la verdad, ¡jajajaja buena suerte!. Para empezar, solo crearemos un archivo base y más adelante veremos como ampliar el espacio añadiendo más archivos.

Convirtiendo los archivos en ficheros de bloques

Para usar LVM necesitamos dispositivos de bloques, no archivos. Para convertir un fichero en un archivo de bloques podemos hacerlo a través del dispositivos de loopback:

Tan fácil como eso. A partir de este momento cuando nos refiramos a /dev/loop1, estaremos usando el dispositivo de bloques asociado a Archivo1, o lo que es lo mismo: estaremos usando el Archivo1 como un disco duro. Ya tenemos nuestros dispositivos físicos (PV)

Inicializando los PV

Antes de que LVM sea capaz de usar los PV, es necesario inicializarlos (algo similar a lo que se hace con los discos RAID, antes de usarlos):

Hecho. Como queremos dejar el sistema preparado para futuras ampliaciones, vamos a crear un grupo de volúmenes (Volume Group o VG) al que posteriormente podemos añadir PVs, aunque de momento solo contendrá un PV.

Creando el VG

Para usar nuestros PVs, deben pertenecer a un VG. Vamos a ello:

En este ejemplo hemos creado el VG con solo un PV, pero se puede crear con varios, añadiéndolos al final de la orden vgcreate. Más adelante veremos como ampliarlo con vgextend.

Creando el LV (Volumen Lógico)

El LV, Volumen Lógico, es el producto final, algo equivalente a una partición tradicional, que vamos a poder usar, independientemente de lo que haya por debajo (ficheros, particiones, RAIDs, …). Como pasa en el particionado tradicional, podemos crear una partición que no ocupe el total del espacio que tenemos en el disco; con LVM2 pasa lo mismo, podemos crear uno o varios LVs dentro de un VG.

En nuestro caso queremos un solo LV que ocupe todo el VG, y más adelante ampliaremos el VG y el LV si es necesario. Creamos por tanto un LV del tamaño máximo posible, al que llamaremos ‘cifrado’ dentro del VG ‘externo’:

A partir de este momento tendremos nuestro volumen lógico, accesible desde /dev/externo/cifrado, para usarlo como si se tratase de una partición normal.

Cifrando el LV

La segunda parte de esta entrada, consiste en cifrar la informacion de nuestro LV para que, en el caso de pérdida, del disco externo, no se pueda recuperar la información y durmamos tranquilos 🙂

Para el cifrado utilizaremos LUKS (Linux Unified Key Setup), un sistema de cifrado de discos para sistemas Linux, podéis leer mas sobre el en su web. Lo primero que debemos hacer es instalar el paquete correspondiente:

Acto seguido podemos dar el formato LUKS a nuestro LV con el siguiente comando:

Podemos tener hasta 8 claves de acceso al dispositivo cifrado (key slots), donde el primero corresponde a la clave introducida con el comando de creación. ¿Qué quiere decir esto? Pues que existen ocho claves para acceder al dispositivo, y una, que se genera automáticamente, para cifrarlo. Esto es muy útil porque podemos tener una clave manual para poder acceder al dispositivo, y otras basadas en ficheros que usaremos a modo de llave para que los scripts puedan montar y desmontar el dispositivo de forma automática (para hacer backups por ejemplo). Otra utilidad es que podemos revocar una clave de acceso en cualquier momento (si la perdermos, o la olvidamos).

Creación del sistema de archivos

Como último paso nos queda crear el sistema de archivos sobre el dispositivo cifrado. Para hacerlo primero tenemos que permitir el acceso al dispositivo, abrirlo, y después formatearlo en ext4 (por ejemplo) para poder almacenar archivos en él. Para abrirlo necesitaremos una de las 8 claves (key slots) que habremos definido antes. Una vez abierto, se creará un nuevo dispositivo, en /dev/mapper, descifrado, que formatearemos y montaremos en /mnt/cifrado para poder acceder a los datos:

Tarda un par de minutos en crear el sistema de archivos, no os desesperéis. Seguidamente lo montamos, y ya tendremos nuestros datos seguros en el disco externo, pero accesibles:

Contraseñas en fichero

Como habíamos dicho, podemos tener ficheros que se usen a modo de contraseña, para no tener que estar tecleando la contraseña cada vez que queramos abrir el acceso al dispositivo cifrado, permitiendo así tareas automatizadas. La forma de crearlas es mediante los siguientes comandos:

Como veis, ya tenemos una segunda clave de acceso almacenada en el key slot 1. Para dar de alta una clave nueva, nos pide una de las ya existentes, y el archivo puede contener cualquier cosa, en mi caso he creado una clave aleatoria de 512 bytes, pero podéis poner perfectamente un poema o una imagen pequeña (un jpg…).

Podemos probar la nueva clave, pero primero debemos desmontar el sistema de archivos y cerrar el dispositivo LUKS:

Ahora ya podemos montarlo, usando el fichero como clave, y no nos pedirá la clave manual:

Automontando el sistema de archivos al iniciar

Finalmente queremos que cuando se monte el disco externo, se monte también el sistema de archivos cifrado que acabamos de configurar. Para ello debemos modificar algunos ficheros:

/etc/init/loop.conf:

Añadimos la siguiente linea a /etc/fstab:

y en /etc/rc.local añadimos el comando para abrir el dispositivo cifrado al arrancar:

De esta forma cada vez que arranquemos nuestro equipo con el disco conectado nos montará el dispositivo cifrado. Es posible ahorrarnos la ultima linea, y que el sistema abra el dispositivo cifrado automáticamente, cuando se conecte, pero esto supone modificar el archivo /etc/cryptab (no es difícil), pero al hacer uso de dispositivos de loopback para convertir archivos en dispositivos de bloques, hay que modificar las dependencias de algunos archivo en /etc/init (los relacionados con cryptdisks, udev, …) para que arranquen después de configurar el dispositivo loop y es un lío. Así funciona y es más mantenible.

Y si por cualquier motivo tenemos que enviar el disco de vuelva al vendedor, tendrá que entretenerse un rato en descifrar su contenido 🙂

Para nota: ampliar el tamaño

Si en un momento dado vemos que nos quedamos sin espacio libre podemos ampliarlo con los siguientes comandos:

Es muy importante antes de reiniciar, modificar el archivo /etc/init/loop.conf para añadir una línea para /dev/loop2 y Archivo2 (losetup /dev/loop2 /mnt/Externo/cifrado/Archivo2), si no, no funcionarán al reiniciar. Reiniciamos y solo nos queda extender el sistema de archivos que tenemos en el LV:

Como vemos, en la última línea, ya tenemos nuestro sistema de archivos cifrado y redimensionado tal y como queriamos.

Otro éxito 🙂

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *