jueves, 18 de diciembre de 2014

EncFS, cifrando archivos de manera sencilla y en espacio de usuario ;)

Con la llegada de FUSE al mundo informático se han hecho posible cosas muy interesantes en el campo de los sistemas de archivos. En esta caso particular vamos a ver cómo mantener cifrados nuestros archivos de manera sencilla sin necesidad de recurrir a soluciones como cifrado completo de la partición o volúmenes truecrypt. Esto no significa que esta solución sea mejor o peor que las que acabo de mencionar, sino simplemente diferente y posiblemente mas sencilla en determinados escenarios.

Vamos a utilizar EncFS que nos proveerá un sistema de archivos cifrado en espacio de usuario. Básicamente vamos a tener dos directorios:
  • Directorio origen (de ahora en mas origen): este es el directorio donde se almacenaran definitivamente nuestros archivos, pero cifrados
  • Directorio destino (de ahora en mas destino): este es el directorio que montaremos con EncFS y desde donde, dada la correcta clave de descifrado, podremos tener acceso a los archivos descifrados. 
Esto significa que por cada archivo creado en dest tendremos un archivo en orig, a su vez podremos observar que incluso el nombre de los archivos se encontrará cifrado.

Instalando EncFS

La mayoría de las distribuciones cuentan con encfs dentro de sus repositorios oficiales así que con un simple apt-get install encfs o yum install encfs es suficiente. Para los aventureros del ./configure && make pueden obtener las fuentes de encfs aquí y may the force be with you.

Mi directorio cifrado

Preparamos el entorno para la prueba.

juan@moon:~/pruebas$ pwd
/home/juan/pruebas
juan@moon:~/pruebas$ mkdir origen destino
juan@moon:~/pruebas$ ls
destino  origen
juan@moon:~/pruebas$ 


Corroboramos tener instalado encfs de la siguiente manera:

juan@moon:~/pruebas$ encfsctl
encfsctl versión 1.7.4
Uso:
encfsctl (directorio raíz)
-- muestra información sobre el sistema de archivos, o
encfsctl info (root dir)
  -- mostrar información (orden por defecto)
encfsctl showKey (root dir)
  -- show key
encfsctl passwd (root dir)
  -- cambiar la contraseña para el volumen
encfsctl autopasswd (root dir)
  -- cambiar la contraseña para el volumen, se leerá la contraseña de la entrada estándar.
     No se imprime ningún mensaje.
encfsctl showcruft (root dir)
  -- muestra los nombres de los archivos indescifrables en el volumen
encfsctl cat (root dir) path
  -- decodifica el archivo y lo muestra en la salida estándar
encfsctl decode [--extpass=prog] (root dir) [encoded-name ...]
  -- decodifica el nombre y lo muestra en texto plano
encfsctl encode [--extpass=prog] (root dir) [plaintext-name ...]
  -- codifica un nombre de archivo y muestra el resultado
encfsctl export (root dir) path
  descifra un volumen y escribe los resultados a la ruta
encfsctl --version
  -- imprima el numero de versión y termine

Ejemplo:
encfsctl info ~/.crypt

juan@moon:~/pruebas$


Ahora montamos el directorio origen en el directorio destino.

juan@moon:~/pruebas$ encfs $(pwd)/origen/ $(pwd)/destino/
Creando nuevo volumen cifrado.
Por favor, seleccione una de las siguientes opciones:
introduzca "x" para modo de configuración para expertos,
introduzca "p" para el modo preconfigurado paranoico,
cualquier otra cosa (o una línea vacía) seleccionará el modo estándar.
?>

Configuración estándar seleccionada.

Configuración finalizada. El sistema de archivos que se va a crear tendrá las siguientes propiedades:
Cifrado del sistema de archivos: "ssl/aes", versión 3:0:2
Codificación de nombres de archivos: "nameio/block", versión 3:0:1
Tamaño de clave: 192 bits
Tamaño de bloque: 1024 bytes
Cada archivo contiene una cabecera de 8 bytes con datos únicos del IV.
Los nombres de archivos se codificarán usando el modo de encadenamiento de IV.
Agujeros en archivos pasados a través del ciphertext.

A continuación se le pedirá una contraseña para el sistema de archivos.
Debe recordar esta contraseña, ya que no existe absolutamente ningún mecanismo de recuperación. No obstante, la contraseña puede cambiarse después con encfsctl.

Nueva contraseña EncFS:
Verifique la contraseña EncFS:
juan@moon:~/pruebas$


Ajam, así de simple. Claramente opté por las opciones por defecto que son mas que suficiente a fines prácticos. En resumen se está utilizando:
  • AES con clave de 192 bits como algoritmo simétrico de cifrado.
  • El tamaño de bloque define el mínimo tamaño de operación, es decir que para leer un byte del archivo se descifrará el bloque de 1024 bytes que contiene el byte objetivo. 
  • A su vez los nombres de los archivos serán también cifrados para que no puedan ser reconocidos fácilmente.
Esta operación a generado lo que se denomina una clave de volumen con la que realmente se cifran los archivos y a la que tenemos acceso a través de la clave que hemos elegido.

Habiendo montado exitosamente el directorio vemos que se ha creado el archivo origen/.encfs6.xml, donde se registra toda la configuración de cifrado que encfs precisa conocer para poder acceder a nuestra información y poder presentarla de manera legible.

juan@moon:~/pruebas$ ls -lah origen/
total 12K
drwxrwxr-x 2 juan juan 4,0K dic 18 19:58 .
drwxrwxr-x 4 juan juan 4,0K dic 18 20:17 ..
-rw-rw-r-- 1 juan juan 1,1K dic 18 19:58 .encfs6.xml
juan@moon:~/pruebas$


 De todas maneras lo que nos interesa es ver si se montó o no exitosamente, es lo podemos ver de la siguiente manera:

juan@moon:~/pruebas$ mount|grep destino
encfs on /home/juan/pruebas/destino type fuse.encfs (rw,nosuid,nodev,default_permissions,user=juan)
juan@moon:~/pruebas$


Efectivamente funcionó. Ahora probamos su funcionamiento:

juan@moon:~/pruebas$ echo "Mi archivo seguro" > destino/NoLeer.txt
juan@moon:~/pruebas$ ls origen/
Wq-Ec1d66A98AuzX62iEzuYX
juan@moon:~/pruebas$ ls destino/
NoLeer.txt
juan@moon:~/pruebas$ cat origen/Wq-Ec1d66A98AuzX62iEzuYX
� � ��Q��$M2���-ځ�7juan@moon:~/pruebas$ cat destino/NoLeer.txt
Mi archivo seguro
juan@moon:~/pruebas$


Cree un archivo llamado NoLeer.txt dentro del directorio destino cuyo contenido es Mi archivo seguro y notamos lo siguiente:
  • El archivo correspondiente a NoLeer.txt en el directorio origen es Wq-Ec1d66A98AuzX62iEzuYX. Esto nos indica que el nombre del archivo también está siendo protegido.
  • El contenido del archivo es absolutamente ilegible en el directorio origen pero perfectamente legible en el directorio destino (era de esperarse :P).
Ahora desmontamos el directorio para ver con qué nos quedamos:

juan@moon:~/pruebas$ fusermount -u $(pwd)/destino
juan@moon:~/pruebas$ ls destino/
juan@moon:~/pruebas$ ls origen/
Wq-Ec1d66A98AuzX62iEzuYX
juan@moon:~/pruebas$


Lo único que quedó visible es el directorio origen con el archivo cifrado, por lo tanto nuestra información está a salvo.

Podemos volver a acceder a los archivos cifrados si volvemos a montar el directorio:

juan@moon:~/pruebas$ encfs $(pwd)/origen/ $(pwd)/destino/
Contraseña EncFS:
juan@moon:~/pruebas$ ls destino/
NoLeer.txt
juan@moon:~/pruebas$

Posibles aplicaciones:

Algunas de las aplicaciones que se me ocurren para EncFS son:
  • Cifrar el contenido que subimos a "la nube". El caso más claro sería Dropbox, todos lo usan pero pocos cifran la información que almacenan allí, con EncFS sería muy sencillo.
  • Cifrado de backups.
  • Cifrado local de archivos.

Ventajas de EncFS:

Son varias las ventajas de utilizar EncFS, algunas de ellas son:
  • Por defecto solo el usuario que haya montado el directorio puede leer su contenido, ni siquiera root podría hacerlo. 
juan@moon:~/pruebas$ encfs $(pwd)/origen/ $(pwd)/destino/
Contraseña EncFS:
juan@moon:~/pruebas$ ls destino
NoLeer.txt
juan@moon:~/pruebas$ sudo su -
[sudo] password for juan:
root@moon:~# ls /home/juan/pruebas/destino
ls: no se puede acceder a /home/juan/pruebas/destino: Permiso denegado
root@moon:~#  

  • El volumen EncFS no ocupa espacio, y crece y decrece de acuerdo a los archivos que se agreguen.

No hay comentarios:

Publicar un comentario