En este documento se va ha diferenciar entre tipos de sistemas de ficheros
encriptados, como funcionan, ejemplos, problemáticas y alternativas.
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.
El VFS (Virtual File System) es el método que tiene
Linux para manejar los diferentes sistemas de ficheros. Todo el subsistema
de entrada/salida se divide por capas, al modo del subsistema de red (capa
física, capa IP, etc...).
De primeras tendríamos la capa de mas bajo nivel, la que trabajaría directamente el hardware y por encima estarían las capas de los diferentes sistemas de archivos como ext{2,3}, vfat, reiserfs, etc...
Dada la gran cantidad de formatos que puede manejar linux es necesario
disponer de un mecanismo que nos ayude a unificar todos estos sistemas
de ficheros y manejarlos de una manera sencilla y uniforme, esto es lo
que trata de hacer el VFS. Cada sistema de ficheros tiene particularidades
como permisos o modos, listas de control de acceso, propietarios, etc...
e incorpora procedimientos tanto para manejar estas funciones como para
las típicas de crear ficheros, abrirlos, borrar, etc... de esta
manera el VFS unifica los procedimientos de cada uno y se convierte en
el único sistema de ficheros para todas las aplicaciones. Si algún
proceso necesita realizar alguna operación de entrada/salida se
lo pide al VFS y es este el encargado de llamar a la función que
corresponda al sistema de ficheros donde estén los datos requeridos
y de traer y llevar datos de espacio de usuario a disco y a la inversa,
se podría decir que hace de mediador entre las aplicaciones y los
diferentes sistemas que podamos tener.
El dispositivo loopback es un dispositivo especial que nos
permite usar archivos como si de discos, CDs, o disqueteras se tratase.
Se `coloca` entre el archivo y el punto de montaje donde se monte el archivo.
Básicamente se asocia el archivo con el loopback y después
se monta este como si de otro componente hardware se tratara, lo que se
lea desde el punto de montaje será leído a través
del loopback y de ahí al archivo y de forma inversa. Aparte de esta
función bastante útil, nos proporciona una herramienta muy
potente para los sistemas de ficheros encriptados, el dispositivo loopback
también se puede asociar con un componente hardware real como un
disco duro. Esto implica que toda la información que salga/entre
al disco pasara por el dispositivo loopback.
Es decir la orden:
mount /tmp/my_filesys /mnt -o loop
en realidad se traduce por estas dos:
losetup /dev/loop0 /tmp/my_filesys
mount /dev/loop0 /mnt
Esquema de funcionamiento del dispositivo loopback:
Una vez conocemos las propiedades del VFS y el dispositivo loopback
vamos a ver que herramientas están proporcionando realmente ambos
mecanismos.
Una solución que se ve a la hora de implementar un sistema de ficheros encriptado es copiar un sistema de ficheros ya existente como pudiera ser ext2 y añadir modificaciones que permitan la codificación de la información, pero el basarse en algo ya hecho y en continua revisión, como un sistema de ficheros, implica problemas como estar alerta de revisiones, fallos y demás del sistema de ficheros base, también nos haría desperdiciar las ventajas de otros sistemas de ficheros como las listas de control de acceso (ACLs) o el journaling, tampoco seria posible mantener una versión del nuevo sistema para todos los sistemas de ficheros existentes.
La solución ideal viene de la mano del VFS y el dispositivo loopback. Mirando bien la funcionalidad que aporta cada uno de ellos se encuentra la herramienta perfecta para el funcionamiento de los sistemas de ficheros encriptados:
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
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 installY 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ónAhora 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.
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 /cryptA 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
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
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:
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.
Disponibilidad: Win 95/98/ME/XP
Url: Pc-magic
Encriptación por dispositivo loopback: No esta basado
en ningún sistema de ficheros pero se puede usar con cualquiera
existente, como se ha explicado el loopback es un dispositivo que permite
usar un archivo como si de un disco duro se tratase y este archivo puede
tener el formato que se desee. La técnica de este sistema consiste
en usar ese mecanismo del sistema de operativo y acoplarse dentro, descifrando
los datos en dirección al usuario y cifrando los que vayan hacia
el disco duro, por lo que el proceso es totalmente transparente para el
usuario.
La encriptación por loopback es el método clásico
de encriptación bajo Linux y también existente en BSD. Este
método requiere parchear el núcleo del sistema y la herramienta
de conexión del fichero con los datos encriptados con el dispositivo
loopback. Esta encriptación nos permite elegir entre bastantes cifradores
como DFC, MARS, RC6, Cast 128, IDEA, Twofish y Blowfish.
La clave seria requerida en el momento de asociar el archivo con el
dispositivo loopback.
Disponibilidad: Se pueden encontrar versiones de este sistema para Linux
2.2 y 2.4
Url: http://www.kernel.org/pub/linux/kernel/people/hvr
Directorios home encriptados: Esta técnica permite
cifrar los directorios de cada usuario para así proteger sus datos.
Su funcionamiento es el siguiente:
Cuando un usuario accede por primera vez a su directorio se le pregunta
por el espacio en disco que va ha usar, una clave y un algoritmo de cifrado,
en ese momento se crea un fichero de ese tamaño, se conecta con
un dispositivo loopback formateándolo con ext2 (unix) usando el
algoritmo y la clave elegidas por el usuario.
A partir de ese momento cada vez que un usuario entra al sistema es
preguntado por la clave y su fichero 'home' se monta en /crypt/(id-del-usuario).
Si el usuario iniciara sesión en el sistema mas de una vez al mismo
tiempo seria preguntado por la clave cada vez.
En contra este sistema no soporta métodos de login remoto como
'ssh' o cambios de usuario como 'su'.
Disponibilidad: Este proyecto actualmente parece haber desaparecido
Url: http://members.home.net/id-est.
tcfs (Transparent Cryptographic Filesystem): Se plantea
como un sustituto del NFS (Network FileSystem) y poder compartir archivos
a través de la red o directamente a la maquina local de una forma
segura y transparente. Se basa en la propiedad de añadir atributos
a los ficheros en un sistema ext2, en concreto añade el atributo
'x' para encriptar ese fichero o directorio.
Este sistema tiene muchas características importantes como:
compartición de ficheros entre los miembros de un grupo, módulos
dinámicos (3DES y RC5 de momento) que permiten usar el algoritmo
que el usuario, no el que el administrador crea conveniente, comprobación
de integridad de datos y no pide al usuario clave alguna mas que la necesaria
para el login.
Para manejar las claves de los usuarios tiene herramientas como tcfsadduser
que crea una entrada vacía en su base de datos y tcfsgenkey
genera la clave a usar a partir del la clave del fichero /etc/passwd,
por esta razon también nos facilitan herramientas para el cambio
de clave o usar una diferente a la que usa el login
Ni tan siquiera el administrador puede acceder a los archivos de los
usuarios a no ser que examine la memoria caché del disco.
Disponibilidad: Linux 2.0/2.2 OpenBSD y NetBSD
Url: http://www.tcfs.it/
ppdd (Practical Privacy Disc Driver): Usa un sistema similar
al loopback, una partición o un fichero se conecta con un dispositivo,
en este caso /dev/ppdd0 por ejemplo y este es el dispositivo que
se montara sobre un directorio, el controlador en el kernel de este dispositivo
especial es el que se encargara de cifrar y descifrar los datos.
La partición que se va ha encriptar necesita ser iniciada para
crear las llaves que se usaran mas tarde para acceder al disco, una vez
se consigue esto se conecta con /dev/ppdd0, se formatea con cualquier
sistema de ficheros (al igual que el loopback) y se monta.
Este sistema nos permite encriptar una partición y desencriptarla
sin perder los datos que contenía, además de poder cambiar
la clave del dispositivo también verifica la integridad de los datos
por medio de un checksum. Una característica muy importante de este
sistema de ficheros es el soporte pgp que nos permite usar nuestras llaves
publica y privada para el uso del disco.
Es decir que usa la ampliación comentada del dispositivo loopback,
el dispositivo ppdd es una implementación propia del autor,
pero aumentando su funcionalidad para permitir el uso de claves y funcionalidades
extras.
Disponibilidad: Linux 2.0/2.2
Url: http://www.tcfs.it/