Cómo instalar y configurar VSFTPD en Ubuntu 18.04 LTS

27 feb 2021 10 min di lettura
Cómo instalar y configurar VSFTPD en Ubuntu 18.04 LTS
Indice dei contenuti

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.

Support us with a

Successivamente, completa il checkout per l'accesso completo a Noviello.it.
Bentornato! Accesso eseguito correttamente.
Ti sei abbonato con successo a Noviello.it.
Successo! Il tuo account è completamente attivato, ora hai accesso a tutti i contenuti.
Operazione riuscita. Le tue informazioni di fatturazione sono state aggiornate.
La tua fatturazione non è stata aggiornata.