Cómo instalar y configurar un servidor FTP (vsftpd) con SSL/TLS en Ubuntu 20.04
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.
- 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
- 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.
Una nueva ventana se abrirá. Haga clic en el Nuevo sitio botón en la esquina inferior derecha.
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.
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.
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.
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.