Introducción

FTP, abreviatura de File Transfer Protocol, es un protocolo de red que alguna vez se usó ampliamente para mover archivos entre un cliente y un servidor. Desde entonces, ha sido reemplazado por formas más rápidas, seguras y convenientes de entregar archivos. Muchos usuarios ocasionales de Internet esperan descargar directamente desde su navegador web con https, y es más probable que los usuarios de la línea de comandos utilicen protocolos seguros como el scp o SFTP.

FTP todavía se utiliza para admitir aplicaciones heredadas y flujos de trabajo con necesidades muy específicas. Si tiene la opción de qué protocolo usar, considere explorar las opciones más modernas. Sin embargo, cuando necesite FTP, vsftpd es una excelente opción. Optimizado para la seguridad, el rendimiento y la estabilidad, vsftpd ofrece una sólida protección contra muchos problemas de seguridad que se encuentran en otros servidores FTP y es el predeterminado para muchas distribuciones de Linux.

En este tutorial, configurará vsftpd para permitir que un usuario cargue archivos en su directorio personal mediante FTP, con credenciales de inicio de sesión protegidas por SSL / TLS.

Prerrequisitos

Para seguir este tutorial, necesitará:

  • Un servidor Debian 10 y un usuario no root con sudo privilegios. Puede obtener más información sobre cómo crear un usuario con estos privilegios en nuestra guía Configuración inicial del servidor con Debian 10.

Paso 1: instalación de vsftpd

Comencemos actualizando nuestra lista de paquetes e instalando el vsftpd demonio:

  • sudo apt update
  • sudo apt install vsftpd

Cuando se complete la instalación, copie el archivo de configuración para que pueda comenzar con una configuración en blanco y guarde el original como copia de seguridad:

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

Con una copia de seguridad de la configuración en su lugar, estamos listos para configurar el firewall.

Paso 2: abrir el cortafuegos

Revisemos el estado del firewall para ver si está habilitado. Si es así, nos aseguraremos de que se permita el tráfico FTP para que las reglas de firewall no bloqueen nuestras pruebas. Esta guía asume que tiene UFW instalado, siguiendo el paso 4 de la guía de configuración inicial del servidor.

Verifique el estado del firewall:

En este caso, solo se permite SSH a través de:

Output

Status: active

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

Es posible que tenga otras reglas establecidas o ninguna regla de firewall. Dado que en este caso solo se permite el tráfico SSH, tendremos que agregar reglas para el tráfico FTP.

Abramos los puertos 20 y 21 para FTP, puerto 990 para cuando habilitamos TLS y los puertos 40000-50000 para el rango de puertos pasivos que planeamos establecer en el archivo de configuración:

  • sudo ufw allow 20/tcp
  • sudo ufw allow 21/tcp
  • sudo ufw allow 990/tcp
  • sudo ufw allow 40000:50000/tcp

Verifique el estado del firewall:

Las reglas de su firewall ahora deberían verse así:

Output

Status: active

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

Con vsftpd instalado y los puertos necesarios abiertos, pasemos a la creación de un usuario FTP dedicado.

Paso 3: preparación del directorio de usuarios

Crearemos un usuario FTP dedicado, pero es posible que ya tenga un usuario que necesite acceso FTP. Nos encargaremos de preservar el acceso de un usuario existente a sus datos en las instrucciones que siguen. Aun así, le recomendamos que comience con un nuevo usuario hasta que haya configurado y probado su configuración.

Primero, agregue un usuario de prueba llamado sammy:

Asigne una contraseña cuando se le solicite. Siéntete libre de presionar ENTRAR a través de las otras indicaciones.

FTP es generalmente más seguro cuando los usuarios están restringidos a un directorio específico. vsftpd logra esto con chroot cárceles. Cuando chroot está habilitado para usuarios locales, están restringidos a su directorio de inicio de forma predeterminada. Sin embargo, debido a la forma vsftpd protege el directorio, el usuario no debe poder escribirlo. Esto está bien para un nuevo usuario que solo debería conectarse a través de FTP, pero un usuario existente puede necesitar escribir en su carpeta de inicio si también tiene acceso de shell.

En este ejemplo, en lugar de eliminar los privilegios de escritura del directorio de inicio, creemos un ftp directorio para servir como el chroot y un escribible files directorio para contener los archivos reales.

Crea el ftp carpeta:

  • sudo mkdir /home/sammy/ftp

Establecer su propiedad:

  • sudo chown nobody:nogroup /home/sammy/ftp

Quite los permisos de escritura:

  • sudo chmod a-w /home/sammy/ftp

Verifique los permisos:

  • sudo ls -la /home/sammy/ftp

Output

total 8
4 dr-xr-xr-x  2 nobody nogroup 4096 Aug 24 21:29 .
4 drwxr-xr-x  3 sammy  sammy   4096 Aug 24 21:29 ..

A continuación, creemos el directorio para la carga de archivos y asignemos la propiedad al usuario:

  • sudo mkdir /home/sammy/ftp/files
  • sudo chown sammy:sammy /home/sammy/ftp/files

Una verificación de permisos en el ftp directorio debe devolver lo siguiente:

  • sudo ls -la /home/sammy/ftp

Output

total 12
dr-xr-xr-x 3 nobody nogroup 4096 Aug 26 14:01 .
drwxr-xr-x 3 sammy  sammy   4096 Aug 26 13:59 ..
drwxr-xr-x 2 sammy  sammy   4096 Aug 26 14:01 files

Finalmente, agreguemos un test.txt archivo para usar cuando probamos:

  • echo «vsftpd test file» | sudo tee /home/sammy/ftp/files/test.txt

Ahora que hemos asegurado el ftp directorio y permitió al usuario acceder al files directorio, modifiquemos nuestra configuración.

Paso 4: configuración del acceso FTP

Planeamos permitir que un solo usuario con una cuenta de shell local se conecte con FTP. Las dos configuraciones clave para esto ya están establecidas en vsftpd.conf. Comience abriendo el archivo de configuración para verificar que las configuraciones en su configuración coincidan con las siguientes:

  • sudo nano /etc/vsftpd.conf

/etc/vsftpd.conf

. . .
# Allow anonymous FTP? (Disabled by default).
anonymous_enable=NO
#
# Uncomment this to allow local users to log in.
local_enable=YES
. . .

A continuación, habilitemos al usuario para cargar archivos asegurándonos de que el write_enable la configuración está descomentada y establecida en YES:

/etc/vsftpd.conf

. . .
write_enable=YES
. . .

También descomentaremos el chroot para evitar que el usuario conectado a FTP acceda a archivos o comandos fuera del árbol de directorios:

/etc/vsftpd.conf

. . .
chroot_local_user=YES
. . .

Agreguemos también un user_sub_token para insertar el nombre de usuario en nuestro local_root directory ruta para que nuestra configuración funcione para este usuario y cualquier usuario futuro adicional. Agregue estas configuraciones en cualquier lugar del archivo:

/etc/vsftpd.conf

. . .
user_sub_token=$USER
local_root=/home/$USER/ftp

También limitemos el rango de puertos que se pueden usar para FTP pasivo para asegurarnos de que haya suficientes conexiones disponibles:

/etc/vsftpd.conf

. . .
pasv_min_port=40000
pasv_max_port=50000

Nota: En el Paso 2, abrimos los puertos que configuramos aquí para el rango de puertos pasivos. Si cambia los valores, asegúrese de actualizar la configuración de su firewall.

Para permitir el acceso FTP caso por caso, establezcamos la configuración de modo que los usuarios solo tengan acceso cuando se agreguen explícitamente a una lista, en lugar de hacerlo de forma predeterminada:

/etc/vsftpd.conf

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

userlist_deny alterna la lógica: cuando se establece en YES, a los usuarios de la lista se les niega el acceso FTP. Cuando se establece en NO, solo los usuarios de la lista pueden acceder.

Cuando haya terminado de realizar los cambios, guarde el archivo y salga del editor.

Finalmente, agreguemos nuestro usuario a /etc/vsftpd.userlist. Utilizar el -a bandera para agregar al archivo:

  • echo «sammy» | sudo tee -a /etc/vsftpd.userlist

Compruebe que se agregó como esperaba:

Output

sammy

Reinicie el demonio para cargar los cambios de configuración:

  • sudo systemctl restart vsftpd

Con la configuración en su lugar, podemos pasar a probar el acceso FTP.

Paso 5: prueba del acceso FTP

Configuramos el servidor para permitir solo al usuario sammy para conectarse a través de FTP. Asegurémonos de que esto funcione como se esperaba.

Los usuarios anónimos no deberían poder conectarse: Hemos inhabilitado el acceso anónimo. Probemos eso intentando conectarnos de forma anónima. Si nuestra configuración está configurada correctamente, se debe negar el permiso a los usuarios anónimos. Abra otra terminal y ejecute el siguiente comando. Asegúrese de reemplazar 203.0.113.0 con la dirección IP pública de su servidor, y use anonymous como su nombre de usuario:

Output

Connected to 203.0.113.0.
220 (vsFTPd 3.0.3)
Name (203.0.113.0:default): anonymous
530 Permission denied.
ftp: Login failed.
ftp>

Cierra la conexión:

Los usuarios que no sean sammy deberían fallar al conectarse: A continuación, intentemos conectarnos como nuestro sudo usuario. También se les debe negar el acceso, y debe suceder antes de que se les permita ingresar su contraseña:

Output

Connected to 203.0.113.0.
220 (vsFTPd 3.0.3)
Name (203.0.113.0:default): your_sudo_user
530 Permission denied.
ftp: Login failed.
ftp>

Cierra la conexión:

El usuario sammy debería poder conectarse, leer y escribir archivos: Asegurémonos de que nuestro usuario designado pueda conectarse:

Output

Connected to 203.0.113.0.
220 (vsFTPd 3.0.3)
Name (203.0.113.0:default): sammy
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 files directorio y use el get comando para transferir el archivo de prueba que creamos anteriormente a nuestra máquina local:

Output

229 Entering Extended Passive Mode (|||47398|)
150 Opening BINARY mode data connection for test.txt (17 bytes).
100% |**********************************|    17      146.91 KiB/s    00:00 ETA
226 Transfer complete.
17 bytes received in 00:00 (0.17 KiB/s)
ftp>

A continuación, carguemos el archivo con un nuevo nombre para probar los permisos de escritura:

Output

229 Entering Extended Passive Mode (|||46598|)
150 Ok to send data.
100% |**********************************|    17        8.93 KiB/s    00:00 ETA
226 Transfer complete.
17 bytes sent in 00:00 (0.08 KiB/s)

Cierra la conexión:

Ahora que hemos probado nuestra configuración, tomemos medidas para asegurar aún más nuestro servidor.

Paso 6 – Asegurar transacciones

Dado que FTP lo hace no cifrar cualquier dato en tránsito, incluidas las credenciales de usuario, habilitaremos TLS / SSL para proporcionar ese cifrado. El primer paso es crear los certificados SSL para usar con vsftpd.

Usemos openssl para crear un nuevo certificado y usar el -days bandera para que sea válida por un año. En el mismo comando, agregaremos una clave RSA privada de 2048 bits. Al configurar tanto el -keyout y -out banderas al mismo valor, la clave privada y el certificado se ubicará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

Se le pedirá que proporcione la información de dirección para su certificado. Sustituya su propia información por los valores resaltados a continuación. Para el Common Name campo, asegúrese de agregar your_server_ip:

Output

Generating a 2048 bit RSA private key
............................................................................+++
...........+++
writing new private key to '/etc/ssl/private/vsftpd.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:NY
Locality Name (eg, city) []:New York City
Organization Name (eg, company) [Internet Widgits Pty Ltd]:DigitalOcean
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []: your_server_ip
Email Address []:

Para obtener información más detallada sobre los indicadores de certificado, consulte OpenSSL Essentials: Trabajar con certificados SSL, claves privadas y CSR

Una vez que haya creado los certificados, abra el vsftpd archivo de configuración de nuevo:

  • sudo nano /etc/vsftpd.conf

Hacia la parte inferior del archivo, verá dos líneas que comienzan con rsa_. Comentelos para que se vean así:

/etc/vsftpd.conf

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

Debajo de ellos, agregue las siguientes líneas que apuntan al certificado y la clave privada que acabamos de crear:

/etc/vsftpd.conf

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

Después de eso, forzaremos el uso de SSL, lo que evitará que los clientes que no pueden lidiar con TLS se conecten. Esto es necesario para garantizar que todo el tráfico esté cifrado, pero puede obligar a su usuario de FTP a cambiar de cliente. Cambio ssl_enable a YES:

/etc/vsftpd.conf

. . .
ssl_enable=YES
. . .

Después de eso, agregue las siguientes líneas para denegar explícitamente las conexiones anónimas a través de SSL y para requerir SSL tanto para la transferencia de datos como para los inicios de sesión:

/etc/vsftpd.conf

. . .
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
. . .

Después de esto, configure el servidor para usar TLS, el sucesor preferido de SSL, agregando las siguientes líneas:

/etc/vsftpd.conf

. . .
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
. . .

Finalmente, agregaremos dos opciones más. Primero, no requeriremos la reutilización de SSL porque puede romper muchos clientes FTP. Necesitaremos conjuntos de cifrado de cifrado «alto», lo que actualmente significa longitudes de clave iguales o superiores a 128 bits:

/etc/vsftpd.conf

. . .
require_ssl_reuse=NO
ssl_ciphers=HIGH
. . .

La sección del archivo terminado debería verse así:

/etc/vsftpd.conf

# This option specifies the location of the RSA certificate to use for SSL
# encrypted connections.
#rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
#rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem
ssl_enable=YES
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

Cuando haya terminado, guarde y cierre el archivo.

Reinicie el servidor para que los cambios surtan efecto:

  • sudo systemctl restart vsftpd

En este punto, ya no podremos conectarnos con un cliente de línea de comandos inseguro. Si lo intentáramos, veríamos algo como:

Output

ftp -p 203.0.113.0
Connected to 203.0.113.0.
220 (vsFTPd 3.0.3)
Name (203.0.113.0:default): sammy
530 Non-anonymous sessions must use encryption.
ftp: Login failed.
ftp>

A continuación, verifiquemos que podamos conectarnos mediante un cliente que admita TLS.

Paso 7: prueba de TLS con FileZilla

La mayoría de los clientes FTP modernos se pueden configurar para utilizar el cifrado TLS. Demostraremos cómo conectarnos con FileZilla debido a su soporte multiplataforma. Consulte la documentación para otros clientes.

Cuando abra FileZilla por primera vez, busque el icono del Administrador del sitio justo encima de la palabra Anfitrión, el icono situado más a la izquierda en la fila superior. Pinchalo:

Captura de pantalla del administrador del sitio

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

Botón de nuevo sitio
Debajo Mis sitios un nuevo icono con las palabras Nuevo sitio aparecerá. Puede nombrarlo ahora o regresar más tarde y usar el Rebautizar botón.

Rellena el Anfitrión campo con su nombre de dominio o dirección IP. Bajo la Cifrado menú desplegable, seleccione Requerir FTP explícito sobre TLS.

por Tipo de inicio de sesión, Seleccione Pedir contraseña. Complete su usuario de FTP en el Usuario campo:

Ficha Configuración general

Hacer clic Conectar en la parte inferior de la interfaz. Se le pedirá la contraseña del usuario:

Diálogo de contraseña

Hacer clic Okay para conectar. Ahora debería estar conectado con su servidor con cifrado TLS / SSL.

Si tiene éxito, se le presentará un certificado de servidor que se ve así:

Diálogo de certificado de sitio

Cuando haya aceptado el certificado, haga doble clic en el files carpeta y arrastre upload.txt a la izquierda para confirmar que puede descargar archivos:

Descarga test.txt

Cuando lo haya hecho, haga clic con el botón derecho en la copia local y cámbiele el nombre a upload-tls.txt y arrástrelo de regreso al servidor para confirmar que puede cargar archivos:

Cambiar nombre y subir

Ahora ha confirmado que puede transferir archivos de forma segura y exitosa con SSL / TLS habilitado.

Paso 8: deshabilitar el acceso al shell (opcional)

Si no puede usar TLS debido a los requisitos del cliente, puede obtener algo de seguridad desactivando la capacidad del usuario de FTP para iniciar sesión de cualquier otra manera. Una forma relativamente sencilla de evitarlo es creando un shell personalizado. Esto no proporcionará ningún cifrado, pero limitará el acceso de una cuenta comprometida a archivos accesibles por FTP.

Primero, abra un archivo llamado ftponly en el bin directorio:

Agregue un mensaje que le diga al usuario por qué no puede iniciar sesión:

/ bin / ftponly

#!/bin/sh
echo "This account is limited to FTP access only."

Guarde el archivo y salga de su editor.

Cambie los permisos para que el archivo sea ejecutable:

  • sudo chmod a+x /bin/ftponly

Abra la lista de shells válidos:

En la parte inferior agregue:

/ etc / shells

. . .
/bin/ftponly

Actualice el shell del usuario con el siguiente comando:

  • sudo usermod sammy -s /bin/ftponly

Ahora intente iniciar sesión en su servidor como sammy:

Debería ver algo como:

Output

This account is limited to FTP access only.
Connection to 203.0.113.0 closed.

Esto confirma que el usuario ya no puede ssh al servidor y está limitado al acceso FTP únicamente.

Conclusión

En este tutorial, cubrimos la configuración de FTP para usuarios con una cuenta local. Si necesita utilizar una fuente de autenticación externa, es posible que desee investigar vsftpdSoporte de usuarios virtuales. Esto ofrece un amplio conjunto de opciones mediante el uso de PAM, los módulos de autenticación conectables, y es una buena opción si administra usuarios en otro sistema como LDAP o Kerberos.

Por itencore