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:
Una nueva ventana se abrirá. Haga clic en el Nuevo sitio botón en la esquina inferior derecha:
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:
Hacer clic Conectar en la parte inferior de la interfaz. Se le pedirá la contraseña del usuario:
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í:
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:
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:
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 vsftpd
Soporte 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.