¿Cómo limito un usuario de sFTP a un solo directorio?
OpenSSH (4.8p1 para el port de GNU/Linux) y las versiones posteriores incluyen una opción de configuración: ChrootDirectory.
Esto es posible gracias a un nuevo subsistema SFTP enlazado estáticamente con sshd.
Esto facilita la sustitución de un servicio FTP básico sin la complicación de configurar el cifrado ni tener que lidiar con los modos pasivo y activo de FTP al operar a través de un router NAT. También es más sencillo que usar paquetes como rssh u otros parches, ya que no requiere configurar ni mantener un entorno chroot (por ejemplo, aplicar actualizaciones de seguridad).
Para habilitarlo, obviamente necesitas la nueva versión 4.8p1. Personalmente, uso la versión de cvs y el directorio debian/ del paquete sid para crear un paquete Debian 4.8p1~cvs-1 bien integrado.
En /etc/ssh/sshd_config:
Debes configurar OpenSSH para que use su subsistema SFTP interno.
Subsystem sftp internal-sftp
Después, configuré chroot() mediante una regla de coincidencia.
Match group sftponly
ChrootDirectory /home/%u
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp
El directorio en el que se ejecuta chroot() debe pertenecer a root. Después de la llamada a chroot(), sshd
cambia al directorio de inicio relativo al nuevo directorio raíz. Por eso uso / como
directorio de inicio.
$ chown root.root /home/user
$ usermod -d / user
$ adduser user sftponly
Esto parece funcionar según lo previsto:
$ sftp user@host
Connecting to host...
user@host's password:
sftp> ls
build cowbuildinall incoming johnbuilderclean
sftp> pwd
Remote working directory: /
sftp> cd ..
sftp> ls
build cowbuildinall incoming johnbuilderclean
Incorporamos aquí las instrucciones originales de https://debian-administration.org/article/590/OpenSSH_SFTP_chroot_with_ChrootDirectory porque, en el momento de redactar este artículo, ese sitio web ya no funcionaba.