Despliegue automatizado de VSFTPD para entornos empresariales con usuarios virtuales y aislamiento de directorios

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.

Etiquetas: vsftpd ftp-server pam-authentication rhel bash-automation

Publicado el 7-12 06:23