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.