Cómo configurar vsftpd para el directorio de un usuario en Debian 10

Introducción

Índice
  1. Introducción
  • Prerrequisitos
  • Paso 1: Instalación de vsftpd
  • Paso 2: Apertura del firewall
  • Paso 3: preparación del directorio de usuarios
  • Paso 4: Configuración del acceso FTP
  • Paso 5: Prueba del acceso FTP
  • Paso 6: Asegurar las transacciones
  • Paso 7: Prueba de TLS con FileZilla
  • Paso 8: Deshabilitar el acceso al shell (opcional)
  • Conclusió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 scpFTP 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 sudoprivilegios. 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 vsftpddemonio:

    1. sudo apt update
    2. 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:

    1. 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:

    1. 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 20y 21para FTP, puerto 990para cuando habilitemos TLS y puertos 40000-50000para el rango de puertos pasivos que planeamos configurar en el archivo de configuración:

    1. sudo ufw allow 20/tcp
    2. sudo ufw allow 21/tcp
    3. sudo ufw allow 990/tcp
    4. sudo ufw allow 40000:50000/tcp

    Compruebe el estado del firewall:

    1. 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 vsftpdlos 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:

    1. sudo adduser sammy

    Asigna una contraseña cuando se te solicite. No dudes en seguir ENTERlas demás indicaciones.

    El FTP es generalmente más seguro cuando los usuarios están restringidos a un directorio específico. vsftpdEsto se logra con chrootjails. Cuando chrootestá habilitado para usuarios locales, están restringidos a su directorio de inicio de manera predeterminada. Sin embargo, debido a la forma en que vsftpdse 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 ftpdirectorio que sirva como directorio chrooty un directorio escribible filespara contener los archivos reales.

    Crea la ftpcarpeta:

    1. sudo mkdir /home/sammy/ftp

    Establecer su propiedad:

    1. sudo chown nobody:nogroup /home/sammy/ftp

    Eliminar permisos de escritura:

    1. sudo chmod a-w /home/sammy/ftp

    Verificar los permisos:

    1. 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:

    1. sudo mkdir /home/sammy/ftp/files
    2. sudo chown sammy:sammy /home/sammy/ftp/files

    Una verificación de permisos en el ftpdirectorio debería devolver lo siguiente:

    1. 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.txtarchivo para usar cuando hagamos pruebas:

    1. echo "vsftpd test file" | sudo tee /home/sammy/ftp/files/test.txt

    Ahora que hemos asegurado el ftpdirectorio y permitido al usuario acceder al filesdirectorio, 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:

    1. 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_enableconfiguración no esté comentada y esté establecida en YES:

    /etc/vsftpd.conf

    . . .write_enable=YES. . .

    También descomentaremos esto chrootpara 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_tokenpara insertar el nombre de usuario en nuestra local_root directoryruta, 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_denyalterna 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 -abandera para agregarlo al archivo:

    1. echo "sammy" | sudo tee -a /etc/vsftpd.userlist

    Comprueba que se agregó como esperabas:

    1. cat /etc/vsftpd.userlist
    Outputsammy

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

    1. 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.0con la dirección IP pública de su servidor y utilícelo anonymouscomo su nombre de usuario:

    1. 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:

    1. bye

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

    1. 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:

    1. bye

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

    1. 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 filesdirectorio y usemos el getcomando para transferir el archivo de prueba que creamos anteriormente a nuestra máquina local:

    1. cd files
    2. 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:

    1. 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:

    1. 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 opensslpara crear un nuevo certificado y utilizar el -daysindicador 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 -keyouty -outcon el mismo valor, la clave privada y el certificado se ubicarán en el mismo archivo:

    1. 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 Namecampo, 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 vsftpdnuevamente el archivo de configuración:

    1. 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_enablea 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:

    1. 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 filescarpeta y arrástrela upload.txthacia 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.txty 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 ftponlyen el bindirectorio:

    1. 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:

    1. sudo chmod a+x /bin/ftponly

    Abra la lista de shells válidos:

    1. sudo nano /etc/shells

    En la parte inferior añade:

    /etc/conchas

    . . ./bin/ftponly

    Actualice el shell del usuario con el siguiente comando:

    1. sudo usermod sammy -s /bin/ftponly

    Ahora intenta iniciar sesión en tu servidor como sammy :

    1. 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 sshacceder 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 vsftpdla 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.

    SUSCRÍBETE A NUESTRO BOLETÍN 
    No te pierdas de nuestro contenido ni de ninguna de nuestras guías para que puedas avanzar en los juegos que más te gustan.

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

    Subir

    Este sitio web utiliza cookies para mejorar tu experiencia mientras navegas por él. Este sitio web utiliza cookies para mejorar tu experiencia de usuario. Al continuar navegando, aceptas su uso. Mas informacion