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.
- 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 directorioupload
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
- 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.
Se abrirá una nueva ventana. Haz clic en el botón Nuevo Sitio en la esquina inferior derecha.
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.
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.
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.
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.