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 ha sido reemplazado a menudo por 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 la 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
- Un servidor Ubuntu 20.04 con un usuario no root que tiene privilegios sudo.
Paso 1:instalar vsftpd
El primer paso es instalar vsftpd.
$ sudo apt update
$ sudo apt install vsftpd
A continuación, debemos hacer una copia de seguridad del archivo de configuración original para poder 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. Habilitación de cargas 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 #
frente a él.
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
ftp
directorio dentro de la casa del usuario para servir como chroot y un segundo directorio de escrituraupload
por subir 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 cortafuegos 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 /etc/vsftpd.userlist
archivo.
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 ha configurado allow_writeable_chroot=YES
en el archivo de configuración anterior, puede omitir el paso 3.
Paso 1:Agregar un nuevo usuario.
$ sudo adduser testuser
Establece una contraseña segura y omite todas las demás indicaciones.
Paso 2:agregue el usuario a la lista de usuarios FTP permitidos.
$ echo "testuser" | sudo tee -a /etc/vsftpd.userlist
Paso 3:crear FTP y directorio 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.
$ 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
Pruebe 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 test.txt
archivo a utilizar para la prueba.
$ echo "vsftpd test file" | sudo tee /home/testuser/ftp/upload/test.txt
Paso 5:prueba de 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 tan bien.
$ 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 testuser
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>
Pasemos a upload
directorio y use el get
comando 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 put
comando 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:Protección de transmisiones mediante 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 openssl
comando.
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 de nuevo 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 YES
.
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:prueba de TLS con FileZilla
Para nuestro tutorial, probaremos la capacidad de TLS usando Filezilla.
Cuando abra Filezilla, haga clic en el ícono del Administrador del sitio justo encima de la palabra Host en la fila superior.
Una nueva ventana se abrirá. Haga clic en Nuevo sitio botón en la esquina inferior derecha.
Verá un nuevo icono con el nombre Nuevo sitio . Puede cambiarle el nombre usando Cambiar nombre 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. Haz clic en Conectar botón para continuar.
Tras una conexión exitosa, verá un certificado de servidor similar al siguiente.
Puede marcar la opción Confiar siempre en este certificado en futuras sesiones. para que no se le pregunte cada vez que inicie sesión. Haga clic en Aceptar para proceder.
Ahora puede realizar operaciones FTP normales.
Paso 8:deshabilitar el acceso al shell
Este paso es completamente 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.
Crea el /bin/ftponly
shell y hacerlo 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 /etc/shells
archivo.
$ 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 dar 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.