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

El FTP o Protocolo de Transferencia de Archivos es un protocolo muy antiguo y conocido para transferir archivos entre un cliente y un servidor. También es un protocolo inseguro ut sólo si se utiliza sin TLS. En este tutorial, configuraremos vsftpd para TLS, lo que nos permitirá utilizar FTP de forma segura. Hoy en día, el FTP se ha sustituido a menudo por protocolos más seguros, como SFTP o SCP.

Sin embargo, si necesitas utilizar FTP con tu servidor, vsftpd (Very Secure FTP Daemon) es una elección perfecta.

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

Requisitos previos

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

Paso 1 – Instalar vsftpd

El primer paso es instalar vsftpd.

$ sudo apt update
$ sudo apt install vsftpd

A continuación, tenemos que hacer una copia de seguridad del archivo de configuración original para poder empezar con una configuración nueva.

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

Paso 2 – Configurar el Cortafuegos

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

En primer lugar, vamos a comprobar el estado del cortafuegos.

$ sudo ufw status
Status: active

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

Como podemos ver, hasta ahora sólo están permitidos los puertos SSH. Abramos los puertos 20(puerto de comandos FTP), 21(puerto de datos FTP), 990 para cuando utilicemos 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 – Configurar vsftpd

Ahora repasaremos algunos ajustes importantes para que vsftpd funcione.

Empieza abriendo el archivo de configuración.

$ sudo nano /etc/vsftpd.conf

1. Acceso FTP

En este tutorial, permitiremos el acceso FTP sólo a los usuarios locales y desactivaremos cualquier acceso anónimo. Para ello, asegúrate de que existen las siguientes líneas y de que son como se indica a continuación.

anonymous_enable=NO
local_enable=YES

2. Habilitar la subida de archivos

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

write_enable=YES

3. Cárcel Chroot

El FTP funciona mejor cuando un usuario está restringido a un directorio determinado. vsftpd lo consigue utilizando jaulas chroot. Cuando se activa chroot para los usuarios locales, por defecto están restringidos a sus directorios personales. Para conseguirlo, descomenta la siguiente línea.

chroot_local_user=YES

Para evitar cualquier vulnerabilidad de seguridad, cuando chroot esté activado no funcionará mientras el directorio al que están restringidos los usuarios tenga permisos de escritura.

Para evitar esta limitación, tenemos dos métodos para permitir la subida de archivos cuando chroot está activado.

  1. Método 1 – Este método funciona utilizando un directorio diferente para las subidas FTP. Para este tutorial, crearemos un directorio ftp dentro de la casa del usuario para que sirva como chroot y un segundo directorio upload con permisos de escritura para subir los archivos. Para ello, añade 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 consiste simplemente en conceder acceso de escritura al directorio home en su conjunto. Añade la siguiente línea para conseguirlo.
    allow_writeable_chroot=YES
    

4. FTP pasivo

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

Añade las siguientes líneas para permitir las conexiones FTP pasivas.

pasv_min_port=35000
pasv_max_port=40000

5. Restringir usuarios

Para permitir que sólo determinados usuarios puedan acceder al servidor FTP, añade las siguientes líneas en la parte inferior.

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

Con esta opción activada, tenemos que especificar qué usuarios deben tener permiso para utilizar el FTP y añadir sus nombres de usuario en el archivo /etc/vsftpd.userlist.

Reinicia vsftpd para activar la configuración.

$ sudo systemctl restart vsftpd

Paso 4 – Configuración del Directorio de Usuarios

Para el propósito de este tutorial, crearemos una nueva cuenta de usuario para transacciones FTP. Si ya tienes una cuenta de usuario para este fin, puedes saltarte el paso 1. Además, si ya habías configurado allow_writeable_chroot=YES en el archivo de configuración, puedes saltarte el paso 3.

Paso 1 – Añade un nuevo usuario.

$ sudo adduser testuser

Establece una contraseña segura y sáltate todas las demás indicaciones.

Paso 2 – Añade el usuario a la lista de usuarios FTP permitidos.

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

Paso 3 – Crear directorio FTP y de archivos

Este paso es si quieres un directorio diferente como raíz FTP y otro diferente para subir archivos para evitar la limitación de la jaula chroot.

Crea la carpeta FTP.

$ sudo mkdir /home/testuser/ftp

Establece su propiedad.

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

Elimina los permisos de escritura.

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

Verifica 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 real con permisos de escritura para los archivos.

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

Comprueba 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

Por último, vamos a añadir un archivo test.txt para utilizarlo en las pruebas.

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

Paso 5 – Probar el acceso FTP

Nuestro servidor FTP es totalmente funcional en este momento. Podemos hacer una pequeña prueba antes de seguir adelante.

Intentemos conectarnos como 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 sudo. Tampoco debería conectarse.

$ 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

Por último, intentemos conectarnos como el testuser que hemos creado para el 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 upload y utilicemos 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, carguemos el archivo con un nuevo nombre utilizando el comando put para comprobar 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 – Proteger las transmisiones mediante SSL/TLS

Para cifrar las transmisiones FTP, necesitamos tener un Certificado SSL y configurar vsftpd para que lo utilice.

Si ya tienes un dominio o subdominio que apunte a tu servidor FTP, puedes crear un Certificado SSL gratuito de Let’s Encrypt y utilizarlo.

Para el propósito de nuestro tutorial, utilizaremos un certificado SSL autofirmado. Para crear uno, utiliza el comando openssl.

El siguiente comando creará una clave privada de 2048 bits y un certificado válido durante 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

Puedes saltarte las indicaciones que siguen o rellenar los valores a tu gusto.

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

$ sudo nano /etc/vsftpd.conf

Busca las siguientes líneas y coméntalas poniendo una almohadilla delante de ellas como se indica a continuación.

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

Ahora, añade las siguientes líneas.

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

Además, cambia el valor de ssl_enable por YES.

ssl_enable=YES

Añadamos algunos ajustes 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. Se trata de desactivar SSL para usuarios anónimos y de exigir SSL tanto para la transferencia de datos como para los inicios de sesión. También hemos desactivado los protocolos SSL inseguros y nos ceñiremos a TLSv1.0. Y, por último, hemos desactivado la reutilización de SSL y exigimos suites de cifrado de alta codificación.

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

$ sudo systemctl restart vsftpd

Ahora, no podrás utilizar FTP a través de la línea de comandos. Tendrás que conectarte utilizando un cliente que soporte TLS.

Paso 7 – Probar TLS con FileZilla

Para nuestro tutorial, probaremos la capacidad TLS utilizando Filezilla.

Cuando abras Filezilla, haz clic en el icono Administrador del Sitio, justo encima de la palabra Host en la fila superior.

FileZilla Site Manager

Se abrirá una nueva ventana. Haz clic en el botón Nuevo Sitio en la esquina inferior derecha.

Create New Site - FileZilla

Verás un nuevo icono con el nombre Nuevo sitio. Puedes cambiarle el nombre utilizando el botón Renombrar.

Rellena el campo Host con la dirección IP de tu servidor. Como nuestro puerto FTP es el 21, que es el puerto por defecto para FTP, puedes dejar el campo Puerto vacío. Para la opción Cifrado, selecciona Requerir FTP explícito sobre TLS en el menú desplegable.

Site Edit - FileZilla

Introduce tu nombre de usuario y contraseña FTP con los que hemos creado anteriormente. Pulsa el botón Conectar para continuar.

Si la conexión se realiza correctamente, verás un certificado de servidor con el siguiente aspecto.

FTP SSL Certificate - FileZilla

Puedes marcar la opción Confiar siempre en este certificado en futuras sesiones. para que no se te pregunte cada vez al iniciar sesión. Haz clic en Aceptar para continuar.

Successful Connection - FileZilla

Ahora puedes realizar operaciones FTP normales.

Paso 8 – Desactivar el Acceso Shell

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

Deberías deshabilitar el acceso shell al usuario FTP para mejorar la seguridad. Para deshabilitarlo, necesitamos crear una nueva shell que imprima un mensaje diciendo que la cuenta de usuario está limitada únicamente al acceso FTP.

Crea la shell /bin/ftponly y hazla 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

Añade la nueva shell a la lista de shells válidas del archivo /etc/shells.

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

Cambia el shell de usuario a /bin/ftponly.

$ sudo usermod newftpuser -s /bin/ftponly

Puedes utilizar el mismo comando para cambiar el shell de todos los usuarios a los que quieras dar acceso FTP.

Conclusión

Con esto concluye nuestro tutorial en el que hemos instalado y configurado vsftpd para instalar un servidor FTP en un servidor basado en Ubuntu 20.04. También hemos configurado nuestra conexión FTP para que funcione usando SSL/TLS.

Si tienes alguna pregunta, hazla en los comentarios de abajo.

También te podría gustar...