Secretos
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 | |
---|---|
Sumario
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:
- Los archivos tienen que almacenarse cifrados en un lugar remoto.
- Las comunicaciones con dicho lugar deben realizarse también cifradas.
- El acceso a los archivos debe automatizarse todo lo posible.
- El usuario debe introducir la contraseña -obligatoriamente- para acceder a los datos.
Enlaces y referencias
- Enlaces externos:
- Enlaces internos:
Esquema principal
Una vez vistas las premisas y analizadas las herramientas existentes en una distribución Debian -rama estable- descubrimos estas limitaciones:
- El acceso al servidor remoto no puede ser concurrente (en escritura al menos).
- 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).
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:
|
---|---|
-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).