Introducción
FTP, que significa Protocolo de transferencia de archivos, es un protocolo de red que alguna vez se usó ampliamente para mover archivos entre un cliente y un servidor. Desde entonces, ha sido reemplazado por métodos más rápidos, seguros y convenientes para transferir archivos.
FTP todavía se usa cuando lo necesita, sin embargo, vsftpd es una excelente opción. Optimizado para la seguridad, el rendimiento y la estabilidad, vsftpd ofrece una protección eficaz contra muchos problemas de seguridad que se encuentran en otros servidores FTP y es el predeterminado para muchas distribuciones de Linux.
En este tutorial, configuraremos vsftpd en Ubuntu 18.04 LTS para permitir que un usuario cargue archivos en su directorio personal usando FTP con credenciales de inicio de sesión seguras SSL /TLS.
Si su intención es instalar VSFTP en un servidor remoto, siga leyendo; de lo contrario, si desea instalar VSFTP en su computadora local, omita el primer párrafo "Conexión al servidor" y lea el siguiente.
Conexión al servidor
Para acceder al servidor, necesita conocer la dirección IP. También necesitará la contraseña para la autenticación.
Para conectarse al servidor como root, escriba este comando:
ssh root@IP_DEL_SERVER
A continuación, se le pedirá que ingrese la contraseña del usuario root.
Si no usa el usuario root, puede iniciar sesión con otro nombre de usuario usando el mismo comando, luego cambie el primer parámetro:
ssh VOSTRO_UTENTE@IP_DEL_SERVER
Luego se le pedirá que ingrese su contraseña de usuario.
Ahora está conectado a su servidor, está listo para comenzar a instalar VSFTP en Ubuntu 18.04 LTS.
Instalar VSFTP
VSFTP está disponible de forma predeterminada en el repositorio oficial de Ubuntu. Actualice la lista de paquetes:
sudo apt update
Instale VSFTPD:
sudo apt install vsftpd
Una vez finalizada la instalación copiamos el archivo de configuración para que podamos comenzar con una configuración vacía, guardando el original como respaldo:
sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.orig
Configurar el cortafuegos (UFW)
Verifique el estado del firewall para ver si está habilitado. Si es así, asegúrese de que el tráfico FTP esté permitido para que las reglas del firewall no bloqueen las pruebas.
Verifique el estado del firewall:
sudo ufw status
Debería recibir un mensaje de salida similar al siguiente:
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Agregue reglas para el tráfico FTP.
Abra los puertos 20 y 21 para FTP, el puerto 990 para TLS y los puertos 40000 y 50000 para el rango de puertos pasivos que pretendemos establecer en el archivo de configuración:
sudo ufw allow 20/tcp
sudo ufw allow 21/tcp
sudo ufw allow 990/tcp
sudo ufw allow 40000:50000/tcp
sudo ufw status
Verifique el firewall nuevamente para ver los nuevos puertos abiertos: Debería recibir un mensaje de salida similar al siguiente:
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
990/tcp ALLOW Anywhere
20/tcp ALLOW Anywhere
21/tcp ALLOW Anywhere
40000:50000/tcp ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
20/tcp (v6) ALLOW Anywhere (v6)
21/tcp (v6) ALLOW Anywhere (v6)
990/tcp (v6) ALLOW Anywhere (v6)
40000:50000/tcp (v6) ALLOW Anywhere (v6)
Configurar el directorio para un usuario
Cree un usuario de FTP dedicado, es posible que ya tenga un usuario que necesite acceso a FTP. Todavía recomendamos crear un nuevo usuario hasta que haya configurado y probado esta configuración.
Crea un nuevo usuario:
sudo adduser grok
Asigne una contraseña cuando se le solicite.
FTP es generalmente más seguro cuando los usuarios están limitados a un directorio específico. VSFTPD restringe a un usuario con prisiones chroot. Cuando chroot está habilitado, los usuarios locales están limitados por defecto a su directorio de inicio.
Cree un directorio ftp para que sirva como chroot:
sudo mkdir /home/grok/ftp
Establezca el propietario de la carpeta:
sudo chown nobody:nogroup /home/grok/ftp
Quite los permisos de escritura:
sudo chmod aw /home/grok/ftp
Verificar permisos:
sudo ls -la /home/grok/ftp
Debería recibir un mensaje de salida similar al siguiente:
total 8
dr-xr-xr-x 2 nobody nogroup 4096 Apr 18 20:44.
drwxr-xr-x 3 grok grok 4096 Apr 18 21:09..
Cree una carpeta para cargar los archivos:
sudo mkdir /home/grok/ftp/files
Establezca el propietario de la nueva carpeta:
sudo chown grok:grok /home/grok/ftp/files
Verificar permisos:
sudo ls -la /home/grok/ftp
Debería recibir un mensaje de salida similar al siguiente:
total 12
dr-xr-xr-x 3 nobody nogroup 4096 Apr 18 20:44.
drwxr-xr-x 5 grok grok 4096 Apr 18 21:09..
drwxr-xr-x 2 grok grok 4096 Apr 18 21:08 files
Crea un archivo de prueba:
echo "vsftpd file di test" | sudo tee /home/grok/ftp/files/test.txt
Configurar el acceso FTP
Permita que un solo usuario con una cuenta de shell local se conecte con FTP. Verifique las dos configuraciones clave que ya deberían estar configuradas por defecto en el archivo de configuración vsftpd.conf.
Abra el archivo de configuración de vsftpd:
sudo nano /etc/vsftpd.conf
...
# Allow anonymous FTP? (Disabled by default).
anonymous_enable=NO
#
# Uncomment this to allow local users to log in.
local_enable=YES...
A continuación, permita que el usuario pueda cargar archivos descomentando (si está comentado) del parámetro write_enable:
...
write_enable=YES...
También descomente chroot_local_user para evitar que el usuario que inició sesión a través de FTP acceda a cualquier archivo o comando fuera de la estructura del directorio:
...
chroot_local_user=YES...
Agregue los siguientes parámetros para que nuestra configuración funcione para este usuario y para cualquier usuario adicional futuro. Agregue estas configuraciones al final del archivo:
...
user_sub_token=$USER
local_root=/home/$USER/ftp
También limite la cantidad de puertos que se pueden usar para FTP pasivo para asegurarse de que haya suficientes conexiones disponibles:
...
pasv_min_port=40000
pasv_max_port=50000
ATENCIÓN: Mientras configuramos el firewall, abrimos los puertos que configuramos aquí para el rango de puertos pasivos. Si cambia los valores, asegúrese de actualizar la configuración del firewall.
Para permitir el acceso FTP caso por caso, establecemos la configuración para que los usuarios solo tengan acceso cuando se agregan explícitamente a una lista:
...
userlist_enable=YES
userlist_file=/etc/vsftpd.userlist
userlist_deny=NO
userlist_deny Cuando se establece en YES, a los usuarios de la lista se les niega el acceso FTP. Cuando se establece en NO, solo los usuarios de la lista pueden iniciar sesión.
Guarde y cierre el archivo. Para guardar el archivo con el editor de texto nano, presione Ctrl + O, luego presione Enter para confirmar el nombre del archivo a escribir. Para cerrar el archivo, presione Ctrl + X.)
Finalmente, agreguemos nuestro usuario a /etc/vsftpd.userlist:
echo "grok" | sudo tee -a /etc/vsftpd.userlist
Verifique que se agregó correctamente:
cat /etc/vsftpd.userlist
Debería recibir un mensaje de salida similar al siguiente:
...
grok
Reinicie el demonio vsftpd para cargar los cambios de configuración:
sudo systemctl restart vsftpd
Prueba de acceso FTP
Hemos configurado el servidor para permitir que solo el usuario de grok se conecte a través de FTP. Asegúrese de que funcione como se esperaba.
Los usuarios anónimos no necesitan iniciar sesión, hemos deshabilitado el acceso anónimo. A los usuarios anónimos se les debe negar el permiso. Abra otra ventana de terminal y ejecute el siguiente comando. Asegúrese de reemplazar 103.1.233.1 con la dirección IP pública de su servidor:
ftp -p 103.1.233.1
Debería recibir un mensaje de salida similar al siguiente:
Connected to 103.1.233.1.
220 (vsFTPd 3.0.3)
Name (103.1.233.1:root): anonymous
530 Non-anonymous sessions must use encryption.
Login failed.
421 Service not available, remote server has closed connection
ftp>
Cierre la sesión, escriba:
bye
Si intenta iniciar sesión con otro usuario con privilegios de sudo en su lugar:
ftp -p 103.1.233.1
Debería recibir un mensaje de salida similar al siguiente:
Connected to 103.1.233.1.
220 (vsFTPd 3.0.3)
Name (103.1.233.1:default): sudo_user
530 Permission denied.
ftp: Login failed.
ftp>
Cierre la sesión, escriba:
bye
El usuario grok, por otro lado, debería poder conectar, leer y escribir archivos:
ftp -p 103.1.233.1
Debería recibir un mensaje de salida similar al siguiente:
Connected to 103.1.233.1.
220 (vsFTPd 3.0.3)
Name (103.1.233.1:default): grok
331 Please specify the password.
Password: your_user's_password
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
Ingrese al directorio donde hay archivos y use el comando get para transferir el archivo de prueba que creamos anteriormente a nuestra computadora local:
cd files
get test.txt
Debería recibir un mensaje de salida similar al siguiente:
227 Entering Passive Mode (195,201,18,78,176,56).
150 Opening BINARY mode data connection for test.txt (17 bytes).
226 Transfer complete.
17 bytes received in 0.00 secs (218.4416 kB/s)
A continuación, cargamos el archivo con un nuevo nombre para probar los permisos de escritura:
put test.txt upload.txt
Debería recibir un mensaje de salida similar al siguiente:
227 Entering Passive Mode (195,201,18,78,161,23).
150 Ok to send data.
226 Transfer complete.
17 bytes sent in 0.00 secs (353.2247 kB/s)
Cierra la conexión:
bye
Transferencias seguras
Dado que FTP no cifra ningún dato en tránsito, incluidas las credenciales de usuario, habilitaremos TLS /SSL para proporcionar dicho cifrado. El primer paso es crear los certificados SSL para usar con vsftpd.
Use openssl para crear un nuevo certificado y use el parámetro -days para que sea válido por un año. En el mismo comando, agregue una clave RSA privada de 2048 bits. Al establecer tanto los parámetros -keyoute y salida privado en el mismo valor, la clave privada y el certificado estarán ubicados en el mismo archivo:
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem
Se le pedirá que proporcione información de dirección para el certificado. Ingrese su informacion.
Debería recibir un mensaje de salida similar al siguiente:
Generating a 2048 bit RSA private key............................................................................+++...........+++
writing new private key to '/etc/ssl/private/vsftpd.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:IT
State or Province Name (full name) [Some-State]:MI
Locality Name (eg, city) []:Milano
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Noviello
Organizational Unit Name (eg, section) []:
Common Name (eg server FQDN or YOUR name) []: INDIRIZZO_IP_DEL_TUO_SERVER
Email Address []:
Una vez que se hayan creado los certificados, abra el archivo de configuración de vsftp nuevamente:
sudo nano /etc/vsftpd.conf
Hacia el final del archivo, comente las dos líneas que comienzan con rsa_:
...
# rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
# rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key...
Agregue las siguientes líneas que apuntan al certificado y la clave privada recién creados:
...
rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem...
Haga cumplir el uso de SSL, cambie ssl_enable a YES:
...
ssl_enable=YES...
A continuación, agregue las siguientes líneas para denegar explícitamente las conexiones anónimas a través de SSL y para requerir SSL para la transferencia de datos y los inicios de sesión:
...
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES...
Luego, configure el servidor para usar TLS, el sucesor de SSL. Agrega las siguientes líneas:
...
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO...
Por último, solicite conjuntos de cifrado "alto", que actualmente significan longitudes de clave iguales o superiores a 128 bits:
...
require_ssl_reuse=NO
ssl_ciphers=HIGH...
Luego, a continuación, un resumen de los últimos parámetros agregados en el archivo de configuración:
...
#rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
#rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem
ssl_enable=YES
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
require_ssl_reuse=NO
ssl_ciphers=HIGH
Guarde y cierre el archivo. Para guardar el archivo con el editor de texto nano, presione Ctrl + O, luego presione Enter para confirmar el nombre del archivo a escribir. Para cerrar el archivo, presione Ctrl + X.)
Reinicie el servicio vsftpd para que los cambios surtan efecto:
sudo systemctl restart vsftpd
En este punto, ya no podremos conectarnos con un cliente de línea de comando inseguro: El usuario grok, por otro lado, debería poder conectar, leer y escribir archivos:
ftp -p 103.1.233.1
Connected to 103.1.233.1.
220 (vsFTPd 3.0.3)
Name (103.1.233.1:default): grok
530 Non-anonymous sessions must use encryption.
Login failed.
421 Service not available, remote server has closed connection
Probar el acceso TLS con FileZilla
La mayoría de los clientes FTP modernos se pueden configurar para utilizar el cifrado TLS.
Abra FileZilla, Archivo -> Administrador del sitio -> Nuevo sitio
Complete el campo Host con el nombre o la dirección IP. En el menú desplegable Cifrado, seleccione Requerir FTP explícito sobre TLS.
En Tipo de inicio de sesión, seleccione Requerir contraseña. Ingrese su nombre de usuario FTP en el campo Usuario.
Haga clic en Conectar en la parte inferior de la interfaz. Se le pedirá la contraseña del usuario:
Haga clic en Aceptar para conectarse. Ahora debería estar conectado a su servidor con cifrado TLS /SSL.
Tan pronto como se conecte, se le pedirá que acepte un certificado de servidor.
Después de aceptar el certificado, haga doble clic en la carpeta de archivos y arrastre upload.txt hacia la izquierda para confirmar que puede descargar los archivos.
Cuando termine, haga clic con el botón derecho en la copia local, cámbiele el nombre upload-tls.txt y arrástrela de nuevo al servidor para confirmar que puede cargar los archivos:
Se confirma que puede transferir archivos de manera segura y exitosa con SSL /TLS habilitado.
Deshabilitar el acceso al shell
Si no se puede utilizar TLS debido a los requisitos del cliente, se puede lograr cierta seguridad desactivando la capacidad del usuario de FTP para iniciar sesión de cualquier otra manera. Una forma relativamente fácil de evitar esto es crear un shell personalizado. Esto no proporcionará ningún cifrado, pero limitará el acceso de una cuenta comprometida a archivos accesibles a través de FTP.
Abra un archivo llamado ftponly en el directorio bin:
sudo nano /bin/ftponly
Agregue un mensaje que le informe al usuario por qué no puede iniciar sesión:
#!/bin/sh
echo "Questo account è limitato solo all'accesso FTP."
Guarde y cierre el archivo. Para guardar el archivo con el editor de texto nano, presione Ctrl + O, luego presione Enter para confirmar el nombre del archivo a escribir. Para cerrar el archivo, presione Ctrl + X.)
Cambie los permisos para que el archivo sea ejecutable:
sudo chmod a+x /bin/ftponly
Abra la lista de shells válidos:
sudo nano /etc/shells
Finalmente agregue:
...
/bin/ftponly
Guarde y cierre el archivo. Para guardar el archivo con el editor de texto nano, presione Ctrl + O, luego presione Enter para confirmar el nombre del archivo a escribir. Para cerrar el archivo, presione Ctrl + X.)
Actualice el shell del usuario con el siguiente comando:
sudo usermod grok -s /bin/ftponly
Intente iniciar sesión en el servidor como grok:
ssh grok@indirizzo_ip_del_server
Debería recibir un mensaje de salida similar al siguiente:
...
This account is limited to FTP access only.
Connection to 195.201.18.78 closed.
Confirma que el usuario ya no puede acceder al servidor a través de ssh y está limitado solo al acceso FTP.
La instalación y configuración de VSFTPD en Ubuntu 18.04 LTS ha finalizado.