Cómo instalar y configurar un servidor FTP (vsftpd) con SSL/TLS en Ubuntu 20.04

Administrador del sitio de FileZilla

FTP o File Transfer Protocol es un protocolo muy antiguo y conocido para transferir archivos entre un cliente y un servidor. También es un protocolo inseguro, pero solo si se usa sin TLS. En este tutorial, configuraremos vsftpd para TLS, lo que nos permite usar FTP de forma segura. FTP se ha reemplazado a menudo con protocolos más seguros como SFTP o SCP en estos días.

Sin embargo, si necesita usar FTP con su servidor, vsftpd (Very Secure FTP Daemon) es una elección perfecta.

En este tutorial, aprenderemos cómo instalar y configurar un servidor FTP usando vsftpd en un servidor basado en Ubuntu 20.04. También aprenderemos cómo asegurar la conexión usando el protocolo SSL/TLS.

requisitos previos

  • Un servidor Ubuntu 20.04 con un usuario no root que tenga privilegios sudo.

Paso 1 – Instalar vsftpd

El primer paso es instalar vsftpd.

$ sudo apt update
$ sudo apt install vsftpd

A continuación, necesitamos hacer una copia de seguridad del archivo de configuración original para que podamos comenzar con una configuración nueva.

$ sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.orig

Paso 2: configurar el cortafuegos

En este paso, configuraremos el firewall UFW para permitir el acceso a los puertos FTP.

Primero, verifiquemos el estado del firewall.

$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

Como podemos ver, hasta ahora solo se permiten puertos SSH. Abramos los puertos 20 (puerto de comando FTP), 21 (puerto de datos FTP), 990 para cuando usemos TLS y los puertos 35000-40000 para el rango de puertos pasivos que podamos necesitar en el futuro.

$ sudo ufw allow 20:21/tcp
$ sudo ufw allow 990/tcp
$ sudo ufw allow 35000:40000/tcp
$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
990/tcp                    ALLOW       Anywhere
20:21/tcp                  ALLOW       Anywhere
35000:40000/tcp            ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
20:21/tcp (v6)             ALLOW       Anywhere (v6)
990/tcp (v6)               ALLOW       Anywhere (v6)
35000:40000/tcp (v6)       ALLOW       Anywhere (v6)

Paso 3: configuración de vsftpd

Ahora repasaremos algunas configuraciones importantes para que vsftpd funcione.

Comience abriendo el archivo de configuración.

$ sudo nano /etc/vsftpd.conf

1. Acceso FTP

En este tutorial, permitiremos el acceso FTP solo a los usuarios locales y deshabilitaremos cualquier acceso anónimo. Para hacer esto, asegúrese de que las siguientes líneas existan y sean las siguientes.

anonymous_enable=NO
local_enable=YES

2. Habilitar la carga de archivos

El propósito singular más importante de FTP aquí es poder escribir en el servidor. Descomente la siguiente línea para habilitar la carga de archivos eliminando # delante de ella.

write_enable=YES

3. Cárcel de Chroot

FTP funciona mejor cuando un usuario está restringido a un directorio determinado. vsftpd logra eso usando chroot jails. Cuando chroot está habilitado para usuarios locales, están restringidos a sus directorios de inicio de forma predeterminada. Para lograr esto, descomente la siguiente línea.

chroot_local_user=YES

Para evitar cualquier vulnerabilidad de seguridad, chroot cuando está habilitado no funcionará siempre que el directorio al que los usuarios estén restringidos sea escribible.

Para sortear esta limitación, tenemos dos métodos para permitir la carga de archivos cuando chroot está habilitado.

  1. Método 1 – Este método funciona mediante el uso de un directorio diferente para cargas FTP. Para este tutorial, crearemos un directorio ftp dentro de la casa del usuario para que sirva como chroot y una segunda carga de directorio grabable para cargar los archivos. Para lograr esto, agregue las siguientes líneas al final del archivo.
    user_sub_token=$USER
    local_root=/home/$USER/ftp
    
  2. Método 2 – El segundo método es simplemente otorgar acceso de escritura al directorio de inicio como un todo. Agregue la siguiente línea para lograr esto.
    allow_writeable_chroot=YES
    

4. FTP pasivo

vsftpd puede usar cualquier puerto para conexiones FTP pasivas. Podemos especificar un rango para el número de puerto mínimo y máximo que vsftpd puede usar. Estos son los puertos que configuramos antes en nuestro firewall UFW.

Agregue las siguientes líneas para permitir conexiones FTP pasivas.

pasv_min_port=35000
pasv_max_port=40000

5. Restricción de usuarios

Para permitir que solo ciertos usuarios inicien sesión en el servidor FTP, agregue las siguientes líneas en la parte inferior.

userlist_enable=YES
userlist_file=/etc/vsftpd.userlist
userlist_deny=NO

Con esta opción habilitada, debemos especificar qué usuarios deberían poder usar FTP y agregar sus nombres de usuario en el archivo /etc/vsftpd.userlist.

Reinicie vsftpd para habilitar la configuración.

$ sudo systemctl restart vsftpd

Paso 4: configuración del directorio de usuarios

A los efectos de este tutorial, crearemos una nueva cuenta de usuario para transacciones FTP. Si ya tiene una cuenta de usuario para este propósito, puede omitir el paso 1. Además, si configuró allow_writeable_chroot=YES antes en el archivo de configuración, puede omitir el paso 3.

Paso 1: agregue un nuevo usuario.

$ sudo adduser testuser

Establezca una contraseña segura y omita todas las demás indicaciones.

Paso 2: agregue el usuario a la lista de usuarios de FTP permitidos.

$ echo "testuser" | sudo tee -a /etc/vsftpd.userlist

Paso 3: crear un directorio FTP y de archivos

Este paso es si desea un directorio diferente como raíz FTP y otro diferente para cargar archivos para sortear la limitación de chroot jail.

Cree la carpeta FTP.

$ sudo mkdir /home/testuser/ftp

Establecer su propiedad.Publicidad

$ sudo chown nobody:nogroup /home/testuser/ftp

Elimina los permisos de escritura.

$ sudo chmod a-w /home/testuser/ftp

Verifique los permisos antes de continuar.

$ sudo ls -al /home/testuser/ftp
total 8
dr-xr-xr-x 2 nobody   nogroup  4096 Jun  7 13:08 .
drwxr-xr-x 3 testuser testuser 4096 Jun  7 13:08 ..

Ahora vamos a crear el directorio de escritura real para los archivos.

$ sudo mkdir /home/testuser/ftp/upload
$ sudo chown testuser:testuser /home/testuser/ftp/upload

Prueba los permisos.

$ sudo ls -al /home/testuser/ftp
total 12
dr-xr-xr-x 3 nobody   nogroup  4096 Jun  7 13:10 .
drwxr-xr-x 3 testuser testuser 4096 Jun  7 13:08 ..
drwxr-xr-x 2 testuser testuser 4096 Jun  7 13:10 upload

Finalmente, agreguemos un archivo test.txt para usar en las pruebas.

$ echo "vsftpd test file" | sudo tee /home/testuser/ftp/upload/test.txt

Paso 5 – Pruebe el acceso FTP

Nuestro servidor FTP es completamente funcional en este momento. Podemos hacer una pequeña prueba antes de continuar.

Intentemos iniciar sesión como un usuario anónimo.

$ ftp -p 136.244.105.99
Connected to 136.244.105.99.
220 (vsFTPd 3.0.3)
Name (136.244.105.99:default): anonymous
530 Permission denied.
ftp: Login failed.
ftp>

Cierra la conexión.

ftp> bye

Funciona según lo previsto, es decir, no se permiten usuarios anónimos.

Intentemos conectarnos como cualquier otro usuario de sudo. No debería conectarse también.

$ ftp -p 136.244.105.99
Connected to 136.244.105.99.
220 (vsFTPd 3.0.3)
Name (136.244.105.99:default): sudo_user
530 Permission denied.
ftp: Login failed.
ftp>

Cierra la conexión.

ftp> bye

Intentemos finalmente conectarnos como usuario de prueba que creamos para FTP.

$ ftp -p 136.244.105.99
Connected to 136.244.105.99.
220 (vsFTPd 3.0.3)
Name (136.244.105.99:default): testuser
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>

Cambiemos al directorio de carga y usemos el comando get para transferir el archivo de prueba a nuestra máquina local.

ftp> cd upload
250 Directory successfully changed.
ftp> get test.txt
227 Entering Passive Mode (136,244,105,99,165,42).
150 Opening BINARY mode data connection for test.txt (17 bytes).
226 Transfer complete.
16 bytes received in 0.0101 seconds (164.3719 kB/s)
ftp>

A continuación, subamos el archivo con un nuevo nombre usando el comando put para probar los permisos de escritura.

ftp> put test.txt upload.txt
227 Entering Passive Mode (136,244,105,99,163,102).
150 Ok to send data.
226 Transfer complete.
17 bytes sent in 0.000894 seconds (518.7988 kB/s)

Cierra la conexión.

ftp> bye

Paso 6: asegurar las transmisiones usando SSL/TLS

Para encriptar las transmisiones FTP, necesitamos tener un Certificado SSL y configurar vsftpd para usarlo.

Si ya tiene un dominio o subdominio que apunta a su servidor FTP, puede crear un certificado SSL gratuito de Let’s Encrypt y usarlo.

A los efectos de nuestro tutorial, utilizaremos un certificado SSL autofirmado. Para crear uno, use el comando openssl.

El siguiente comando creará una clave privada de 2048 bits y un certificado válido por 1 año. Tanto el certificado como la clave se guardarán 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

Puede omitir las indicaciones que siguen o completar los valores a su gusto.

Ahora que nuestro certificado está creado, es hora de abrir nuevamente el archivo de configuración de vsftpd.

$ sudo nano /etc/vsftpd.conf

Encuentre las siguientes líneas y coméntelas poniendo un hash delante de ellas de la siguiente manera.

# rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
# rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key

Ahora, agregue las siguientes líneas.

rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem

Además, cambie el valor de ssl_enable a SÍ.

ssl_enable=YES

Agreguemos algunas configuraciones más para mejorar la seguridad SSL.

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

La mayoría de estos ajustes se explican por sí mismos. Estos deshabilitan SSL para usuarios anónimos y requieren SSL tanto para la transferencia de datos como para los inicios de sesión. También deshabilitamos los protocolos SSL inseguros y nos apegaremos a TLSv1.0. Y finalmente, hemos deshabilitado la reutilización de SSL y requerimos suites de cifrado de alto cifrado.

Reinicie el servidor para que la configuración surta efecto.

$ sudo systemctl restart vsftpd

Ahora, no podrá usar FTP a través de la línea de comandos. Deberá conectarse mediante un cliente que admita TLS.

Paso 7 – Probar TLS con FileZilla

Para nuestro tutorial, probaremos la capacidad de TLS usando Filezilla.

Cuando abra Filezilla, haga clic en el icono del Administrador del sitio justo encima de la palabra Anfitrión en la fila superior.

Administrador del sitio de FileZilla

Una nueva ventana se abrirá. Haga clic en el Nuevo sitio botón en la esquina inferior derecha.

Crear nuevo sitio - FileZilla

Verás un nuevo icono con el nombre Nuevo sitio. Puede cambiarle el nombre usando el Rebautizar botón.

Complete el campo Host con la dirección IP de su servidor. Dado que nuestro puerto FTP es 21, que es el puerto predeterminado para FTP, puede dejar el Puerto campo vacío. Para la opción Cifrado, seleccione Requerir FTP explícito sobre TLS del menú desplegable.

Editar sitio - FileZilla

Complete su nombre de usuario y contraseña de FTP con los que creamos anteriormente. Haga clic en el Conectar botón para proceder.

Tras una conexión exitosa, verá un certificado de servidor similar al siguiente.

Certificado FTP SSL - FileZilla

Puedes marcar la opción Confíe siempre en este certificado en futuras sesiones. para que no se le pregunte cada vez que inicie sesión. Haga clic en OK para proceder.

Conexión exitosa - FileZilla

Ahora puede realizar operaciones FTP normales.

Paso 8: deshabilite el acceso Shell

Este paso es totalmente opcional. De forma predeterminada, al crear un usuario FTP, si no se especifica explícitamente, el usuario tendrá acceso SSH al servidor.

Debe deshabilitar el acceso de shell al usuario de FTP para mejorar la seguridad. Para deshabilitarlo, necesitamos crear un nuevo shell que imprimirá un mensaje diciendo que la cuenta de usuario está limitada solo al acceso FTP.

Cree el shell /bin/ftponly y hágalo ejecutable.

$ echo -e '#!/bin/sh\necho "This account is limited to FTP access only."' | sudo tee -a  /bin/ftponly
$ sudo chmod a+x /bin/ftponly

Agregue el nuevo shell a la lista de shells válidos en el archivo /etc/shells.

$ echo "/bin/ftponly" | sudo tee -a /etc/shells

Cambie el shell de usuario a /bin/ftponly.

$ sudo usermod newftpuser -s /bin/ftponly

Puede usar el mismo comando para cambiar el shell de todos los usuarios a los que desea otorgar acceso FTP.

Conclusión

Esto concluye nuestro tutorial donde instalamos y configuramos vsftpd para instalar un servidor FTP en un servidor basado en Ubuntu 20.04. También configuramos nuestra conexión FTP para que funcione con SSL/TLS.

Si tiene alguna pregunta, hágala en los comentarios a continuación.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *