Configuración segura de vsftpd para servidor FTP multiusuario con usuarios enjaulados en RHEL


Este proyecto tiene como objetivo diseñar, configurar y documentar un entorno FTP funcional y seguro sobre RHEL 9, aplicando buenas prácticas de administración de sistemas y seguridad.

A través de la instalación de vsftpd, la creación estructurada de usuarios y grupos, el control de accesos compartidos, la configuración de SELinux, del firewall, y la automatización mediante scripts, se construye un sistema FTP robusto y adaptable a entornos de pruebas, desarrollo o producción.

En esta práctica se han definido tres usuarios FTP con distintos perfiles de acceso. Uno de ellos dispone de acceso a la shell del sistema, pensado para tareas administrativas como la extracción o subida de archivos desde el propio servidor. Los otros dos usuarios, sin acceso a la shell (usuarios nologin), están limitados al uso de clientes FTP como FileZilla y comparten un mismo directorio de trabajo, simulando un entorno donde varios usuarios colaboran sobre un repositorio común sin privilegios sobre el sistema.

Esta práctica tiene la intención de aplicar y demostrar la mayoría de los casos comunes de gestión de usuarios FTP:

  • Usuarios administradores con acceso completo al sistema
  • Usuarios funcionales con acceso restringido vía FTP
  • Usuarios enjaulados (chrooted) para aislamiento y seguridad
  • Acceso compartido a directorios entre múltiples usuarios

Este proyecto refleja una práctica realista y controlada, sirviendo además como plantilla reutilizable en futuros despliegues o entornos similares.

📚 Índice

  1. 🎯 Objetivos
  2. 📁 Estructura del proyecto
  3. 🔧 Instalación y configuración del servicio FTP
  4. 👥 Gestión de usuarios y grupos
  5. 🔗 Enlaces simbólicos y estructura compartida
  6. 🔐 Configuración de SELinux y seguridad
  7. 🔥 Configuración de firewall
  8. 📸 Evidencias y pruebas de funcionamiento
  9. ⚙️ Automatización con script
  10. 🔒 Buenas prácticas aplicadas
  11. 🧠 Conocimientos y herramientas aplicadas

1. 🎯 Objetivos

  • Configurar un servidor FTP funcional usando vsftpd.
  • Crear y gestionar usuarios FTP con acceso privado y compartido, diferenciando entre usuarios con acceso de shell completo y usuarios restringidos exclusivamente al servicio FTP.
  • Aplicar configuración segura de SELinux y firewall para proteger el servicio.
  • Automatizar el alta de usuarios FTP mediante script reutilizable para facilitar la escalabilidad y mantenimiento.
  • Documentar cada paso del proceso como ejemplo práctico profesional para replicabilidad y aprendizaje.

2. 📁 Estructura del proyecto

/srv/
├── ftp/              → Directorio exclusivo para ftpuser
└── serverftp/        → Directorio compartido entre mariaftp y juanftp

/home/
├── ftpuser/ftp-link        → Montaje bind a /srv/ftp
├── mariaftp/server-link    → Montaje bind a /srv/serverftp
└── juanftp/server-link     → Montaje bind a /srv/serverftp

/opt/scripts/
├── crear_usuariosftp.sh
└── logs_scripts/
└── crear_usuariosftp_1530_20250724.txt

3. 🔧 Instalación y configuración del servicio FTP

Instalamos las dependencias vsfpd
sudo dnf install vsftpd -y

Instalamos la herramienta lftp para comprobar la funcionalidad de los usuarios
sudo dnf install lftp

Habilitamos el servicio de vsftpd
sudo systemctl enable –now vsftpd

Seguidamente crearemos una copia de seguridad del archivo de configuración vsftpd.conf y lo modificaremos

cp -p /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf_AAAAMMDD
vi /etc/vsftpd/vsftpd.conf

Para esta práctica se ha configurado el servicio FTP en RHEL 9 siguiendo principios de seguridad, trazabilidad y control de acceso, manteniendo la simplicidad operativa. A continuación se describe la finalidad de cada parámetro establecido en el archivo vsftpd.conf.

El servidor está configurado para escuchar en IPv4 (listen=YES) y no en IPv6 (listen_ipv6=NO), lo cual evita conflictos en entornos donde solo se requiere conectividad IPv4.

Se deshabilita el acceso anónimo (anonymous_enable=NO) para garantizar que solo usuarios autenticados puedan acceder al servicio. La opción local_enable=YES permite a los usuarios locales iniciar sesión vía FTP, alineándose con el objetivo de administrar usuarios gestionados desde el sistema.

Se habilita la escritura (write_enable=YES) para permitir a los usuarios subir y modificar archivos según los permisos asignados. Para reforzar la seguridad, cada usuario queda confinado en su directorio personal (chroot_local_user=YES), y allow_writeable_chroot=YES permite que dicho directorio sea también escribible, una necesidad habitual cuando el directorio raíz del FTP coincide con el home del usuario.

La trazabilidad de acciones está asegurada activando el registro de operaciones (xferlog_enable=YES, log_ftp_protocol=YES) y especificando el archivo de log en /var/log/vsftpd.log. Esto permite auditar todas las transferencias realizadas por los usuarios.

El parámetro local_umask=022 define los permisos por defecto para nuevos archivos y directorios, aplicando una configuración estándar que otorga permisos de lectura global y evita escrituras no deseadas.

Se utiliza la hora local del sistema para los logs (use_localtime=YES), facilitando el análisis temporal de eventos y mejorando la coherencia con el resto de servicios del sistema.

Finalmente, se ha desactivado el modo pasivo (pasv_enable=NO) para utilizar únicamente el puerto estándar FTP (21). Esto simplifica la configuración del cortafuegos y evita la apertura de rangos adicionales de puertos, lo que es especialmente útil en entornos controlados o de laboratorio.

Esta configuración está diseñada para cumplir con buenas prácticas de administración de servicios en Linux, garantizando un entorno seguro, auditado y funcional, con una estructura fácilmente replicable en entornos de producción o formación técnica.

Resumen de la confirmación necesaria en /etc/vsftpd/vsftpd.conf

  • listen=YES (solo IPv4)
  • anonymous_enable=NO (sin acceso anónimo)
  • local_enable=YES y write_enable=YES
  • Usuarios enjaulados en su home (chroot_local_user=YES)
  • Logs detallados activados (xferlog_enable=YES, log_ftp_protocol=YES)
  • Uso de hora local en logs (use_localtime=YES)
  • Desactivado modo pasivo (pasv_enable=NO) para simplificar firewall

vi /etc/vsftpd/vsftpd.conf


listen=YES
listen_ipv6=NO

anonymous_enable=NO
local_enable=YES
write_enable=YES
chroot_local_user=YES
allow_writeable_chroot=YES
xferlog_enable=YES
log_ftp_protocol=YES
xferlog_file=/var/log/vsftpd.log
local_umask=022
use_localtime=YES
pasv_enable=NO

Una vez declarados procedemos al reincio del servicio para aplicar los cambios.
systemctl restart vsftpd

4. 👥 Gestión de usuarios y grupos

En este ejercicio existen 2 grupos de usuarios, los que podrán acceder a shell enfocado mas para administradores “nombraremos ftpuser a este grupo” y los nologin (grupoftp) para los funcionales.

Creamos los dos grupos para asignar a los usuarios
groupadd ftpuser
groupadd grupoftp

Creamos el directorio donde van a compartir y se almacenara el contenido del ftp, en este caso crearemos un directorio a la raiz /srv/ y añadiremos dos subdirectorios, uno para cada grupo, utilizaremos el directorio ftp para el grupo ftpuser y serverftp para el grupoftp

Creamos los directorios
mkdir -p /srv/ftp
mkdir -p /srv/serverftp

Otorgamos el grupo y los permisos a los directorios
chown ftpuser:ftpuser /srv/ftp
chown root:grupoftp /srv/serverftp
chmod 770 -R /srv/

Seguidamente vamos a crear los usuarios, el usuario ftpuser podrá conectarse dentro del servidor, en cambio los usuarios mariaftp y juanftp no podrán loguearse al servidor, pudiendo solo interactuar con el sistema mediante clientes ftp como filezilla.

Creamos los usuarios
useradd -m -s /bin/bash -G ftpuser ftpuser
useradd -m -s /usr/sbin/nologin -G grupoftp mariaftp
useradd -m -s /usr/sbin/nologin -G grupoftp juanftp

Asignamos la contraseña “para este ejercicio usaremos la misma contraseña para simplificar las pruebas”
echo “ftpuser:rhelPWDlab2025” | chpasswd
echo “mariaftp:rhelPWDlab2025” | chpasswd
echo “juanftp:rhelPWDlab2025” | chpasswd

En este entorno, dos de los usuarios configurados (maria y juan) han sido definidos con el shell no interactivo /usr/sbin/nologin. Esta configuración se adopta como medida de seguridad para impedir que dichos usuarios puedan iniciar sesión en la terminal del sistema, restringiendo su uso exclusivamente al acceso vía FTP.

Sin embargo, algunos servicios, como vsftpd, validan si el shell asignado a un usuario existe dentro del archivo /etc/shells. Si no está listado, el acceso FTP puede ser denegado, incluso si las credenciales son correctas.

Para garantizar que mariaftp y juanftp puedan autenticarse correctamente mediante clientes FTP como FileZilla, es necesario declarar el shell /usr/sbin/nologin como válido en el sistema, añadiéndolo con el siguiente comando:

echo “/usr/sbin/nologin” >> /etc/shells

5. 🔗 Montajes bind y estructura compartida

Para mantener una estructura organizada y facilitar el acceso a los recursos FTP asignados, hay que crear montajes bind dentro del directorio personal de cada usuario. Estos montajes hacen que los directorios reales ubicados en /srv estén accesibles desde el entorno personal de cada usuario como carpetas reales, permitiendo una navegación fluida y segura sin comprometer la jerarquía ni la seguridad del sistema.

Creamos el directorio  en las carpetas home de los nuevos usuarios
mkdir /home/ftpuser/ftp-link
mkdir /home/mariaftp/server-link
mkdir /home/juanftp/server-link

Damos los permisos y asignamos usuario y grupo a los nuevos directorios
chown ftpuser:ftpuser /home/ftpuser/ftp-link
chown mariaftp:grupoftp /home/mariaftp/server-link
chown juanftp:grupoftp /home/juanftp/server-link
chmod 755  /home/ftpuser/ftp-link
chmod 755  /home/mariaftp/server-link
chmod 755  /home/juanftp/server-link

Ahora que ya tenemos la estructura básica solo hace falta unir los directorios creados dentro del home de los usuarios con el directorio preparado para el almacenamiento ftp, para ello usaremos la opción bind de mount

Los comandos para realizar las uniones son:
mount –bind /srv/ftp /home/ftpuser/ftp-link
mount –bind /srv/serverftp /home/mariaftp/server-link
mount –bind /srv/serverftp /home/juanftp/server-link

Esto unira los directorios hasta que el servidor se reinicie o se desmonten manualmente. Por lo general estos usuarios pueden tener un uso prolongado y puede que por incidentes, o la necesidad de mantenimiento del servidor este se apague o reinicie. Por eso, para que estos montajes se mantengan tras reinicios o recargas del sistema se deben definir en el archivo /etc/fstab de la siguiente forma:

Creamos una copia de seguridad
cp -p /etc/fstab /etc/fstab_AAAADDMM

vi /etc/fstab


#Creamos 3 montajes para usuarios ftp 20250723
/srv/ftp      /home/ftpuser/ftp-link      none    bind    0 0
/srv/serverftp /home/mariaftp/server-link none    bind    0 0
/srv/serverftp /home/juanftp/server-link  none    bind    0 0

Una vez declarados podemos ejecutar mount -a para recargar todos los montajes en /etc/fstab.

Esta configuración permite que los usuarios puedan acceder desde sus directorios personales a los recursos FTP compartidos como si fueran carpetas reales, mejorando la compatibilidad con clientes FTP gráficos como FileZilla. Esto evita los problemas comunes de los enlaces simbólicos, que en algunos clientes se interpretan como archivos para descargar en vez de carpetas para navegar.

Gracias a la configuración activa en /etc/vsftpd/vsftpd.conf:

chroot_local_user=YES
allow_writeable_chroot=YES

los usuarios están enjaulados (chrooted) en sus respectivos directorios personales, limitando su acceso exclusivamente a su entorno asignado. Esta medida proporciona un aislamiento efectivo y seguro, y el uso de montajes bind garantiza que el confinamiento no se rompe, manteniendo la integridad y seguridad del sistema.

Esta estrategia ofrece un equilibrio óptimo entre seguridad, organización y usabilidad, cumpliendo con las mejores prácticas para la administración de servicios FTP multiusuario en entornos Linux.

6. 🔐 Configuración de SELinux y seguridad

Para asegurar la compatibilidad del servicio FTP con las políticas de seguridad reforzadas de SELinux, se han aplicado ajustes específicos que permiten el acceso de vsftpd tanto a los directorios del sistema como a los directorios personales de los usuarios.

Damos permisos de lectura y escritura a vsftpd en /srv/
chcon -R -t public_content_rw_t /srv/

Con estos cambios, se garantiza que el servicio FTP pueda operar correctamente en entornos SELinux en modo enforcing, sin comprometer el aislamiento ni la seguridad del sistema. Esta configuración es esencial cuando se implementa un modelo de usuarios enjaulados con enlaces simbólicos fuera del home, como en este caso con /srv/.

7. 🔥 Configuración de firewall

Para asegurar que las conexiones al servicio FTP sean posibles desde redes externas, se ha habilitado explícitamente el servicio FTP en el firewall mediante firewalld.

sudo firewall-cmd –permanent –add-service=ftp
sudo firewall-cmd –reload

Esta configuración permite el tráfico en el puerto estándar 21/TCP utilizado por FTP. Al tratarse de un entorno de red controlado y el uso del modo pasivo ha sido deshabilitado, no es necesario abrir puertos adicionales, simplificando la gestión de seguridad.

Con todos estos pasos realizados ya están listos nuestros usuarios enjaulados!

8. 📸 Evidencias y pruebas de funcionamiento

En este apartado se incluyen capturas de pantalla tomadas directamente desde la terminal y clientes FTP gráficos como FileZilla, que muestran la correcta conexión y transferencia de archivos por parte de los usuarios configurados. Estas evidencias verifican el éxito de la configuración y el correcto funcionamiento del servidor FTP, tanto para usuarios con acceso de shell como para usuarios enjaulados con acceso exclusivo FTP.

Podemos probar el acceso desde el propio servidor usando lftp,
lftp -u usuario,pwd localhost

En la siguiente imagen podemos observar como el usuario ftpuser tiene acceso por ftp y esta enjaulado en su home con acceso a ftp-link que esta unida a /srv/ftp

También comprobamos que desde el directorio server-link creado dentro del home de juanftp y mariaftp accedemos a /srv/serverftp

Nos conectamos con filezilla con el usuario mariaftp y juanftp al servidor y probamos de descargar y subir archivos correctamente

También realizamos una conexión desde el servidor al ftp de mariaftp y juanftp, los dos están enjaulados y comparten visibilidad del mismo contenido

Por último, probamos de hacer login al servidor como un usuario mas dentro de la shell, evidenciando que tanto juanftp y mariaftp no pueden conectarse pero ftpuser si.

9. ⚙️ Automatización con script

A partir de los comandos usados anteriormente he creado un script para el proceso de creacion de usuarios siguiendo este ejemplo.

Puedes ver y descargar el script pulsando en este enlace

Ahora que el sistema esta preparado, con este script con solo 3 pasos podemos crear nuevos usuarios funcionales, además almacenamos un log para tener el seguimiento y evidencia de la creación de usuarios.

10. 🔒 Buenas prácticas aplicadas

Durante el desarrollo de esta configuración se han aplicado principios de seguridad y administración recomendados para entornos productivos, siguiendo un enfoque riguroso de hardening para minimizar riesgos y fortalecer la seguridad del servidor FTP. Entre las medidas implementadas destacan:

  • 🚫 FTP anónimo deshabilitado, evitando accesos no autenticados al sistema.
  • 🛑 Shell bloqueada para los usuarios FTP (/sbin/nologin), impidiendo el acceso interactivo al sistema.
  • 📁 Directorios diferenciados para cada usuario y permisos mínimos necesarios, garantizando aislamiento y control de acceso.
  • 🔐 SELinux configurado correctamente para permitir el funcionamiento del servicio sin desactivar sus políticas de seguridad.
  • 🔌 Modo activo de FTP habilitado, evitando la necesidad de exponer múltiples puertos pasivos en el firewall.
  • 🛡️ Configuración cuidadosa del firewall con apertura mínima de puertos necesarios.
  • 🕵️ Registro y auditoría detallada de las transferencias y accesos para facilitar el monitoreo y diagnóstico.
  • 🤖 Automatización mediante script, que reduce errores humanos y facilita la escalabilidad y replicabilidad del entorno.

Estas prácticas refuerzan la seguridad, el orden y la mantenibilidad del entorno, alineándose con estándares profesionales de administración de sistemas y políticas de hardening.

11. 🧠 Conocimientos y herramientas aplicadas

Este proyecto demuestra dominio práctico de herramientas y conceptos clave en la gestión de servidores Linux orientados a servicios FTP multiusuario. Se han aplicado conocimientos en:

  • 👥 Administración de usuarios y grupos: creación estructurada con control de acceso personalizado.
  • ⚙️ Configuración avanzada de vsftpd: adaptando el servicio a requisitos de seguridad y enjaulamiento.
  • 🔗 Gestión de permisos y enlaces simbólicos: estructurando el acceso compartido sin romper el aislamiento.
  • 🔐 Seguridad con SELinux y firewall-cmd: configuraciones específicas que refuerzan el control sin deshabilitar protecciones.
  • 📝 Scripting Bash: para automatizar la creación y configuración de usuarios FTP.
  • 🕵️ Análisis de logs en /var/log/vsftpd.log y con journalctl, facilitando el diagnóstico y la trazabilidad de accesos.
Configuración segura de vsftpd para servidor FTP multiusuario con usuarios enjaulados en RHEL

Post navigation