Sistemas de ficheros encriptados y
seguridad de dispositivos de almacenamiento en general


Introducción

A menudo se plantea la necesidad de almacenar datos confidenciales en soportes físicos como pueden ser discos duros o CDRoms, en casos como estos necesaria una herramienta que nos permita ocultar esta información a los ojos que no la deben ver. La solución mas sencilla seria esconder esta información o protegerla con algún tipo de clave simple, pero esto no es suficiente de ningún modo, métodos como ocultar carpetas o guardar CDs debajo del monitor no son decentes, además también tenemos el peligro del robo del material, y una vez robado ya nada podremos hacer para evitar que la información sea descubierta. La solución adecuada es la encriptación, convierte datos coherentes en aparente basura y puede pasar desapercibida incluso, y aun en caso de robo, puede permanecer oculta durante mucho tiempo.

En este documento se va ha diferenciar entre tipos de sistemas de ficheros encriptados, como funcionan, ejemplos, problemáticas y alternativas.


Soluciones

De primeras, los sistemas de ficheros encriptados pueden ser divididos en dos grandes grupos en base a su filosofía, fiabilidad y la confianza que se puede tener en ellos.

Así pues tendremos soluciones abiertas y cerradas:

Soluciones cerradas: El modelo general es el de una empresa de software que ofrece un programa o conjunto de ellos que puede instalar un niño incluso y en unos minutos abra puesto los datos confidenciales bajo una clave.

Soluciones abiertas: Una o varias personas por afición simplemente escriben un código que debemos compilar, modificar algunos programas que tenemos ya instalados, modificar particiones, mover datos e incluso modificar el sistema operativo, después de esto obtendremos el mismo resultado que con la solución cerrada, solo que en mas tiempo y con alguna que otra complicación. Estos sistemas se implementan sobre un sistema de ficheros ya existente modificando algunos aspectos del mismo.

A primera vista puede parecer mucho mejor la solución cerrada frente a la abierta ya que nos respalda una empresa que se puede hacer responsable de la perdida de los datos, además las complicaciones son nulas ya que suelen venir acompañadas de asistentes y demás parafernalia. La solución abierta parece prehistórica y complicada, con retoques en el núcleo del sistema y demás 'cosas raras'. Pero, cuidado, se debe confiar mucho mas en el modelo abierto y mas en temas de seguridad como estos. Una empresa seria raro que usara criptografía fuerte para proteger estos datos ya que esta prohibida en países como Francia o la exportación desde EE.UU. de algoritmos y programas que la usan, lo cual restaría terreno para vender el producto.
Al ser una empresa que se sustenta de sus ganancias no facilitaría el código fuente de su producto, esto no debería esconder ninguna maldad en principio, pero en los tiempos que corren las libertades del individuo y su posibilidad de esconder algún secreto personal son mermadas cada día y este software puede contener algún tipo de puerta trasera que permita a otras personas o agencias de investigación husmear sin ningún tipo de permiso. Por supuesto el código cerrado, al igual que el abierto, puede contener errores de programación que podrían corromper los datos almacenados, pero la diferencia esta en que el modelo abierto cualquiera puede leer el código y buscar errores e incluso arreglarlos, nosotros o alguna otra persona. Estas son dos razones de bastante peso para elegir una solución abierta frente a una cerrada, mas bien, definitivas.


Funcionamiento de los sistemas de ficheros encriptados

Antes de poder explicar como funciona un sistema de ficheros encriptados se han de explicar unos conceptos previos como el VFS y el dispositivo loopback dada su importancia en dicho funcionamiento. Uniendo los dos mecanismos tenemos un sistema con el cual podemos ver como pasa toda la información de/al sistema de entrada/salida por un solo punto y bajo un formato único.

Este punto es donde trabajan los sistemas de ficheros encriptados, modificando las operaciones de escritura/lectura del dispositivo loopback para manejar los datos que pasan, cifrando y descifrando según convenga, de este modo se pueden añadir funciones de transformación de los datos que pasan a través del dispositivo sin preocuparnos de donde van a ir a parar o como va ser su forma de organizarse en el medio de almacenamiento. Así se obtiene una abstracción bastante grande, sin necesidad de reinventar el sistema de ficheros o crear uno nuevo.

En resumen los sistemas de ficheros encriptados bajo loopback funcionan de la siguiente forma:
Un dispositivo, un disco duro por ejemplo, se asocia con un loopback, en el momento de la asociación se envía al kernel una señal, un ioctl, que le especifica el sistema de cifrado y la clave. Desde ese momento, toda referencia al loopback se traducirá en una referencia al disco original tras una transformación de los datos según la clave y el sistema de cifrado.
De este modo se obtiene un disco totalmente ilegible que, solamente asociándolo con la clave correcta, se convierte en datos interpretables a través del dispositivo loopback de lo contrario el disco aparecerá con formato incorrecto.

Ahora bien, si se pretende ir mas allá y posibilitar el uso de llaves o certificados la solución se ha de llevar un poco mas lejos, ya que el dispositivo loopback permite solamente, el uso de claves y cifradores, pero no es suficiente para estos estos objetivos.

A la hora de implementar este tipo de sistemas de ficheros, se usa una alternativa al dispositivo loopback, se trata de una implementación propia del desarrollador de este dispositivo que aporte mayor funcionalidad al dispositivo para que admita llaves y certificados. Así el nuevo tipo de dispositivo admitiría nuevos ioctl's que podrían transportar el certificado o llave hasta el kernel para después traducir los datos del mismo modo que lo hacia el loopback.
En resumen, el funcionamiento de este método seria igual que el anterior pero sustituyendo el loopback por el nuevo dispositivo


Ejemplo practico

Para dar un ejemplo de como se usa un sistema de ficheros encriptado se ha elegido el método por loopback ya que es el sistema mas o menos común a todos los otros métodos.
  1. Software

  2. Necesitaremos los parches y utilidades para conseguir el soporte de encriptación. Exactamente necesitaremos:
    Fuentes del sistema operativo
    Soporte de encritpación a nivel de núcleo
    Parche para el dispositivo loopback
    Herramientas de ajuste del loopback
    Parche para las herramientas de ajuste
  3. Modificaciones en el software

  4. Una vez tenemos el software hemos de aplicar los parches a las fuentes.
    Aplicar un parche significa modificar el código fuente que tenemos con unas modificaciones que se encuentran en el parche de forma automática con una simple línea de comandos.
    Primero modificamos las herramientas de ajuste:
                    ibiscus:~/crypto# tar -jxf util-linux-2.11n.tar.bz2
                    ibiscus:~/crypto# patch -p0 < util-linux-2.11n.patch
                    ibiscus:~/crypto# cd util-linux-2.11n
                    ibiscus:~/crypto/util-linux-2.11n # ./configure && make && make install
    
    Y ahora se aplicaría el parche del kernel:
                    ibiscus:/usr/src# tar -jxf kernel-2.4.16.tar.bz2                    # Descomprimir
                    ibiscus:/usr/src# patch -p0 < /root/crypto/loop-jari-2.4.16.0.patch # Aplicamos el parche del loopback
                    ibiscus:/usr/src# patch -p0 < /root/crypto/patch-int-2.4.16.3       # Aplicamos la API de encriptación
    
    Ahora una vez tenemos que modificado el núcleo debemos activar las nuevas funcionalidades y recompilarlo. Para ello bastara con hacer make menuconfig en el directorio /usr/src/linux, ir hasta la entrada de Cryptographic options y activar las opciones que se consideren convenientes, salir salvando y ejecutar make bzImage, ahora ya tenemos el kernel listo y solo resta reiniciar la maquina con él.
     
  5. Configuración del dispositivo loopback.

  6. Esta parte es la mas sencilla del proceso.
    Primero debemos conectar el disco duro que vamos a usar bajo encriptación con un dispositivo loopback, diciéndole el algoritmo a usar y el numero de bits, luego se debe formatear, se monta y ya esta listo para usar.
                    ibiscus:~# losetup -e rc5 -k 128 /dev/loop0 /dev/hda2
                            <En este momento nos pedirá una contraseña>
                    ibiscus:~# mke2fs -F -q /dev/loop0
                    ibiscus:~# mount /dev/loop0 /crypt
    
    A partir de este momento los datos que se guarden en /dev/hda2 estarán cifrados ya que al pasar por loop0 se cifran, el acceso a través de /crypt será totalmente transparente y funcionara del mismo modo que un disco duro normal
  7. Uso cotidiano del disco cifrado.

  8. Una vez hemos hecho todas estas operaciones el disco duro ya esta listo para ser usado de forma habitual, pero requerirá un par de comandos.
                    Para empezar a usarlo:
                    ibiscus:~# losetup -e rc5 -k 128 /dev/loop0 /dev/hda2
                            <Introducir la contraseña anterior>
                    ibiscus:~# mount /dev/loop0 /crypt
    
                    Para dejar de usarlo:
                    ibiscus:~# umount /dev/loop0
                    ibiscus:~# losetup -d /dev/loop0
    

Problemática

Todos los sistemas de ficheros encriptados vistos hasta ahora necesitan de un cierto ajuste antes de poder ser montados y usados. Esto plantea un problema si queremos que todo nuestro sistema este bajo una clave, ya que para realizar estos ajustes previos debemos usar unas aplicaciones que forzosamente tienen que estar el disco y por tanto bajo un sistema de ficheros encriptados, es un circulo vicioso del que no se puede huir. Las opciones que podemos tomar son pocas, podemos optar por tener solo la parte esencial del sistema en plano, para poder ejecutar el ajuste y luego unir el resto del sistema sin mas complicaciones. Otra opción es tener un mini sistema en plano que realice del mismo modo el ajuste pero en vez de unir el sistema se cambiaria, se trataría de, una vez hecho el ajuste, montar esos discos encriptados y cambiar la raíz del árbol de directorios al punto de montaje de un disco.

Otra posible solución seria `incrustar` los ajustes en el propio núcleo del sistema pero implicaría tener que arrancar este núcleo desde un soporte en plano.
Así pues parece que la encriptación total es algo utópica, pero por supuesto existen otras alternativas

Alternativas

Existen alternativas a la encriptación del disco que no responden a ningún esquema en concreto.
Desplazamiento de particiones

Este método es utilizado cuando se necesita ocultar todo el sistema, es decir, desde la raíz del árbol de directorios, y poder iniciar el sistema sin ningún tipo de disquete, CD, o clave alguna, pero manteniendo la seguridad de los datos en caso de robo del soporte físico o ataques desde otro disco duro.
En el momento del arranque del sistema el núcleo lee desde el disco la tabla de particiones y a partir de ese momento no se vuelven a mirar para nada, el núcleo ya conocerá entonces el numero, tipo, inicio y longitud de todas las particiones del disco. La técnica consiste en modificar el núcleo, haciendo que en el momento de leer las particiones del disco, en vez de ejecutar este código de detección se ejecute otro que le digan al núcleo donde están las verdaderas particiones, técnicamente esto significa rellenar a mano las estructuras internas del kernel donde se guarda esta información. Un disco, por ejemplo de 40 Gbytes, podría tener escritas en disco, dos particiones de 20 Gbytes cada una, pero interiormente el núcleo sabe, por que lo lleva escrito dentro, que existen tres particiones, la primera de las cuales empieza 20 Mbytes mas allá del inicio del disco, entre esta y la segunda y la segunda y la última puede existir varios Mbytes de separación y la última puede acabar unos cientos de Mbytes antes del fin del disco. El esquema del disco quedaría del siguiente modo:

Este método necesita de un segundo disco para efectuar estas operaciones antes de poderlo usar como raíz del sistema.
Gracias a que el cargador de arranque se encuentra en el MBR (Master Boot Record) no habra problemas para encontrar el núcleo en del disco y el sistema podrá arrancar normalmente las particiones desplazadas.
Este método se puede mejorar llenando de datos aleatorios todo el disco para despistar a los programas recuperadores de particiones. Así pues los pasos para disponer de un sistema así son:

  1. Llenar de datos aleatorios el disco secundario.
  2. Modificar el núcleo para que use particiones desplazadas del disco secundario.

  3. Posteriormente arrancar con este núcleo.
  4. Dar formato a las particiones del disco secundario, instalar un sistema en estas particiones.
  5. Modificar de nuevo el núcleo para que use las mismas particiones desplazadas, pero en el disco primario. Intercambiar los discos de posición y reiniciar con este nuevo núcleo.
Con este sistema conseguimos que esas particiones solamente puedan ser usadas con el kernel que se ha compilado a propósito para ellas o uno con los mismos valores claro. Chequeo de BIOS

Este sistema se puede usar junto con el anterior para evitar que el disco sea instalado y arrancado en otro ordenador al ver que no podía ser leído desde otro sistema, es decir como una segunda línea de defensa del sistema de particiones desplazadas. En la mayoría de las BIOS existen unos bites libres que pueden ser usados libremente, en estos bites se pueden colocar unos valores escogidos por el usuario. Desde el momento del arranque el kernel puede leer los valores de estas posiciones y compararlos con unos valores que tiene internamente, al igual que la información sobre particiones, y en caso de no coincidir negarse a continuar la carga del sistema operativo.
Eliminación de parametros

Estos dos métodos son totalmente inútiles si el núcleo admite parametros y justo despues del iniciar el sistema ejecuta un interprete de comandos en vez de iniciar la secuencia normal de arranque y preguntar por un login y password. Esta técnica es muy sencilla de llevar a la practica, requiere, como las dos anteriores modificar el núcleo, solo se necesita comentar la linea donde la linea de parametros en interpretada, de este modo sera como si nunca le hubiese llegado ningun parametro.

Uniendo los tres métodos, particiones desplazadas, chequeo de BIOS y eliminació de parametros, se consigue que el sistema únicamente arranque en un ordenador preparado a propósito y solamente con un núcleo de sistema operativo preparado al efecto. Además se puede combinar con encriptación de algunas particiones, doble encriptación, etc...
Obviamente todas estas medidas de seguridad no sirven de nada si el sistema tiene fallos graves que permitan el acceso privilegiado al interior del sistema aprovechando fallos en el software instalado. Pero a la vez también sera dificil recuperar los datos que estan bajo estos metodos en caso de que algo falle.


Principales soluciones existentes


Autor: Luis López López