******************************************************************************** *** *** *** Encriptación de sistemas de fichero con CRYPTOAPI del kernel *** *** Realizado por Eduardo Fco. Urrea Alcaraz *** *** eurrea (at) servitux.com *** *** http://www.servitux.com *** *** Versión: Kernel 2.6.x *** ******************************************************************************** El documento que vais a leer sirve para darle un uso util a la CryptoAPI que viene con el kernel 2.6.x. En versiones anteriores del kernel (versión 2.4.x) se necesitaba un parche, si alguno esta interesado en ver como se hace puede ver mi otro documento que tengo hecho de lo mismo pero para la versión 2.4.x del kernel. Este sistema es muy pontente, sobre todo cuando hay otras personas que pueden acceder a tu sistema (ya sea legalmente o no), ya que hace invisible los datos que hayan en el sistema de ficheros que creamos. La cuestión es que no solo sirve para esconderte de la ley, sino para datos confidenciales como puede ser claves de acceso a servidores, datos personales, correos electrónicos... Y todo lo que os podais imaginar y que sea motivo de esconder para otras personas. El sistema que vamos a utilizar solo tiene un pero, al crear un fichero que es nuestro sistema de ficheros, si no tiene los permisos adecuados cualquier persona podria borrarlo, por lo tanto, necesitaremos ocultarlo a la vista de la gente. En este documento no voy a explicar como se hace, pero os prometo hacer un documento para este cometido. 1.- Modulos de kernel que hay que compilar: Para que este sistema funcione perfectamente necesitamos cargar unos modulos en el kernel y para ello compilarlos. Gracias a los desarrolladores del kernel 2.6.x podemos disfrutar de estas posibilidades sin poner ningun parche añadido al mismo. Por lo tanto voy a pasar a explicar que opciones tenemos que colocar: Ejecutamos make menuconfig dentro del source donde tengamos nuestro kernel 2.6.x, en mi caso es /usr/src/linux y entramos en las opciones, seleccionando los modulos que visualizo a continuación: Device Drivers ---> Block devices ---> Loopback device support Cryptoloop Support Cryptographic options ---> --- Cryptographic API MD5 digest algorithm DES and Triple DES EDE cipher algorithms Blowfish cipher algorithm Twofish cipher algorithm AES cipher algorithms NOTA 1: He omitido las demas opciones porque sino cargaria el documento, y como lo que queremos es aprender a encriptar sistemas de ficheros, voy al grano y termino antes. (El tiempo es oro). NOTA 2: No he colocado todos los modulos que existen en la CryptoAPI ya que muchos de ellos no funcionan o no estan implementados para el sistema que vamos a utilizar. Ahora compilamos el kernel para que podamos cargar esos modulos y evidentemente el paso siguiente es cargarlos en el sistema, de momento vamos a cargar todos los modulos que hemos instalado, después cada uno que deje el que crea más conveniente. 2.- Crear el espacio a encriptar: Ahora vamos a crear un fichero que lo utilizaremos como si fuera una partición linux, pero con la peculariedad que estara encriptada. Solo el dueño del fichero podra montarlo y operar con él. Utilizaremos el algoritmo de cifrado twofish, aunque podemos utilizar cualquier otro (aes, des3, blowfish...). Ahora empezaremos a montar el sistema de ficheros encriptado y veremos lo facil que puede ser utilizar este sistema. El primer paso que tenemos que realizar es crear el espacio (a.k.a llamado fichero) que vamos a utilizar para realizar el sistema de ficheros encriptado del usuario, para ello se utiliza el comando "dd" para crear un fichero con "X" Mbits que sera por ejemplo el "Home" del usuario eurrea: dd if=/dev/urandom of=eurrea.home bs=1024 count=1024 Con esto creamos un fichero llamado "eurrea.home" de 1 Mb que lo rellenamos con caracteres aleatorios para más tarde crear el sistema de ficheros que vamos a utilizar (en mi caso ext2). Si ejecutamos el comando "ls -l eurrea.home" veremos la siguiente salida por consola: -rw-r--r-- 1 root root 1048576 2004-10-27 18:47 eurrea.home 3.- Crear dispositivo loop encriptado, enlazando el fichero eurrea.home: Como he dicho antes, vamos a utilizar el algoritmo TWOFISH (ver referencia al mismo en http://www.schneier.com/paper-twofish-paper.pdf) para encriptar nuestra "partición". Lo haremos de la siguiente forma: losetup -e twofish /dev/loop0 eurrea.home Cuando ejecutemos el comando que hemos descrito anteriormente nos pregunta que introduzcamos una contraseña, que sera la contraseña que vamos a tener para este recipiente encriptado. La contraseña en mi caso sera "prueba". Con esto, tenemos el fichero "eurrea.home" enlazado al dispositivo "/dev/loop0" con el algoritmo de encriptación TWOFISH. 4.- Crear el sistema de ficheros del dispositovo /dev/loop0 (eurrea.home): Ahora tendremos que crear el sistema de ficheros que vamos a utilizar para este espacio que hemos creado, en mi caso le voy a dar un sistema de ficheros EXT2: mke2fs -b 2048 /dev/loop0 NOTA 1: Segun la versión 2.6.9 del kernel, los sistemas de ficheros de journaling (EXT3 o RaiserFS) no son seguros para utilizar este sistema, por lo tanto os recomiendo que os decanteis por el EXT2. Como el dispositivo "/dev/loop0" esta enlazado al fichero "eurrea.home", se va a crear en ese fichero el sistema de ficheros EXT2 que hemos ejecutado con el comando "mke2fs". Ya tenemos un fichero que se puede montar como si de una partición o unidad de almacenamiento fuera. 5.- Montar dispositivo "/dev/loop0": En este punto vamos a montar el dispositivo "/dev/loop0" en un directorio para poder acceder a él y operar: mkdir eurrea mount /dev/loop0 eurrea/ Como hemos visto, se ha montado perfectamente y para comprobarlo solo tenemos que ejecutar el comando "df" y nos dira lo siguiente: S.ficheros Bloques de 1K Usado Dispon Uso% Montado en ... /dev/loop0 1000 18 932 2% /home/eurrea ... Pues ahora podemos entrar al directorio "/home/eurrea" y realizar operaciones con él, grabar ficheros, realizar programas, almacenar claves... lo que se nos pase por la cabeza. Como veis se trata como si de una partición de disco duro fuera, por lo tanto podemos hacer las mismas operaciones. A simple vista nosotros no vemos nada encriptado, pero el sistema esta funcionando perfectamente y en los siguientes puntos lo demostraremos. 6.- Escribiendo un fichero de prueba en el espacio encriptado: Ahora vamos a escribir un fichero en el espacio que hemos montado, crearemos un fichero txt (de texto) para después hacer comprobaciones de si de verdad esta encriptado o no, para esto ejecutaremos el siguiente comando: echo "Servitux" > fichero_secreto.txt Si ejecutamos el comando "ls -l" veremos que el fichero se ha creado correctamente y nos sale la siguiente salida por consola: -rw-r--r-- 1 root root 9 2004-10-27 19:11 fichero_secreto.txt El contenido del fichero, como vemos en el comando "echo" que hicimos anteriormente, es "Servitux", para comprobarlo podemos ejecutar el comando "cat fichero_secreto.txt" y nos saldria por consola la palabra que creamos en ese fichero. Como vemos, parece que todo va correctamente y nosotros no vemos nada encriptado... vamos a ello. 7.- Desmontando dispositivo "/dev/loop0": Ahora desmontaremos el dispositivo encriptado y quitaremos el enlace de "/dev/loop0" al fichero "eurrea.home": umount /dev/loop0 losetup -d /dev/loop0 Ahora si ejecutamos el comando "df" veremos como el dispositivo ya no esta montado. Ahora se supone que el fichero que creamos esta dentro del fichero "eurrea.home" que es el que contiene nuestro sistema de ficheros encriptado. 8.- Montar fichero "eurrea.home" correctamente para operar con él: Ahora, para poder trabajar con el fichero "eurrea.home" perfectamente, debemos de meter en el comando "mount" los siguientes parametros: mount eurrea.home /home/eurrea -o encryption=twofish Nos pregunta por la contraseña que le pusimos al crear el sistema de ficheros (recordar que pusimos "prueba" de contraseña) y a introducirla vemos como no nos da ningun error y se monta correctamente el dispositivo. Esta es la forma de montar el dispositivo, la que explicamos en los puntos anteriores solo nos sirve para crear el sistema de ficheros encriptado, por lo tanto recordar el parametro del comando "mount" que teneis que poner y por supuesto, no olvidar la contraseña, porque si lo hicieramos seria muy dificil (por no decir imposible) recuperar los datos de ese sistema encriptado. En caso de que nos equivoquemos introduciendo la contraseña el sistema nos dice que "mount: debe especificar el tipo de sistema de ficheros" y por lo tanto cualquier persona que pueda trastear con el fichero nunca se imaginara que es un sistema de ficheros. Si lo montamos sin poner el parametro "encryption=twofish", nos dira el mismo error. Por lo tanto para ojos de otras personas eso es un fichero sin más. Si hemos introducido correctamente la clave al montar el sistema de ficheros, veremos que lo que hicimos anteriormente (crear un fichero llamado fichero_secreto.txt), se puede ver perfectamente y se puede operar con él. Ahora desmontaremos el sistema de ficheros encriptado y comprobaremos si se puede sacar datos del mismo sin saber el password. umount /home/eurrea Si ejecutamos el comando "strings" con el fichero "eurrea.home" para ver si podemos localizar la cadena "Servitux" que almacenamos en el fichero "fichero_secreto.txt", nos daremos cuenta como no sale nada. No es visible por ninguna persona el contenido de ese fichero porque esta encriptado. Claro esta que sin hacer una prueba que lo demuestre no os quedareis satisfechos y por supuesto se va ha realizar para que veais que sin encriptación si que sacamos el contenido del fichero que creamos. Para esta comprobación, ejecutamos el siguiente comando: # strings eurrea.home | grep Servitux No sale nada. 9.- Realizar lo mismo pero sin encriptación: Si realizamos la misma operación pero sin encriptar, veremos que con el comando "strings" podremos ver el contenido de ese fichero en ese fichero que es el sistema de ficheros que montamos. Los pasos siguientes son para crear un sistema de ficheros no encriptado y por lo tanto inseguro: dd if=/dev/urandom of=paco.home bs=1024 count=1024 losetup /dev/loop0 paco.home mke2fs -b 2048 /dev/loop0 mount /dev/loop0 paco/ echo "Servitux" > paco/fichero_secreto.txt umount paco/ mount paco.home paco/ -o loop (Nos deja sin pedir contraseña) umount paco/ strings paco.home | grep Servitux Como podemos ver, nos sale que si ha encontrado una coincidencia, y curiosamente la palabra que nosostros introducimos en el fichero "fichero_secreto.txt". Por lo tanto deducimos que no esta encriptado. 9.- Una de imaginación: Casi todos hemos tenido cuentas en servidores donde habian muchos usuarios y varios administradores. En ese servidor almacenamos documentos y programas de interes importante y no queremos que nadie pueda acceder a ellos para poder grabarselos. Por ejemplo podria ser un trabajo de fin de carrera, que no queremos que nadie se lo copie para poder implementarlo él o quien sabe... copiarselo para su propio beneficio hasta que sea publico. Pues bien, con este sistema nos creariamos un ficherito que ocupara lo suficiente para almacenar esos documentos/programas y cada vez que salieramos del sistema lo desmontariamos. Así nadie podria nunca ver lo que uno esta haciendo. Por supuesto tienes que llegar a un consenso con el administrador de sistemas para que de más privacidad al servidor y coloque los modulos necesarios para que funcione. Y que te dejara montar unidades. Tambien podriamos tener un sistema de ficheros encriptado para nuestro propio ordenador, para almacenar todos los datos importantes que no queremos que cualquier otra persona (familia, compañeros de trabajo, amigos que tengan shell en tu máquina...) pueda ver. O bien podriamos tener una llave USB de almacenamiento que contenga el fichero encriptado y que solo tu pudieras montarla y nadie que pueda acceder a la llave USB pudiera ver que tienes en ese dispositivo. Como veis, se puede utilizar para muchos casos diferentes y podria hacer páginas y páginas con ejemplos. 9.- Conclusión: Este sistema es facil, ligero y elegante de utilizar para cuando tenemos que almacenar cosas de caracter personal que no queremos que otras personas (ya sea con permiso o sin él) puedan ver cuando nos ausentamos de nuestro ordenador o para otras cosas más que no voy a explicar aquí y que los lectores deduciran inmediatamente. Ahora el siguiente documento que realizare sera el de ocultar ese fichero del sistema, para que nadie pueda verlo y menos borrarlo. Un saludo.