En el ámbito de la administración de sistemas corporativos, la transferencia de archivos requiere un equilibrio entre seguridad, facilidad de gestión y rendimeinto. El uso de VSFTPD (Very Secure FTP Daemon) junto con usuarios virtuales y autenticación PAM (Pluggable Authentication Modules) permite crear un entorno robusto donde las credenciales de acceso no comprometen las cuentas reales del sistema operativo. Este enfoque es ideal para entornos modernos como openEuler, Rocky Linux, CentOS Stream y otras distribuciones basadas en RHEL.
Arquitectura del Servicio FTP Empresarial
La solución se basa en desacoplar la identidad del usuario del sistema de archivos mediante una base de datos de usuarios virtuales. Todos los accesos se mapean a una cuenta de sistema sin privilegios, pero cada usuario virtual es confinado a su propio directorio raíz (chroot) mediante políticas específicas.
[Cliente FTP] --> Puerto 21 (Control) + Puertos Pasivos (60000-61000)
|
[VSFTPD Daemon] --> Valida credenciales vía PAM (pam_userdb.so)
|
[Base de Datos Berkeley DB] --> Almacena pares usuario:contraseña
|
[Sistema de Archivos] --> Directorios aislados por departamento/área
Diseño del Script de Automatización
Para garantizar un despliegue consistente, el script debe gestionar la instalación de dependencias, la configuración de seguridad del kernel y la generación de la base de datos de credenciales. A continuación, se detallan los componentes lógicos clave refinados para una implementación profesional.
1. Definición de Usuarios y Estructura Organizativa
En lugar de gestionar archivos de texto planos dispersos, centralizamos la definición de cuentas y sus áreas correspondientes en matrices asociativas dentro de Bash.
# Definición de cuentas de acceso (Usuario:Clave)
declare -A ACCESOS_FTP=(
["sistemas_admin"]="Pass!2024"
["finanzas_01"]="Fin#Acc77"
["rrhh_gerencia"]="RRHH_Secure1"
["ventas_cl"]="Ventas.2025"
)
# Mapeo de usuarios a directorios específicos
declare -A MAPEO_DIRECTORIOS=(
["sistemas_admin"]="it_dept"
["finanzas_01"]="accounting"
["rrhh_gerencia"]="human_resources"
["ventas_cl"]="sales"
)
2. Gestión de la Base de Datos de Usuarios Virtuales
La seguridad de las credenciales se mejora convirtiendo el archivo de texto en un formato binario que PAM pueda consultar eficientemente utilizando db_load.
generar_db_usuarios() {
local TXT_TEMP="/etc/vsftpd/users_raw.txt"
local DB_DEST="/etc/vsftpd/virtual_access.db"
: > "$TXT_TEMP"
for usr in "${!ACCESOS_FTP[@]}"; do
echo "$usr" >> "$TXT_TEMP"
echo "${ACCESOS_FTP[$usr]}" >> "$TXT_TEMP"
done
# Conversión a Berkeley DB y protección de permisos
db_load -T -t hash -f "$TXT_TEMP" "$DB_DEST"
chmod 600 "$DB_DEST"
rm -f "$TXT_TEMP"
}
3. Configuración Dinámica de Privilegios por Usuario
Para lograr el aislamiento total, VSFTPD debe cargar una configuración personalizada para cada usuario que defina su local_root y sus permisos de escritura.
configurar_politicas_usuario() {
local POLICY_DIR="/etc/vsftpd/user_policies"
mkdir -p "$POLICY_DIR"
local FTP_BASE="/data/ftp_root"
for usr in "${!MAPEO_DIRECTORIOS[@]}"; do
local area="${MAPEO_DIRECTORIOS[$usr]}"
cat <<EOF > "$POLICY_DIR/$usr"
local_root=$FTP_BASE/$area
write_enable=YES
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
EOF
# Crear directorio físico si no existe
mkdir -p "$FTP_BASE/$area"
done
# Ajustar propiedad al usuario del sistema encargado del servicio
chown -R vftp_sys:vftp_sys "$FTP_BASE"
}
Parámetros Críticos de vsftpd.conf
El archivo de configuración principle debe ser ajustado para deshabilitar usuarios locales y habilitar el soporte de carga de perfiles virtuales.
| Parámetro | Valor Recomendado | Descripción |
|---|---|---|
anonymous_enable |
NO | Deshabilita el acceso sin contraseña. |
local_enable |
YES | Necesario para que los usuarios virtuales funcionen. |
guest_enable |
YES | Activa el modo de usuarios invitados (virtuales). |
guest_username |
vftp_sys | Usuario del sistema al que se mapean los virtuales. |
user_config_dir |
/etc/vsftpd/user_policies | Ruta de las configuraciones individuales. |
pasv_min_port |
60000 | Inicio del rango para modo pasivo. |
Consideraciones de Seguridad: Firewalld y SELinux
Un despliegue automatizado fallará si no se gestionan las capas de seguridad del sistema operativo. Es imperativo habilitar el tráfico FTP y ajustar los contextos de SELinux para permitir la lectura y escritura en los directorios compartidos.
# Configuración de Firewall
firewall-cmd --permanent --add-service=ftp
firewall-cmd --permanent --add-port=60000-61000/tcp
firewall-cmd --reload
# Ajustes de SELinux (si está habilitado)
setsebool -P ftpd_full_access on
semanage fcontext -a -t public_content_rw_t "/data/ftp_root(/.*)?"
restorecon -Rv /data/ftp_root
Verificación del Servicio
Tras la ejecución del despliegue, la validación se realiza comprobando el estado del socket y la capacidad de respuesta del demonio:
systemctl restart vsftpd
systemctl status vsftpd
ss -plnt | grep :21
Para probar el aislamiento, intente conectar con una cuenta de un área (ej. finanzas_01) y verifique que no sea posible navegar fuera de su directorio raíz (/data/ftp_root/accounting). Este nivel de compartimentación garantiza que los datos sensibles de diferentes departamentos permanezcan estrictamente privados.