SFTP con jaula chroot

Este es un tema que siempre me ha costado trabajo configurar, básicamente por problemas de permisos de directorios y usuarios. Luego de muchos intentos y horas de investigación lo más cercano era que los usuarios ingresaran a un directorio común desde donde podían escribir en sus directorios, pero podían ver todo el contenido de los otros usuarios.

Ante el problema anterior finalmente di con la manera de configurar una jaula chroot que contiene los archivos de un sitio web, para usuarios SFTP. El dilema a resolver es el siguiente: tenemos una instalación de nginx con varios sitios web. Crearemos un usuario sin acceso a shell que se pueda conectar vía SFTP para editar el mismo directorio desde donde se sirven los archivos.

Crear un grupo para los usuarios SFTP

Como nginx trabaja por defecto con el grupo www-data, usaremos este mismo. Opcionalmente si queremos crear un grupo exclusivo para estos menesteres.

1
$ sudo groupadd solosftp

Pero debemos ajustar la configuración de nginx para que utilice este nuevo grupo.

Añadir usuarios al grupo SFTP

Lo siguiente es crear y añadir el usuario que vamos a utilizar al grupo www-data o el que hemos creado en el paso previo. Antes de esto, el árbol de directorio que uso para guardar los sitios web es el siguiente: /var/www/sitio.web/public_html.

1
$ sudo useradd -g www-data -s /bin/false -m -d /var/www/sitio.web usuariosftp
  • -g www-data añade al grupo www-data el usuario que estamos creando.
  • -s /bin/false elimina el acceso vía shell, el usuario no podrá conectarse vía SSH.
  • -m -d /var/www/sitio.web crea el directorio del usuario

En mi caso prefiero utilizar llaves ssh para los usuarios regulares del servidor y contraseñas de texto a los usuarios SFTP.

1
$ sudo passwd usuariosftp

Lo siguiente es el paso más crítico, que corresponde a los permisos. Anteriormente los asignaba de manera incorrecta en el árbol de directorios. Con un error aquí puedes evitar que el usuario no ingrese o que el servidor rechace la conexión. El directorio home del usuario debe pertenecer al usuario root y tener permisos 755.

1
2
$ sudo chown root: /var/www/sitio.web
$ sudo chmod 755 /var/www/sitio.web

Ahora podemos crear los directorios que usaremos dentro de la carpeta, asignar los permisos y la propiedad y grupo que necesitamos.

1
2
3
$ sudo mkdir /var/www/sitio.web/{public_html,uploads}
$ sudo chmod 755 /var/www/sitio.web/{public_html,uploads}
$ sudo chown usuariosftp:www-data /var/www/sitio.web/{public_html,uploads}

Con esto hay que tener en cuenta que al crear el archivo de configuración del sitio web de nginx, la raíz apunte al directorio que hemos creado public_html.

Configurando SSH

Ahora editaremos el archivo de configuración de SSH /etc/ssh/sshd_config, editando la línea Subsystem sftp y añadiendo el bloque Match Group

1
2
3
4
5
6
7
Subsystem sftp internal-sftp

Match Group www-data
  ChrootDirectory %h
  ForceCommand internal-sftp
  AllowTcpForwarding no
  X11Forwarding no

Una vez hecho estos cambios reiniciamos el servidor SSH.

1
$ sudo systemctl restart ssh

Probando

Ahora que hemos terminado de configurar la jaula chroot podemos probar la conexión. En el mismo servidor podemos hacerlo como se detalla o bien si nos conectamos remotamente, reemplazamos localhost por la ip del servidor.

1
$ sftp usuariosftp@localhost

Una vez inicie el proceso, el servidor nos preguntara la contraseña de la cuenta sftp y luego podremos utilizar los comandos pwd y ls para verificar el directorio de trabajo y listar los archivos y directorios.

1
2
3
4
5
6
7
usuariosftp@localhost's password:
Connected to usuariosftp@localhost.
sftp> pwd
Remote working directory: /
sftp> ls
public_html  upload
sftp>

Y hasta aquí termina esta guía que espero sea de ayuda para quienquiera se aventure a hacer esto. El resultado, varios sitios web en un solo servidor con nginx y a los cuales cada uno se puede acceder vía sftp de manera exclusiva sin que el usuario vea el contenido de otros usuarios.


Moisés Serrano Samudio Médico de atención primaria, fotógrafo aficionado, apasionado de las tecnologías relacionadas con el EdTech y el eHealth y diseñador/desarrollador de sitios web de salud. Médico, apasionado del EdTech/eHealth y diseñador/desarrollador de sitios web de salud.
Moisés Serrano Samudio

@linkmoises

Médico de atención primaria, fotógrafo aficionado, apasionado de las tecnologías relacionadas con el EdTech y el eHealth.

Entradas relacionadas

  1. Aún no hay comentarios...

Deja una respuesta

Su email no será publicado. Required fields are marked *