Secretos

De Astillas.net
Nombre del proyecto Secretos
Fecha de comienzo 2/06/2011
Puesta en marcha
Descripción Directorio remoto de acceso automatizado con archivos cifrados.
Histórico



Conceptos y requisitos

Este proyecto define un método para disponer de acceso seguro a un grupo de archivos situados en un servidor remoto bajo las siguientes premisas:

  1. Los archivos tienen que almacenarse cifrados en un lugar remoto.
  2. Las comunicaciones con dicho lugar deben realizarse también cifradas.
  3. El acceso a los archivos debe automatizarse todo lo posible.
  4. El usuario debe introducir la contraseña -obligatoriamente- para acceder a los datos.

Enlaces y referencias

Esquema principal

Una vez vistas las premisas y analizadas las herramientas existentes en una distribución Debian -rama estable- descubrimos estas limitaciones:

  1. El acceso al servidor remoto no puede ser concurrente (en escritura al menos).
  2. Para efectuar copias de seguridad con garantía es necesario desmontar los volúmenes, por lo que se hace obligado emplear controles de actividad sobre los datos (timeouts).
Sshfs-encfs-afuse.png

En este caso disponemos de un espacio de almacenamiento remoto al que podemos acceder vía SSH, sin limitaciones de transferencia, y que vamos a usar para guardar los archivos cifrados. Este acceso consiste en una cuenta de pago en llos servidores de la empresa rsync.net aunque puede valer cualquier máquina con el mismo tipo de servicios y siempre que no exista una limitación en la transferencia de datos.

Así pues los archivos cifradas se situarán en el directorio $HOME/.crypt e inmediatamente después se descifrarán y estarán disponibles -tras leer la contraseña de cifrado por pantalla- en el directorio final $HOME/crypt.

Transcurrido un tiempo desde que los datos están accesibles el sistema (sshfs) cerrará la conexión para no ocupar recursos de red y quedará a la espera de un próximo intento de acceso. Cuando ésto se produzca realizará la conexión de nuevo.

Procedimientos

Preparativos en rsync.net

Creamos una clave RSA para emplearla como acceso directo a nuestra cuenta SSH, asegurándonos de no definir ninguna contraseña.

$ ssh-keygen -t rsa -f ~/.ssh/secretos
Generating public/private rsa key pair.

...
             
Your public key has been saved in /home/victor/.ssh/secretos.pub.
...
$ 

Y procedemos a añadir la clave pública al archivo ~/.ssh/authorized_keys tal y como enseñan en la documentación.

Además, y anticipando la necesidad de disponer de más de un punto de montaje cifrado, creamos un directorio sobre el que trabajaremos después:

$ ssh -i ~/.ssh/secretos 9999@rsync.net mkdir caja-de-pandora

Automatizando el acceso a rsync.net

Cuando las herramientas de cifrado de datos intenten acceder a los datos en sí necesitamos que el montaje remoto de éstos se realice sin intervención en este punto.

Para ello dividimos las tareas en partes y creamos pequeños programas que las lleven a cabo. Comenzamos por definir algunos datos globales en el archivo ~/bin/secretos_lib.sh:

# Punto de montaje de datos cifrados
MOUNTPOINT=~/.crypt

# Usuario y servidor ssh remoto
REMOTE_HOST=9999@rsync.net

# Directorio remoto 
REMOTE_DIR=caja-de-pandora

# Tiempo de inactividad en segundos (antes de desmontar)
TIMEOUT=300

Continuamos con el montaje en el archivo ~/bin/mount_rsync.sh)

#!/bin/sh

source ~/bin/secretos_lib.sh
[ ! -d $MOUNTPOINT ] && mkdir $MOUNTPOINT

sshfs REMOTE_HOST:REMOTE_DIR $MOUNTPOINT -o IdentityFile=~/.ssh/secretos

seguimos con el desmontaje seguro en el archivo ~/bin/umount_rsync.sh

#!/bin/sh

source ~/bin/secretos_lib.sh

fusermount -z -u $MOUNTPOINT

y ensamblamos las dos operaciones bajo la supervisión del programa afuse en el archivo ~/bin/automount_rsync.sh:

#!/bin/sh

source ~/bin/secretos_lib.sh

afuse $MOUNTPOINT -o mount_template="~/bin/mount_rsync.sh" \
      -o unmount_template="~/bin/umount_rsync.sh" -o timeout=$TIMEOUT

Preparando el volumen cifrado

Uniendo elementos

Herramientas

afuse

afuse es un programa de automontaje de sistemas de archivos en espacio de usuario (empleando el mecanismo llamado fuse) por lo que no es necesario usarlo con privilegios de administrador ni, por descontado, añadir módulos especiales al núcleo más allá del propio fuse.

En Debian existe en paquete propio y se emplea de esta forma

afuse punto_de_montaje opciones

donde las opciones principales y obligatorias son

-o mount_template="plantilla"

Define cómo montar el recurso y dispone de una mínima sustitución de textos:

  •  %r nombre del directorio raíz
  •  %m punto de montaje
-o unmount_template="plantilla" Define cómo desmontar el recurso.

mientras que las opciones no obligadas pero muy interesantes son

-o timeout=segundos Número de segundos que deben transcurrir sin actividad sobre el sistema de archivos para desmontarlo.

Problemas

Permisos en archivos

Existe cierto problema con los permisos de acceso a los archivos que puede llegar a ser irresoluble, y que consiste en que mientras que en un acceso normal por ssh se respetan las disposiciones del entorno, tales como la máscara de permisos (umask), en un acceso vía fuse no es así, por lo que la creación de archivos puede dar unos resultados inesperados, tanto como que en el lado cliente aparezcan unos y en el lado servidor aparezcan otros.

Una descripción del problema y sus soluciones se puede encontrar en el blog de André Frimberger, mientras que en el foro del proyecto el autor menciona que la solución más civilizada pasa por ajustar la máscara en el subsistema sftp del servidor, que es el que realmente lidia con los archivos. Esto no siempre es posible, y en lugares como rsync presumo que es así, porque no se puede cambiar la configuración global del servidor ssh y menos aún reiniciarlo.

Si se tiene el control del servidor ssh tendremos que cambiar su configuración, tocando el archivo /etc/ssh/sshd_config y reiniciarlo posteriormente.

Subsystem sftp /usr/lib/openssh/sftp-server -u0002

Ahora, si nuestra propia máscara de sesión lo permite, los archivos tendrán los permisos adecuados a las directivas setgid de los directorios (que en mi caso es algo necesario para compartir dicha información).