Acceso SFTP sin Shell o Chroot SFTP en Ubuntu

En Tutoriales y Guías por

Se ha hablado mucho sobre el protocolo FTP últimamente y todo apunta a que está anticuado y que ha dejado de ser seguro, todo esto se ve agravado porque hoy en día disponemos de una alternativa más segura conocida como SFTP (Secure File Transfer Protocol). En este artículo voy a mostrar como configurar nuestro servidor SFTP para que sólo permita el uso de SFTP y no permita usar comandos SSH (Chroot SFTP).

Acceso SFTP sin Shell o Chroot SFTP en Ubuntu

Todas las pruebas han sido realizadas en un servidor VPS de DigitalOcean funcionando con sistema operativo Ubuntu 14.04 x64.

Introducción al acceso SFTP sin Shell en Ubuntu

Lo primero que tenemos que saber es que el protocolo SFTP es más seguro porque la autentificación se hace a través de SSH, por lo que SFTP se considera como una extensión del protocolo SSH especialmente diseñado para transferir y administrar archivos.

El problema que nos encontramos con la configuración por defecto en Ubuntu, es que un usuario que necesita acceso a través de SFTP, también tiene que tener acceso a través de SSH pudiendo ejecutar toda clase de comandos que pueden comprometer nuestro servidor.

Lo que vamos a aprender en este artículo es como permitir a un usuario acceso a través de SFTP pero sin permitirle acceso SSH. Además vamos a “enjaular” al usuario en su carpeta home para que no pueda acceder libremente al resto de archivos del servidor ya que podría comprometer la seguridad del mismo. Esto es lo que se conoce como hacer Chroot a los usuarios SFTP, es decir, limitar sus permisos para que sólo pueda acceder a archivos/carpetas de su carpeta home.

Configurar el servidor SFTP para limitar el acceso SSH (restringir acceso a la terminal)

En este apartado podría mostrar varias configuraciones según necesidades de organización de los usuarios, yo voy a mostrar una configuración muy simple que os permita entender el proceso, para que después podáis ajustarlo a vuestras necesidades.

En primer lugar vamos a crear un usuario de nombre “sftptest“ al que le daremos acceso SFTP, para esto ejecutamos el comando:
adduser sftptest

A continuación le quitamos los permisos al usuario para acceder a la shell/terminal con el siguiente comando:
chsh -s /bin/false sftptest

Ahora el usuario no podrá acceder por SSH ni ejecutar comandos en la terminal.

El siguiente paso será crear un grupo de usuarios de nombre “sftpusers” al que restringiremos su acceso para que pueda usar solamente SFTP:
addgroup sftpusers

Ahora agregamos a este grupo el usuario que creamos antes:
gpasswd -a sftptest sftpusers

Seguidamente modificamos el archivo /etc/ssh/sshd_config, yo empleo el editor nano de la terminal.

Lo primero es buscar la línea:
Subsystem sftp /usr/lib/openssh/sftp-server

La dejamos comentada (agregando el carácter # al inicio de la línea) y agregamos justo debajo la siguiente línea de forma que el resultado es el siguiente:
#Subsystem sftp /usr/lib/openssh/sftp-server
Subsystem sftp internal-sftp

Al final del archivo (muy importante que sea al final o no funcionará) agregamos las siguientes líneas:

Match Group sftpusers
        ChrootDirectory /home
        ForceCommand internal-sftp
        AllowTCPForwarding no
        X11Forwarding no

Por último reiniciamos el servicio SSH con el comando:
service ssh restart

Ahora todos los usuarios que accedan por SFTP quedarán encerrados en la carpeta /home. Es muy importante que esta carpeta tenga como dueño al usuario root o no funcionará. Dicho de otra forma, la carpeta dónde hacemos el Chroot tiene que tener como dueño al usuario root. La carpeta /home en Ubuntu por defecto tiene como dueño al usuario root, por lo que no necesitamos modificar nada, pero que sepáis que el comando para cambiar de dueño a una carpeta sería algo como lo siguiente:
chown root:root /carpeta/usuario/sftp/archivos

Si tenéis varios usuarios y queréis que no puedan acceder unos a las carpetas de otros, deberéis cambiar los permisos de su carpeta home con el siguiente comando:
chmod 700 /home/usuario

En nuestro ejemplo el comando sería:
chmod 700 /home/sftptest

Debéis saber que esta estructura de directorios/premisos a pesar de que no permite el acceso a la carpeta home de un usuario por parte de otros usuarios, sí que permite listar todos los usuarios con acceso SFTP. Si necesitáis una configuración más restrictiva quizás tengáis que echar mano de la directiva Match User usuario y ChrootDirectory %h en la configuración del archivo /etc/ssh/sshd_config (este artículo es básico por lo que no voy a entrar a explicar esta configuración avanzada, quizás más adelante).

Por último dejaros el apunte de que para acceder a través de SFTP podéis emplear FileZilla poniendo en el campo Servidor sftp:// seguido por la ip de vuestro servidor, por ejemplo sftp://128.50.50.50.

Espero que os haya sido de utilidad el artículo y cualquier duda no dudéis en emplear los comentarios.