-
Compartir una carpeta con SSHFS
Cuando necesitamos compartir archivos entre equipos Linux, lo habitual suele ser pensar en Samba o en NFS. Sin embargo, existe una alternativa extremadamente sencilla, segura y eficiente llamada SSHFS que, en muchos escenarios, puede ser incluso más conveniente.
SSHFS (SSH Filesystem) permite montar directorios remotos a través del protocolo SSH utilizando FUSE (Filesystem in Userspace). Gracias a ello, cualquier carpeta de un servidor puede aparecer en un cliente como si fuese un directorio local, utilizando la misma autenticación, cifrado y seguridad que ya proporciona SSH.
Una de las principales ventajas de SSHFS es que no requiere abrir puertos adicionales ni desplegar servicios específicos para compartir archivos. Si ya disponemos de un servidor SSH funcionando, prácticamente ya tenemos todo lo necesario para empezar a compartir carpetas. Además, todo el tráfico viaja cifrado de extremo a extremo, incluyendo nombres de archivos, contenido y credenciales de acceso.
Comparado con Samba, SSHFS resulta mucho más sencillo de configurar en entornos Linux. Samba está pensado principalmente para compartir recursos entre sistemas Linux y Windows utilizando el protocolo SMB/CIFS. Aunque es una solución muy potente, requiere una configuración más extensa y el mantenimiento de un servicio adicional.
Comparado con NFS, SSHFS aporta una capa adicional de seguridad gracias al cifrado. NFS suele ofrecer un rendimiento superior en redes locales, pero tradicionalmente confía en la red interna y en la identificación mediante UID y GID, mientras que SSHFS utiliza autenticación por usuario y contraseña o claves SSH.
Por tanto, para redes domésticas o pequeñas infraestructuras Linux donde la simplicidad y la seguridad sean prioritarias, SSHFS suele ser una excelente elección.
Preparación del servidor
En el servidor donde se compartirá la carpeta debemos instalar OpenSSH Server, ejecutando como root:
apt-get -y update apt-get -y install openssh-server
Comprobaremos que el servicio está activo:
systemctl enable ssh systemctl start ssh systemctl status ssh
A continuación crearemos la carpeta que deseamos compartir. Imaginemos que queremos compartir código para desarrolladores:
mkdir /SourceCode
Crearemos un grupo para los desarrolladores:
groupadd developers
Crearemos los usuarios que tendrán acceso:
useradd -m -G developers developer1 useradd -m -G developers developer2
Asignaremos una contraseña a cada usuario:
passwd developer1 passwd developer2
Asignaremos los permisos adecuados a la carpeta compartida:
chown root:developers /SourceCode chmod 2775 /SourceCode
El bit especial 2 del modo 2775 activa el mecanismo setgid, permitiendo que todos los archivos y directorios creados dentro de /SourceCode hereden automáticamente el grupo developers.
Finalmente comprobaremos que podemos conectarnos por SSH:
ssh developer1@IP_DEL_SERVIDOR
Preparación del cliente
En el equipo cliente instalaremos SSHFS, ejecutando como root:
apt-get -y update apt-get -y install sshfs
Crearemos el punto de montaje, ejecutando como root:
mkdir /home/developer1/SourceCode chown 1000:1000 /home/developer1/SourceCode chmod 700 /home/developer1/SourceCode
Los permisos anteriores permiten que únicamente el usuario con UID 1000 tenga acceso al directorio donde se realizará el montaje.
Montar la carpeta remota
Una vez preparado el cliente podremos montar la carpeta compartida ejecutando:
sshfs developer1@IP_DEL_SERVIDOR:/SourceCode /home/developer1/SourceCode
Se solicitará la contraseña del usuario remoto y, tras autenticar correctamente, el contenido de la carpeta aparecerá disponible localmente en /home/developer1/SourceCode.
Eso sí, hay que tener en cuenta de que de esa forma, al usar FUSE, otros usuarios del sistema no verán el punto de montaje, y puede que nos interese que el root también pueda verlo. Para eso, deberemos permitir al root ver el punto de montaje. Lo hacemos primero descomentando la línea:
#user_allow_other
…del archivo /etc/fuse.conf y luego montando con este parámetro/flag:
sshfs developer1@IP_DEL_SERVIDOR:/SourceCode /home/developer1/SourceCode -o allow_root
También podemos hacer que el punto de montaje siga enlaces simbólicos de forma que, si creamos enlaces simbólicos fuera de la carpeta del punto de montaje, que apunten a archivos de dentro del punto de montaje, esos enlaces sean operativos. Lo hacemos con:
sshfs developer1@IP_DEL_SERVIDOR:/SourceCode /home/developer1/SourceCode -o allow_root,follow_symlinks
Podremos verificar el montaje con:
mount | grep SourceCode
O también:
df -h /SourceCode
Desmontar la carpeta
Cuando ya no necesitemos acceder al recurso remoto podremos desmontarlo con:
fusermount3 -u /home/developer1/SourceCode
Alternativamente:
umount /home/developer1/SourceCode
Montaje automático al iniciar el sistema
Si deseamos que la carpeta se monte automáticamente durante el arranque, podemos añadir una entrada al archivo /etc/fstab:
developer1@10.8.9.18:/SourceCode /home/developer1/SourceCode fuse.sshfs _netdev,reconnect,ServerAliveInterval=15,ServerAliveCountMax=3 0 0
En este caso resulta recomendable utilizar autenticación mediante claves SSH para evitar que el sistema solicite la contraseña durante cada arranque.
Con esta configuración tendremos una carpeta compartida completamente funcional utilizando únicamente SSH, sin necesidad de desplegar servidores Samba ni NFS, aprovechando una infraestructura que la mayoría de sistemas Linux ya tienen instalada por defecto.
Para macOS
En macOS primero instalamos HomeBrew siguiendo este hack y luego ejecutamos:
brew install --cask sshfs-mac brew uninstall --cask --ignore-dependencies macfuse curl -L https://github.com/macfuse/macfuse/releases/download/macfuse-5.3.2/macfuse-5.3.2.dmg -o /tmp/macfuse-5.3.2.dmg hdiutil attach /tmp/macfuse-5.3.2.dmg sudo installer -pkg "/Volumes/macFUSE/Install macFUSE.pkg" -target /
Hay que tener en cuenta que, desde Catalina, la carpeta / de macOS es de sólo lectura, así que no podremos montar nada ahí, salvo que agreguemos previamente la carpeta a synthetic.conf. Lo hacemos con:
sudo install -d -o "$USER" -g staff /System/Volumes/Data/Git echo $'Git\tSystem/Volumes/Data/Git' | sudo tee -a /etc/synthetic.conf
Esas órdenes hacen lo siguiente:
- Crear el directorio real y escribible: /System/Volumes/Data/Git
- Crear en synthetic.conf un enlace sintético: /Git → /System/Volumes/Data/Git
Esto lo tenemos que hacer así, porque, si indicamos a synthetic.conf que cree directamente la carpeta /Git, la carpeta aparecerá después del reinicio, pero seguirá siendo de sólo lectura. Por eso, lo mejor es que /Git no sea un directorio sintético, sino un enlace sintético hacia un directorio escribible.
Luego, para montar, hacemos:
mkdir /Git/CarpetaDondeMontar/ sshfs usuario@IPDelServidor:/Git /Git/CarpetaDondeMontar/ -o allow_root,reconnect,ServerAliveInterval=15,ServerAliveCountMax=3,volname=NombreDeLaCarpetaDondeMontar
Seguramente, la primera vez que intentemos hacer el montaje en mac, nos salga un mensaje de advertencia del sistema diciéndonos que deberemos activar la extensión macFUSE, de Benjamin Fleischer. Lo hacemos y reiniciamos el sistema.
Hay que tener en cuenta que, a diferencia de Debian, en macOS, el proceso de montaje quedará ligado a la terminal. Aunque esa terminal nos haya devuelto el prompt del sistema nuevamente, si cerramos esa terminal, el montaje se perderá.
Para desmontar, hacemos:
sudo umount /System/Volumes/Data/Git/NombreDeLaCarpeta