Secure Shell Filesystem (SSHFS): montar un sistema de ficheros remoto de forma segura en Linux

Con la mosca detrás de la oreja porque NFS nunca me resultó la panacea en cuanto a seguridad… me puse a revisar las distintas formas que tenemos de montar un sistema de ficheros de forma segura en Linux y realicé algunas pruebas con SSHFS, un sistema de ficheros basado en FUSE (Filesystem in Userspace, Sistema de Archivos en Espacio de Usuario). Dos cosas me resultan interesantes: su facilidad de uso (salvo alguno de sintaxis raruna que ya veréis, el concepto de uso es bastante sencillo) y su versatilidad de opciones de montaje.

Escenario inicial

En este escenario contaremos con dos servidores:

  • Máquina local 192.168.2.149 en la que montaremos el sistema de ficheros sshfs.
  • Servidor remoto 192.168.2.148 al que nos conectaremos con sshfs.

Instalación de SSHFS

Si no tenemos el software necesario instalado, procederemos a ello. En el caso de Red Hat o derivados:

yum install sshfs

Y para Debian o derivadas:

aptitude install sshfs

Requisito previo: configurar SSH para funcionar sin contraseña

No es capricho. Si para cada prueba con SSH vas a tener que introducir contraseña, puedes acabar harto. Así que manos a la obra. Generamos el par de claves pública/privada en nuestro servidor local (192.168.2.149) para nuestro usuario (me encuentro logueado como “jota”):

ssh-keygen

Y copiamos nuestra clave pública al servidor remoto al que vamos a conectar (192.168.2.148):

ssh-copy-id 192.168.2.148 

Probamos a conectarnos por ssh y no debería pedir contraseña:

ssh 192.168.2.148

Distintas opciones de montaje para SSHFS

Una vez disponemos del software necesario instalado, podemos proceder a explorar las distintas opciones de montado, que en resumen son:

  • Montaje manual
  • Montaje semiautomático
  • Montaje con automount
  • Montaje en fstab

Montaje manual

Creamos un punto de montaje:

mkdir /home/jota/sshfsdir

Hacemos que nuestro usuario pase a formar parte del grupo “fuse”. En mi caso el usuario es “jota”:

usermod -G fuse jota

Y finalmente conectamos con el servidor remoto (el directorio remoto al que accedemos es /data/sshfs):

sshfs jota@192.168.2.148:/data/sshfs /home/jota/sshfsdir/

Podemos acceder al directorio montado con:

cd /home/jota/sshfsdir/

Y comprobar que está montado con:

df -h

Para desmontarlo:

fusermount -u /home/jota/sshfsdir

Montaje semiautomático

Básicamente se basa en crear una serie de scripts para que cada vez que hagamos login con un usuario, se monte automáticamente SSHFS. Para ello, en el ~/.bash_profile de nuestro usuario añadiremos el comando anterior de montado:

sshfs jota@192.168.2.148:/data/sshfs /home/jota/sshfsdir/

Y así cuando hagamos login, se ejecutará lo anterior y tendremos nuestro sistema de ficheros de montado.

¡Pero hay que desmontarlo al hacer logout! Para ello, en ~/.bash_logout añadimos:

fusermount -u /home/jota/sshfsdir

Montaje automático (automounter autofs)

Desde mi punto de vista la opción más eficiente, ya que los sistemas de ficheros únicamente se montarán cuando hagamos uso de ellos y luego se desmontarán automáticamente.
Además, no tendremos los típicos problemas de los montados estáticos en /etc/fstab de sistemas de ficheros remotos (en el caso de que el servidor remoto no esté disponible, por ejemplo).

Y atentos porque este método es muy efectivo pero también puede traernos de cabeza: el pseudosistema de ficheros autofs se monta como root, lo que implica que para que el login por ssh sea sin contraseña, es necesaria la clave pública de root, no basta únicamente con la de nuestro usuario. Hacemos login como root e introducimos:

ssh-copy-id -i /root/.ssh/id_rsa.pub jota@192.168.2.148

Y ahora procedemos a configurar el automounter. En /etc/auto.master introducimos:

/mnt/sshfs /etc/auto.sshfs uid=1000,gid=1000,--timeout=30,--ghost,--debug

En /etc/auto.sshfs:

jota -fstype=fuse,rw,nodev,nonempty,noatime,allow_other,max_read=65536 :sshfs\#jota@192.168.2.148\:/data/sshfs

Si accedemos al directorio de montado, el sistema de ficheros se monta automáticamente de forma transparente para el usuario:

cd /mnt/sshfs/jota

Podemos comprobar el sistema montado con:

df -h

A modo de ejemplo, lo que yo tengo:

jota@debian7stable:/mnt/sshfs/jota$ df -h
Filesystem                      Size  Used Avail Use% Mounted on
rootfs                           19G  4.5G   13G  26% /
udev                             10M     0   10M   0% /dev
tmpfs                           202M  644K  201M   1% /run
/dev/mapper/vgprincipal-lvroot   19G  4.5G   13G  26% /
tmpfs                           5.0M     0  5.0M   0% /run/lock
tmpfs                           403M  220K  403M   1% /run/shm
/dev/sda1                       276M   28M  235M  11% /boot
/dev/mapper/vgprincipal-lvhome   19G  230M   18G   2% /home
jota@192.168.2.148:/data/sshfs   14G  5.7G  7.3G  44% /mnt/sshfs/jota

Si salimos del directorio de montaje y esperamos 30 segundos, el sistema de ficheros se desmontará automáticamente hasta que volvamos a entrar de nuevo en el directorio (recordad el parámetro –timeout=30 que introdujimos en /etc/auto.master).

Montaje en el inicio /etc/fstab

La forma ortodoxa de hacerlo es añadir a piñón el sistema de ficheros en /etc/fstab:

sshfs#jota@192.168.2.148:/data/sshfs /home/jota/sshfsdir/ fuse auto,defaults,idmap=user,delay_connect,allow_other 0 0

Podemos montar todo lo que figura en fstab con:

mount -a

O bien, recomendado hacerlo para ver si realmente todo funciona como debiera, reiniciamos:

reboot