Cómo configurar vsftpd para el directorio de un usuario en Debian 10
Introducción
FTP, abreviatura de File Transfer Protocol (Protocolo de transferencia de archivos), es un protocolo de red que en su día se utilizó ampliamente para transferir archivos entre un cliente y un servidor. Desde entonces, ha sido reemplazado por formas más rápidas, seguras y convenientes de enviar archivos. Muchos usuarios ocasionales de Internet esperan descargar directamente desde su navegador web con https
, y los usuarios de línea de comandos tienen más probabilidades de utilizar protocolos seguros como el scp
FTP o SFTP.
FTP todavía se utiliza para dar soporte a aplicaciones y flujos de trabajo heredados con necesidades muy específicas. Si puede elegir qué protocolo utilizar, 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 protección sólida contra muchos problemas de seguridad que se encuentran en otros servidores FTP y es el valor predeterminado para muchas distribuciones de Linux.
En este tutorial, configurará vsftpd para permitir que un usuario cargue archivos a su directorio de inicio mediante FTP, con credenciales de inicio de sesión protegidas por SSL/TLS.
Prerrequisitos
Para seguir este tutorial necesitarás:
- 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 poder 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, estamos listos para configurar el firewall.
Paso 2: Apertura del firewall
Verifiquemos el estado del firewall para ver si está habilitado. Si lo está, nos aseguraremos de que se permita el tráfico FTP para que las reglas del firewall no bloqueen nuestras pruebas. Esta guía asume que tiene instalado UFW y sigue el paso 4 de la guía de configuración inicial del servidor.
Compruebe el estado del firewall:
- sudo ufw status
En este caso, solo se permite SSH a través de:
OutputStatus: activeTo Action From-- ------ ----OpenSSH ALLOW AnywhereOpenSSH (v6) ALLOW Anywhere (v6)
Es posible que tenga otras reglas establecidas o que no tenga reglas de firewall. Como en este caso solo se permite el tráfico SSH, necesitaremos agregar reglas para el tráfico FTP.
Abramos puertos 20
y 21
para FTP, puerto 990
para cuando habilitemos TLS y puertos 40000-50000
para el rango de puertos pasivos que planeamos configurar 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
Compruebe el estado del firewall:
- sudo ufw status
Las reglas de tu firewall ahora deberían verse así:
OutputStatus: activeTo Action From-- ------ ----OpenSSH ALLOW Anywhere990/tcp ALLOW Anywhere20/tcp ALLOW Anywhere21/tcp ALLOW Anywhere40000:50000/tcp ALLOW AnywhereOpenSSH (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
los puertos instalados y necesarios abiertos, pasemos a crear un usuario FTP dedicado.
Paso 3: preparación del directorio de usuarios
Crearemos un usuario FTP dedicado, pero es posible que ya tengas 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í, te recomendamos que comiences con un usuario nuevo hasta que hayas configurado y probado tu configuración.
Primero, agregue un usuario de prueba llamado sammy
:
- sudo adduser sammy
Asigna una contraseña cuando se te solicite. No dudes en seguir ENTER
las demás indicaciones.
El FTP es generalmente más seguro cuando los usuarios están restringidos a un directorio específico. vsftpd
Esto se logra con chroot
jails. Cuando chroot
está habilitado para usuarios locales, están restringidos a su directorio de inicio de manera predeterminada. Sin embargo, debido a la forma en que vsftpd
se asegura el directorio, el usuario no debe poder escribir en él. Esto está bien para un usuario nuevo que solo debe 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, crearemos un ftp
directorio que sirva como directorio chroot
y un directorio escribible files
para contener los archivos reales.
Crea la ftp
carpeta:
- sudo mkdir /home/sammy/ftp
Establecer su propiedad:
- sudo chown nobody:nogroup /home/sammy/ftp
Eliminar permisos de escritura:
- sudo chmod a-w /home/sammy/ftp
Verificar los permisos:
- sudo ls -la /home/sammy/ftp
Outputtotal 84 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, crearemos el directorio para cargar archivos y asignaremos 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 debería devolver lo siguiente:
- sudo ls -la /home/sammy/ftp
Outputtotal 12dr-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
Por último, agreguemos un test.txt
archivo para usar cuando hagamos pruebas:
- echo "vsftpd test file" | sudo tee /home/sammy/ftp/files/test.txt
Ahora que hemos asegurado el ftp
directorio y permitido al usuario acceder al files
directorio, modifiquemos nuestra configuración.
Paso 4: Configuración del acceso FTP
Estamos planeando permitir que un solo usuario con una cuenta de shell local se conecte con FTP. Las dos configuraciones clave para esto ya están configuradas 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 la write_enable
configuración no esté comentada y esté establecida en YES
:
/etc/vsftpd.conf
. . .write_enable=YES. . .
También descomentaremos esto chroot
para evitar que el usuario conectado a FTP acceda a cualquier archivo o comando 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 nuestra local_root directory
ruta, de modo que nuestra configuración funcione para este usuario y cualquier otro usuario futuro. Agregue estas configuraciones en cualquier parte del archivo:
/etc/vsftpd.conf
. . .user_sub_token=$USERlocal_root=/home/$USER/ftp
También limitaremos 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=40000pasv_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 para que los usuarios solo tengan acceso cuando se agreguen explícitamente a una lista, en lugar de hacerlo de manera predeterminada:
/etc/vsftpd.conf
. . .userlist_enable=YESuserlist_file=/etc/vsftpd.userlistuserlist_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 se permite el acceso a los usuarios de la lista.
Cuando haya terminado de realizar los cambios, guarde el archivo y salga del editor.
Por último, agreguemos nuestro usuario a /etc/vsftpd.userlist
. Usemos la -a
bandera para agregarlo al archivo:
- echo "sammy" | sudo tee -a /etc/vsftpd.userlist
Comprueba que se agregó como esperabas:
- cat /etc/vsftpd.userlist
Outputsammy
Reinicie el demonio para cargar los cambios de configuración:
- sudo systemctl restart vsftpd
Con la configuración establecida, podemos pasar a probar el acceso FTP.
Paso 5: Prueba del acceso FTP
Hemos configurado el servidor para permitir que solo el usuario sammy se conecte a través de FTP. Asegurémonos de que esto funcione como se espera.
Los usuarios anónimos no deberían poder conectarse : hemos desactivado el acceso anónimo. Probemos esto intentando conectarnos de forma anónima. Si nuestra configuración está configurada correctamente, se debería denegar el permiso a los usuarios anónimos. Abra otra terminal y ejecute el siguiente comando. Asegúrese de reemplazarlo 203.0.113.0
con la dirección IP pública de su servidor y utilícelo anonymous
como su nombre de usuario:
- ftp -p 203.0.113.0
OutputConnected to 203.0.113.0.220 (vsFTPd 3.0.3)Name (203.0.113.0:default): anonymous530 Permission denied.ftp: Login failed.ftp
Cerrar la conexión:
- bye
Los usuarios que no sean sammy no deberían poder conectarse : A continuación, intentemos conectarnos como nuestro sudo
usuario. También se les debería negar el acceso y esto debería suceder antes de que se les permita ingresar su contraseña:
- ftp -p 203.0.113.0
OutputConnected to 203.0.113.0.220 (vsFTPd 3.0.3)Name (203.0.113.0:default): your_sudo_user530 Permission denied.ftp: Login failed.ftp
Cerrar la conexión:
- bye
El usuario sammy debería poder conectarse, leer y escribir archivos : Asegurémonos de que nuestro usuario designado pueda conectarse:
- ftp -p 203.0.113.0
OutputConnected to 203.0.113.0.220 (vsFTPd 3.0.3)Name (203.0.113.0:default): sammy331 Please specify the password.Password: your_user's_password230 Login successful.Remote system type is UNIX.Using binary mode to transfer files.ftp
Cambiemos al files
directorio y usemos el get
comando para transferir el archivo de prueba que creamos anteriormente a nuestra máquina local:
- cd files
- get test.txt
Output229 Entering Extended Passive Mode (|||47398|)150 Opening BINARY mode data connection for test.txt (17 bytes).100% |**********************************| 17 146.91 KiB/s 00:00 ETA226 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:
- put test.txt upload.txt
Output229 Entering Extended Passive Mode (|||46598|)150 Ok to send data.100% |**********************************| 17 8.93 KiB/s 00:00 ETA226 Transfer complete.17 bytes sent in 00:00 (0.08 KiB/s)
Cerrar la conexión:
- bye
Ahora que hemos probado nuestra configuración, tomemos medidas para proteger aún más nuestro servidor.
Paso 6: Asegurar las transacciones
Dado que el FTP no cifra ningún 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
.
Vamos a utilizar openssl
para crear un nuevo certificado y utilizar el -days
indicador para que sea válido durante un año. En el mismo comando, agregaremos una clave RSA privada de 2048 bits. Al configurar los indicadores -keyout
y -out
con el 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 solicitará que proporcione información de dirección para su certificado. Sustituya su propia información por los valores resaltados a continuación. En el Common Name
campo, asegúrese de agregar your_server_ip
:
OutputGenerating 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 incorporatedinto 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 blankFor some fields there will be a default value,If you enter '.', the field will be left blank.-----Country Name (2 letter code) [AU]:USState or Province Name (full name) [Some-State]:NYLocality Name (eg, city) []:New York CityOrganization Name (eg, company) [Internet Widgits Pty Ltd]:DigitalOceanOrganizational Unit Name (eg, section) []:Common Name (e.g. server FQDN or YOUR name) []: your_server_ipEmail Address []:
Para obtener información más detallada sobre los indicadores de certificado, consulte Conceptos básicos de OpenSSL: Cómo trabajar con certificados SSL, claves privadas y CSR
Una vez que haya creado los certificados, abra vsftpd
nuevamente el archivo de configuración:
- sudo nano /etc/vsftpd.conf
Hacia la parte inferior del archivo, verás dos líneas que comienzan con rsa_
. Cómentalas 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.pemrsa_private_key_file=/etc/ssl/private/vsftpd.pem. . .
Después de eso, forzaremos el uso de SSL, lo que evitará que se conecten los clientes que no puedan manejar TLS. Esto es necesario para garantizar que todo el tráfico esté cifrado, pero puede obligar a su usuario FTP a cambiar de cliente. Cambie 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 requerir SSL tanto para la transferencia de datos como para los inicios de sesión:
/etc/vsftpd.conf
. . .allow_anon_ssl=NOforce_local_data_ssl=YESforce_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=YESssl_sslv2=NOssl_sslv3=NO. . .
Por último, añadiremos dos opciones más. En primer lugar, no exigiremos la reutilización de SSL porque puede dañar a muchos clientes FTP. Requeriremos conjuntos de cifrados de “alto” nivel, lo que actualmente significa longitudes de clave iguales o superiores a 128 bits:
/etc/vsftpd.conf
. . .require_ssl_reuse=NOssl_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.keyrsa_cert_file=/etc/ssl/private/vsftpd.pemrsa_private_key_file=/etc/ssl/private/vsftpd.pemssl_enable=YESallow_anon_ssl=NOforce_local_data_ssl=YESforce_local_logins_ssl=YESssl_tlsv1=YESssl_sslv2=NOssl_sslv3=NOrequire_ssl_reuse=NOssl_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 esto:
Outputftp -p 203.0.113.0Connected to 203.0.113.0.220 (vsFTPd 3.0.3)Name (203.0.113.0:default): sammy530 Non-anonymous sessions must use encryption.ftp: Login failed.ftp
A continuación, verifiquemos que podemos conectarnos usando 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 conectarse con FileZilla gracias a su compatibilidad con varias plataformas. Consulte la documentación para otros clientes.
Cuando abra FileZilla por primera vez, busque el ícono del Administrador de sitios justo encima de la palabra Host , el ícono más a la izquierda en la fila superior. Haga clic en él:
Se abrirá una nueva ventana. Haga clic en el botón Nuevo sitio en la esquina inferior derecha:
En Mis sitios aparecerá un nuevo icono con las palabras Nuevo sitio . Puedes ponerle nombre ahora o volver más tarde y usar el botón Cambiar nombre .
Complete el campo Host con su nombre de dominio o dirección IP. En el menú desplegable Encriptación , seleccione Requerir FTP explícito sobre TLS .
En Tipo de inicio de sesión , seleccione Solicitar contraseña . Complete su usuario FTP en el campo Usuario :
Haga clic en Conectar en la parte inferior de la interfaz. Se le solicitará la contraseña del usuario:
Haga clic en Aceptar para conectarse. Ahora debería estar conectado a su servidor con cifrado TLS/SSL.
Si tiene éxito, se le presentará un certificado de servidor que se parece a esto:
Cuando haya aceptado el certificado, haga doble clic en la files
carpeta y arrástrela upload.txt
hacia la izquierda para confirmar que puede descargar archivos:
Cuando hayas hecho eso, haz clic derecho en la copia local, cámbiale el nombre upload-tls.txt
y arrástrala nuevamente al servidor para confirmar que puedes 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 utilizar TLS debido a los requisitos del cliente, puede obtener cierta seguridad desactivando la posibilidad de que el usuario FTP inicie sesión de cualquier otra forma. Una forma relativamente sencilla de evitarlo es crear un shell personalizado. Esto no proporcionará ningún tipo de cifrado, pero limitará el acceso de una cuenta comprometida a los archivos a los que se puede acceder mediante FTP.
Primero, abra un archivo llamado ftponly
en el bin
directorio:
- sudo nano /bin/ftponly
Agregue un mensaje que le diga al usuario por qué no puede iniciar sesión:
/bin/ftponly
#!/bin/shecho "This account is limited to FTP access only."
Guarde el archivo y salga del editor.
Cambie los permisos para que el archivo sea ejecutable:
- sudo chmod a+x /bin/ftponly
Abra la lista de shells válidos:
- sudo nano /etc/shells
En la parte inferior añade:
/etc/conchas
. . ./bin/ftponly
Actualice el shell del usuario con el siguiente comando:
- sudo usermod sammy -s /bin/ftponly
Ahora intenta iniciar sesión en tu servidor como sammy :
- ssh sammy@your_server_ip
Deberías ver algo como:
OutputThis account is limited to FTP access only.Connection to 203.0.113.0 closed.
Esto confirma que el usuario ya no puede ssh
acceder al servidor y está limitado únicamente al acceso FTP.
Conclusión
En este tutorial, hemos explicado cómo configurar FTP para usuarios con una cuenta local. Si necesita utilizar una fuente de autenticación externa, es posible que desee consultar vsftpd
la compatibilidad de . 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.
Deja una respuesta