¿Cómo limito a un usuario de SFTP a un solo directorio?
Usa ChrootDirectory de OpenSSH con su servidor SFTP interno en un servidor
que administres. La cuenta restringida ve su directorio asignado como
/, mientras que un subdirectorio independiente conserva permisos de
escritura para las subidas. Esto no permite que la cuenta acceda a una shell ni utilice el reenvío
de conexiones.
El siguiente ejemplo para Linux presupone que ya existe una cuenta dedicada llamada
transloadit, con un grupo principal llamado transloadit
y el directorio de inicio /home/transloadit. Primero, verifica que esta cuenta
pueda iniciar sesión con su clave SSH según tu política de autenticación actual. No uses una cuenta
de administrador. No cambies el directorio de inicio de la cuenta restringida a
/.
Mantén abierta una sesión de administrador mientras cambias la configuración de SSH y asegúrate de tener otra forma de acceder al servidor si se rechaza la nueva configuración.
Prepara los directorios
Crea el directorio raíz restringido, una copia vacía de la ruta del directorio de inicio de la cuenta dentro de él y el directorio de subidas. SSH sigue leyendo las claves autorizadas existentes de la cuenta antes de entrar en el sistema de archivos restringido; no copies claves privadas en él.
sudo install -d -o root -g root -m 755 /srv/sftp/transloadit
sudo install -d -o root -g root -m 755 /srv/sftp/transloadit/home/transloadit
sudo install -d -o transloadit -g transloadit -m 750 /srv/sftp/transloadit/uploads
Cada componente de /srv/sftp/transloadit, incluidos /srv
y /srv/sftp, debe pertenecer a root y no debe permitir la escritura a otros
usuarios o grupos. Solo el subdirectorio uploads pertenece a la cuenta
restringida. No habilites la escritura en el directorio raíz restringido para solucionar un error
de subida.
Restringe la cuenta
En /etc/ssh/sshd_config, reemplaza la línea Subsystem sftp
existente por la siguiente. Mantenla en la sección global, antes de cualquier bloque
Match; no añadas una segunda declaración del subsistema SFTP.
Subsystem sftp internal-sftp
Añade este bloque específico de la cuenta al final de la configuración:
Match User transloadit
ChrootDirectory /srv/sftp/%u
ForceCommand internal-sftp -d /uploads
DisableForwarding yes
PermitTunnel no
PermitTTY no
ForceCommand inicia SFTP en /uploads en lugar de
aceptar comandos de shell. DisableForwarding también bloquea el reenvío SSH,
algo que un comando SFTP forzado por sí solo no impide. Los requisitos de autenticación existentes
de la cuenta siguen vigentes. Adapta el nombre de la cuenta y la ruta de su directorio de inicio si
los tuyos son diferentes, y revisa cualquier regla de coincidencia anterior o archivo de
configuración incluido.
Valida antes de recargar
Comprueba la sintaxis y la configuración efectiva de la cuenta restringida:
sudo sshd -t
sudo sshd -T -C user=transloadit,host=localhost,addr=127.0.0.1
En el segundo comando, usa la dirección y el nombre de host reales del cliente cuando tu
configuración contenga reglas específicas para direcciones o hosts. Confirma que la configuración
efectiva incluya los ajustes previstos para chrootdirectory,
forcecommand, disableforwarding yes, permittunnel no
y permittty no.
DisableForwarding prevalece sobre las opciones de reenvío individuales que pueden
seguir apareciendo habilitadas en esta salida. No recargues una configuración que no supere la
validación. Usa el comando de recarga del servicio SSH indicado en la documentación de tu sistema
operativo y, después, verifica tanto una nueva conexión de administrador como una nueva conexión
SFTP antes de cerrar la sesión original.
Desde tu cliente, conéctate con sftp transloadit@your-server.example y comprueba el directorio:
sftp> pwd
Remote working directory: /uploads
sftp> cd /
sftp> pwd
Remote working directory: /
sftp> cd ..
sftp> pwd
Remote working directory: /
Sube un archivo de prueba inofensivo a /uploads y vuelve a descargarlo.
El intento de crear un archivo directamente en / debe fallar.
Verifica también que se rechacen un comando de shell y el reenvío de puertos. La ruta SFTP
/uploads corresponde a /srv/sftp/transloadit/uploads en el servidor,
no a la ruta /uploads del propio servidor.
Usa la cuenta con /sftp/import o /sftp/store, siguiendo la documentación del Robot sobre autenticación y rutas. Un chroot restringe el acceso al sistema de archivos; no sustituye la autenticación de la cuenta, los permisos del sistema de archivos ni la política de red. Consulta el manual de configuración de OpenSSH para conocer la semántica completa de las directivas, y consulta la documentación de tu distribución para la gestión del servicio.