miércoles, 13 de febrero de 2013

Enjaular usuarios SFTP

Cuando un usuario se conecta a una máquina por sftp, si no le marcamos límites podrá navegar por nuestro árbol de directorios pudiendo provocarnos problemas de seguridad.
Para evitar esto, lo más común es darle al usuario un directorio raíz controlado a partir del cual pueda trabajar (generar ficheros, directorios, ..etc) pero del cual no se pueda salir. Pongo un ejemplo que esclarezca esto.
Si yo genero un usuario que sea usu1 en un sistema Linux (por ejemplo una Debian), podrá desde este momento tener acceso por sftp, ya que el sftp corre sobre protocolo ssh, siempre que el demonio esté levantado. El problema es que este usuario, cuando se conecte, entrará por defecto en su /home/usu1 pero podrá moverse y ver el contenido de otros directorios como el /etc/, ..etc. Lo ideal es que este usuario cuando se conecte por sftp entre en un directorio que sea sftpusu1 por ejemplo y del cual no pueda salir.

Para esto tendremos que tener instalado el ssh y el openssh-server:
root@OPT360: apt-get install ssh openssh-server
Como root generamos el usuario:
root@OPT360: adduser usu1
Le cambiamos la contraseña:
root@OPT360: passwd usu1
Tras esto tendremos un usuario completamente operativo en nuestro sistema Linux. Para probar que tanto la instalación del openssh-server como la generación del usuario a sido correcta realizamos una conexión por ssh al servidor (si estamos en un linux desde consola podemos hacer ssh usu1@10.0.10.41 y si estamos en un windows con el PuTTY).
Ahora que hemos verificado que nuestro usuario está funcionando correctamente, procedemos a editar el fichero sshd_config que alberga la configuración de el servidor de ssh.
root@file-server:~# vi /etc/ssh/sshd_config

Tendremos que verificar que nuestro Subsystem utiliza el internal-sftp, por lo que tendremos que comentar la linea y generar una nueva con el internal-sftp, quedando de la siguiente manera:
#Subsystem sftp /usr/lib/openssh/sftp-server
Subsystem sftp internal-sftp


Además de lo anterior, al final del fichero añadiremos lo siguiente:
Match user usu1
                ChrootDirectory /home/usuariossftp/usu1/
                ForceCommand internal-sftp


El ChrootDirectory es el directorio al que nos llevara cuando entremos con ese usuario.

Para finalizar generaremos la carpeta usu1 en la ruta indicada con un mkdir y le aplicaremos los siguientes permisos:
root@file-server:/home/usuariossftp# ls -ltr
total 8
drwxr-xr-x 3 root root 4096 feb 23  2011 usu1

Y dentro de la anterior carpeta  generaremos otra en la  que si que tenga todos los permisos el usuario usu1 para que pueda trabajar.
root@file-server:/home/usuariossftp/usu1# ls -ltr
total 4
drwxr-xr-x 2 usu1 usu1 4096 feb 13 06:31 carpeta2


Quedando al final la ruta completa de trabajo para el usuario usu1:
/home/usuariossftp/usu1/carpeta2
Tras reiniciar el servicio sshd tendremos disponible esta configuración, y en el momento que el usuario usu1 se conecte, directamente entrará en /home/usuariossftp/usu1/.
Para reiniciar el servicio realizamos como root lo siguiente:
root@file-server:/home/usuariossftp/usu1# /etc/init.d/ssh stop
root@file-server:/home/usuariossftp/usu1# /etc/init.d/ssh start


2 comentarios:

  1. No funciona en absoluto.
    Lo he seguido paso a paso y el usuario no queda enjaulado.

    ResponderEliminar
    Respuestas
    1. Este artículo lo escribí configurando un sftp enjaulado para una empresa y luego he utilizado estos pasos para otros sftp enjaulados y no he tenido problemas.
      Revisa que cuando hagas login por sftp te lleve directamente a la carpeta donde el usuario tiene permisos y que la carpeta superior solo tenga permisos el root.
      Por otro lado revisa que esto esté bien:
      Match user usu1
      ChrootDirectory /home/usuariossftp/usu1/
      ForceCommand internal-sftp

      Si necesitas ayuda dímelo.

      Eliminar