//ESTA ENTRADA HA SIDO EDITADA CON CAMBIOS IMPORTANTES DE CONFIGURACION 12 HORAS DESPUES DE SU PUBLICACION.
Hoy vamos a ver como instalar y configurar nuestro propio servidor FTP en Ubuntu 20.04, aunque si es verdad que el protocolo FTP ha perdido terreno (al menos ya no se usa como antes) aún podemos encontrarnos con servicios que lo necesitan, uno de estos puede ser el de un servidor Web donde FTP cumple una función primordial al agilizar la subida de archivos de nuestro sitio etc directamente en nuestro directorio raíz para que luego sean leidos ya sea por Apache o Nginx.
En la siguiente entrada veremos las configuraciones necesarias, crearemos un usuario de prueba con el directorio por defecto y crearemos además otro usuario con un directorio personalizado que apuntará por ejemplo a nuestro directorio web, además también daremos acceso a usuarios anónimos y utilizaremos SSL con un certificado autofirmado para el ejemplo.
Lo primero es lo primero, actualizar nuestro sistema:
sudo apt update
sudo apt upgrade
Ahora estamos listos para instalar el paquete vsftpd que instalará nuestro servidor FTP:
sudo apt install vsftpd
Vamos a editar algunas líneas del archivo de configuración:
sudo nano /etc/vsftpd.conf
Las lineas a editar, descomentar o agregar son:
anonymous_enable=NO
local_enable=YES
write_enable=YES
ftpd_banner=Bienvenido a nuestro servicio FTP.
chroot_local_user=YES
allow_writeable_chroot=YES
pasv_min_port=30000
pasv_max_port=31000
Presta especial atención a las líneas que debes descomentar, editar y/o agregar //Podrá encontrar una mejor referencia en el video en nuestro canal.
Lo siguiente es generar un certificado para nuestro servidor FTP de la siguiente forma:
sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem
Nos pedirá algunos datos los cuales llenamos sin mayor problema ni tienen que ser reales (se trata de un certificado autofirmado)
Es hora de editar nuevamente nuestro archivo de configuración para agregar lo referente al uso de SSL:
sudo nano /etc/vsftpd.conf
Buscamos las siguientes tres líneas:
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
ssl_enable=NO
Y las sustituimos por estas tres:
rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem
ssl_enable=YES
Realiza el paso anterior como estes acostumbrado, puedes comentar las líneas originales y agregar las nuevas o simplemente editarlas.
Es hora de tocar nuestro firewall con el fin de permitir el acceso a nuestro servidor FTP
El servidor VSFTPD utiliza por defecto en modo Activo los puertos 20 y 21 en TCP, en este tutorial vamos a usar las dos opciones Activo y Pasivo y esto probablemente lo explique mejor en el video, o no xD.
Para el modo Pasivo es necesario declarar un Pool de puertos que por supuesto no puede contener ningún puerto que pueda estar comprometido por otro servicio al menos en TCP, para este caso escogemos del 30000 al 31000, el porque de un rango tan grande depende de ustedes y el servicio que pretenden brindar. Si no va a usar estos puertos revise más arriba el archivo de configuración y edite los parámetros: pasv_min_port=30000 y pasv_max_port=31000.
Dicho lo anterior configuramos nuestro firewall.
sudo ufw allow 20:21/tcp
sudo ufw allow 30000:31000/tcp
Y estamos listos para reiniciar nuestro servidor FTP para cargar todas las nuevas configuraciones:
sudo systemctl restart vsftpd
Lo siguiente es comenzar a agregar usuarios que puedan conectarse a nuestro servidor FTP, asi que vamos a agregar nuestro primer usuario con su directorio por defecto:
sudo useradd usuario
Por supuesto, sustituimos usuario, por el nombre de usuario que queremos para este.
Vamos a definir una contraseña para este usuario, contraseña que por supuesto será la de acceder al servidor FTP:
sudo passwd usuario
Un paso más de seguridad es evitar que estos usuarios inicien sesión en la terminal o incluso hagan login si tienes una GUI instalada (no lo hagas por favor) xD. Para evitar esto debemos cambiar el valor de la shell para cada usuario.
Primero vamos a configurar un nuevo valor para la shell:
Creamos el archivo ftponly:
sudo nano /bin/ftponly
Y dentro del mismo ponemos:
#!/bin/sh
echo \"Esta cuenta solo tiene acceso FTP.\"
Guardamos los cambios y salimos.
Damos permiso de ejecución:
sudo chmod a+x /bin/ftponly
Y agregamos la nueva shell:
sudo nano /etc/shells
Agregar al final:
/bin/ftponly
Asignamos esta shell al usuario agregado:
sudo usermod usuario -s /bin/ftponly
Ahora usuario solo podrá iniciar sesión en el servidor FTP.
Aún no terminamos, es necesario acomodar el directorio home del usuario creado para una configuración correcta de su carpeta de ftp, asi que vamos a crear el directorio y asignar permisos:
sudo mkdir -p /home/usuario/ftp/files
sudo chmod 550 /home/usuario/ftp
sudo chmod 750 /home/usuario/ftp/files
sudo chown -R usuario: /home/usuario/ftp
Listo, ya podemos conectarnos a nuestro servidor FTP con nuestro cliente preferido (FileZilla) con el usuario usuario y su respectiva contraseña, el directorio mostrado debe ser /home/usuario/ftp y debemos poder acceder a files y dentro crear, editar, renombrar, eliminar archivos y directorios.
Creando un usuario y asignar un directorio personalizado que no este bajo /home/usuario/ftp, por ejemplo /var/www
sudo useradd usuariopersonalizado
sudo passwd usuariopersonalizado
sudo mkdir /directorio/personalizado
sudo chown usuariopersonalizado:usuariopersonalizado -R /directorio/personalizado
sudo chmod 755 -R /directorio/personalizado
sudo usermod -d /directorio/personalizado usuariopersonalizado
sudo usermod usuariopersonalizado -s /bin/ftponly
Habilitar el acceso a usuario anónimo:
Editamos nuevamente el archivo de configuración y descomentamos, editamos o agregamos las siguientes líneas:
sudo nano /etc/vsftpd.conf
anonymous_enable=YES
anon_world_readable_only=YES
anon_root=/directorio
allow_anon_ssl=YES
sudo systemctl restart vsftpd
Hemos establecido que solo tenga privilegios de lectura y solo sobre el directorio /directorio
Debemos dar permisos a /directorio al menos de lectura.