Intro

Como administradores de sistemas, siempre hemos de procurar que el acceso a los servidores se restrinja a lo estrictamente necesario. Quien quita la ocasión quita el peligro o Más vale un ‘por si acaso’ que un ‘quien pensara’ que con muy buen criterio decía mi abuela.

Por ese motivo, cuando tenemos que dar acceso al sistema de ficheros a usuarios externos para que actualicen una web por ejemplo, lo ideal para minimizar los riesgos es:

  • Usar sftp en lugar de ftp
  • Hacer chroot al directorio de usuario para todos los usuarios que acedan mediante sftp
  • Denegar el acceso por ssh

Usar sftp en lugar de ftp

El protocolo de intercambio de ficheros ftp es un dinosaurio vivo de los inicios de internet. Se trata de un protocolo rápido y sencillo de intercambiar ficheros con un servidor. Sin embargo, la parte negativa es que en el momento del establecimiento de la conexión el nombre de usuario y la contraseña viajan sin encriptar y pueden ser interceptadas por los «malos».

La evolución de este protocolo ha llevado a la creación del equivalente con encriptación de la comunicación, conocido como sftp. A los efectos de este tutorial creo que esta información es suficiente, aunque para los curiosos una búsqueda en google de este protocolo les proporcionará muchos más detalles.

Para poder instalar sftp en nuestro servidor hemos de instalar un servidor que lo soporte. El más popular en nuestros días es vsftp. Si estamos en debian o en una distribución derivada del mismo haremos:

apt-get install vsftpd

chroot a los usuarios de sftp

Con usar fstp nos aseguramos que el usuario no revela sus credenciales. Pero como somos muy desconfiados no queremos dejarle husmear por nuestro sistema, de modo que queremos que tenga acceso únicamente a su directorio de usuario, lo que viene en llamarse hacer chroot.

Para eso hemos de realizar los siguientes cambios en el archivo de configuración de vsftp (/etc/vsftpd.conf)

# Queremos que el sistema funcione como un daemon independiente
listen=YES 
# en nuestro caso no queremos que escuche IPv6
listen_ipv6=NO
# tampoco queremos que un usuario anonimo se pueda conectar
anonymous_enable=NO
# queremos permitir a los usuarios del sistema que se conecten mediante este servicio
local_enable=YES
# para permitir cualqueir tipo de escritura hemos de configurar lo siguiente a YES:
write_enable=YES
# aqui es donde le decimos al sistema que ha de hacer chroot
chroot_local_user=YES
chroot_list_enable=YES
# (default follows)
chroot_list_file=/etc/vsftpd.chroot_list
# para garantizar la conexion a traves de ssl (hemos de proporcionar key y pem files)
ssl_enable=YES


En el archivo /etc/vsftpd.chroot_list indicamos los usuarios que harán chroot al conectarse (uno por línea). En nuestro caso el contenido del archivo es:

usuario1
usuario2

Denegar el acceso por ssh

Lo siguiente es impedir que los usuarios que se conecten por sftp tengan acceso por ssh. Para ello, los añadimos al grupo sftponly y hacemos unas modificaciones en el archivo de configuración del servidor ssh.

Para añadirlos al grupo sftponly (ejemplo para el usuario usuario1):

sudo usermod -a -G sftponly usuario1

Cambios en el archivo de configuración /etc/ssh/sshd_config

Comentamos la linea

Subsystem sftp /usr/lib/openssh/sftp-server

Añdimos lo siguiente:

Subsystem sftp internal-sftp
Match group sftponly
     ChrootDirectory /home/%u
     X11Forwarding no
     AllowTcpForwarding no
     ForceCommand internal-sftp

Una vez hechos estos cambios reiniciamos el servidor:

systemctl restart sshd

Permisos del directorio de usuario

Para evitar que el sistema se queje y no nos deje entrar, los directorios de usuarios dftponly tienen que tener como owner a root y como group al usuario. Por ejemplo, para el directorio del usuario1 tendríamos que hacer:

chown -R root:usuario1 /home/usuario1

Los permisos del directorio de usuario deberían ser 0755

Con estos sencillos pasos ya hemos conseguido limitar el acceso de ciertos usuarios de nuestro sistema a sftp y evitar que se salgan de su directorio de usuario.