Recoger registros de SFTP de VanDyke VShell

Disponible en:

En este documento se explica cómo ingerir registros SFTP de VanDyke VShell en Google Security Operations mediante Bindplane con Syslog o Amazon S3 con un remitente de registros. El analizador transforma los registros sin procesar en un formato UDM estructurado. Gestiona los formatos JSON y SYSLOG, extrae los campos relevantes, como las direcciones IP, los puertos y los detalles de los eventos, y enriquece los datos con información contextual, como los detalles de la plataforma y la gravedad de la seguridad.

Antes de empezar

Asegúrate de que cumples los siguientes requisitos previos:

  • Una instancia de Google SecOps
  • Acceso con privilegios al servidor o a la consola de gestión de VanDyke VShell
  • Opción 1: un host Windows 2016 o posterior, o Linux con systemd para el agente Bindplane
  • Opción 2: cuenta de AWS con acceso a S3 y NXLog o Fluent Bit en el servidor VShell

Opción 1: Integración mediante Bindplane y Syslog

Esta opción proporciona un flujo de registros en tiempo real con una latencia mínima y se recomienda para la mayoría de las implementaciones.

  1. Inicia sesión en la consola de Google SecOps.
  2. Ve a Configuración de SIEM > Agentes de recogida.
  3. Descarga el archivo de autenticación de ingestión. Guarda el archivo de forma segura en el sistema en el que se instalará Bindplane o en el que configurarás el feed.

Obtener el ID de cliente de Google SecOps

  1. Inicia sesión en la consola de Google SecOps.
  2. Ve a Configuración de SIEM > Perfil.
  3. Copia y guarda el ID de cliente de la sección Detalles de la organización.

Instalar el agente de Bindplane

Instala el agente Bindplane en tu sistema operativo Windows o Linux siguiendo las instrucciones que se indican a continuación.

Instalación de ventanas

  1. Abre la petición de comando o PowerShell como administrador.
  2. Ejecuta el siguiente comando:

    msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
    

Instalación de Linux

  1. Abre un terminal con privilegios de root o sudo.
  2. Ejecuta el siguiente comando:

    sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
    

Recursos de instalación adicionales

Configurar el agente de Bindplane para ingerir Syslog y enviarlo a Google SecOps

  1. Accede al archivo de configuración:

    1. Busca el archivo config.yaml. Normalmente, se encuentra en el directorio /etc/bindplane-agent/ en Linux o en el directorio de instalación en Windows.
    2. Abre el archivo con un editor de texto (por ejemplo, nano, vi o Bloc de notas).
  2. Edita el archivo config.yaml de la siguiente manera:

    receivers:
      udplog:
        # Replace the port and IP address as required
        listen_address: "0.0.0.0:514"
    
    exporters:
      chronicle/chronicle_w_labels:
        compression: gzip
        # Adjust the path to the credentials file you downloaded in Step 1
        creds_file_path: '/path/to/ingestion-authentication-file.json'
        # Replace with your actual customer ID from Step 2
        customer_id: YOUR_CUSTOMER_ID
        endpoint: malachiteingestion-pa.googleapis.com
        # Custom log type - requires parser extension
        log_type: 'VANDYKE_SFTP'
        raw_log_field: body
        ingestion_labels:
    
    service:
      pipelines:
        logs/source0__chronicle_w_labels-0:
          receivers:
            - udplog
          exporters:
            - chronicle/chronicle_w_labels
    
    • Sustituye el puerto y la dirección IP según sea necesario en tu infraestructura.
    • Sustituye <customer_id> por el ID de cliente real.
    • Actualiza /path/to/ingestion-authentication-file.json a la ruta donde se guardó el archivo de autenticación en la sección Obtener el archivo de autenticación de ingestión de Google SecOps.
    • Si quieres usar TCP en lugar de UDP, sustituye udplog por tcplog.

Reinicia el agente de Bindplane para aplicar los cambios

  • Para reiniciar el agente de Bindplane en Linux, ejecuta el siguiente comando:

    sudo systemctl restart bindplane-agent
    
  • Para reiniciar el agente de Bindplane en Windows, puedes usar la consola Servicios o introducir el siguiente comando:

    net stop BindPlaneAgent && net start BindPlaneAgent
    

Configurar el reenvío de Syslog en VanDyke VShell

Para VShell en Windows

  1. Inicia sesión en el panel de control de VShell.
  2. Ve a la configuración de registro.
  3. Configurar el registro de syslog remoto:
    • Habilita el registro en el servidor syslog remoto.
    • Dirección del servidor: introduce la dirección IP del agente de Bindplane.
    • Puerto: introduce 514 (o el puerto que hayas configurado).
    • Protocolo: selecciona UDP (o TCP si está configurado).
    • Grupos de mensajes: selecciona Conexión, Autenticación, SFTP, FTPS, HTTPS, Errores, Advertencias e Información.
  4. Haz clic en Aplicar > Aceptar.

Para VShell en Linux o macOS

  1. Edita el archivo vshelld_config (normalmente /etc/vshell/vshelld_config).
  2. Configure los siguientes parámetros:

    SyslogFacility LOG_LOCAL3
    LogLevel INFO
    
  3. Configura el syslog de tu sistema para que reenvíe LOG_LOCAL3 al agente de Bindplane:

    • Edita /etc/rsyslog.conf o /etc/syslog-ng/syslog-ng.conf.
    • Añade local3.* @bindplane-agent-ip:514 (para UDP) o local3.* @@bindplane-agent-ip:514 (para TCP).
  4. Reinicia el servicio VShell y el servicio syslog:

    sudo systemctl restart vshelld
    sudo systemctl restart rsyslog
    

Opción 2: Integración a través de AWS S3

Esta opción es útil en entornos que requieren archivar registros o en los que no es posible reenviar syslog directamente. Ten en cuenta que esto requiere un remitente de registros en el servidor VShell, ya que AWS Lambda no puede acceder a los archivos locales.

Configurar un segmento de AWS S3 y IAM para Google SecOps

  1. Crea un segmento de Amazon S3 siguiendo esta guía de usuario: Crear un segmento.
  2. Guarda el nombre y la región del segmento para consultarlos más adelante (por ejemplo, vandyke-sftp-logs).
  3. Crea un usuario siguiendo esta guía: Crear un usuario de gestión de identidades y accesos.
  4. Selecciona el usuario creado.
  5. Selecciona la pestaña Credenciales de seguridad.
  6. En la sección Claves de acceso, haz clic en Crear clave de acceso.
  7. Selecciona Servicio de terceros en Caso práctico.
  8. Haz clic en Siguiente.
  9. Opcional: añade una etiqueta de descripción.
  10. Haz clic en Crear clave de acceso.
  11. Haz clic en Descargar archivo CSV para guardar la clave de acceso y la clave de acceso secreta para futuras consultas.
  12. Haz clic en Listo.
  13. Selecciona la pestaña Permisos.
  14. En la sección Políticas de permisos, haz clic en Añadir permisos.
  15. Selecciona Añadir permisos.
  16. Seleccione Adjuntar políticas directamente.
  17. Busca la política AmazonS3FullAccess.
  18. Selecciona la política.
  19. Haz clic en Siguiente.
  20. Haz clic en Añadir permisos.

Instalar y configurar Log Shipper en el servidor VShell

Elige una de las siguientes opciones en función de tu sistema operativo:

Opción A: Usar NXLog (Windows)

  1. Descarga e instala NXLog Community Edition desde nxlog.co.
  2. Editar C:\Program Files\nxlog\conf\nxlog.conf:

    <Extension json>
        Module      xm_json
    </Extension>
    
    <Extension syslog>
        Module      xm_syslog
    </Extension>
    
    <Input vshell_log>
        Module      im_file
        File        "C:\\Program Files\\VanDyke Software\\VShell\\Log\\VShell.log"
        SavePos     TRUE
    
        <Exec>
            # Parse VShell log format
            if $raw_event =~ /^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) "(.*)"$/
            {
                $EventTime = $1;
                $Protocol = $2;
                $EventType = $3;
                $SessionID = $4;
                $ClientIP = $5;
                $ClientPort = $6;
                $Username = $7;
                $Filename = $9;
                $BytesDown = $10;
                $BytesUp = $11;
                $ServerIP = $14;
                $ServerPort = $15;
                $EventMessage = $16;
    
                # Convert to JSON
                to_json();
            }
        </Exec>
    </Input>
    
    <Output s3>
        Module      om_exec
        Command     C:\scripts\upload_to_s3.ps1
        Args        %FILEPATH%
    </Output>
    
    <Route vshell_to_s3>
        Path        vshell_log => s3
    </Route>
    
  3. Crea una secuencia de comandos de PowerShell C:\scripts\upload_to_s3.ps1:

    param([string]$FilePath)
    
    $bucket = "vandyke-sftp-logs"
    $key = "vshell/$(Get-Date -Format 'yyyy/MM/dd/HH')/$(Get-Date -Format 'yyyyMMddHHmmss').json"
    
    # Batch logs
    $logs = Get-Content $FilePath | ConvertFrom-Json
    $jsonLines = $logs | ForEach-Object { $_ | ConvertTo-Json -Compress }
    $content = $jsonLines -join "`n"
    
    # Upload to S3
    Write-S3Object -BucketName $bucket -Key $key -Content $content -ProfileName default
    
  4. Crea un perfil de credenciales de AWS:

    Set-AWSCredential -AccessKey YOUR_ACCESS_KEY -SecretKey YOUR_SECRET_KEY -StoreAs default
    
    1. Programa la secuencia de comandos de PowerShell para que se ejecute cada 5 minutos con el Programador de tareas.

Opción B: Usar Fluent Bit (Linux)

  1. Instala Fluent Bit:

    curl https://raw.githubusercontent.com/fluent/fluent-bit/master/install.sh | sh
    
  2. Configura /etc/fluent-bit/fluent-bit.conf:

    [SERVICE]
        Flush        5
        Daemon       On
        Log_Level    info
    
    [INPUT]
        Name              tail
        Path              /var/log/vshell/vshell.log
        Parser            vshell_parser
        Tag               vshell.*
        Refresh_Interval  5
        Mem_Buf_Limit     10MB
    
    [PARSER]
        Name        vshell_parser
        Format      regex
        Regex       ^(?<timestamp>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) (?<protocol>\S+) (?<event_type>\S+) (?<session_id>\S+) (?<client_ip>\S+) (?<client_port>\S+) (?<username>\S+) (?<dash>\S+) (?<filename>\S+) (?<bytes_down>\S+) (?<bytes_up>\S+) (?<field1>\S+) (?<field2>\S+) (?<server_ip>\S+) (?<server_port>\S+) "(?<event_message>[^"]*)"
    
    [OUTPUT]
        Name                  s3
        Match                 vshell.*
        bucket                vandyke-sftp-logs
        region                us-east-1
        use_put_object        On
        total_file_size       5M
        upload_timeout        10s
        compression           gzip
        s3_key_format         /vshell/%Y/%m/%d/%H/%{hostname}_%{uuid}.json.gz
    
  3. Configura las credenciales de AWS:

    export AWS_ACCESS_KEY_ID=YOUR_ACCESS_KEY
    export AWS_SECRET_ACCESS_KEY=YOUR_SECRET_KEY
    
  4. Iniciar Fluent Bit:

    sudo systemctl enable fluent-bit
    sudo systemctl start fluent-bit
    

Configurar un feed en Google SecOps para ingerir registros de VanDyke VShell

  1. Ve a Configuración de SIEM > Feeds.
  2. Haz clic en Añadir feed.
  3. En el campo Nombre del feed, introduce un nombre para el feed (por ejemplo, VanDyke VShell SFTP logs).
  4. Selecciona Amazon S3 V2 como Tipo de fuente.
  5. Seleccione VanDyke SFTP como Tipo de registro (personalizado).
  6. Haz clic en Siguiente.
  7. Especifique valores para los siguientes parámetros de entrada:
    • URI de S3: s3://vandyke-sftp-logs/vshell/
    • Opciones de eliminación de la fuente: selecciona Conservar (opción recomendada) o la opción de eliminación que prefieras.
    • Antigüedad máxima del archivo: incluye los archivos modificados en los últimos días. El valor predeterminado es de 180 días.
    • ID de clave de acceso: clave de acceso de usuario con acceso al bucket de S3.
    • Clave de acceso secreta: clave secreta del usuario con acceso al segmento de S3.
    • Espacio de nombres de recursos: el espacio de nombres de recursos.
    • Etiquetas de ingestión: la etiqueta aplicada a los eventos de este feed.
  8. Haz clic en Siguiente.
  9. Revise la nueva configuración del feed en la pantalla Finalizar y, a continuación, haga clic en Enviar.

Tabla de asignación de UDM

Campo de registro Asignación de UDM Lógica
agent.id read_only_udm.observer.asset_id Concatena "filebeat:" con el valor del campo agent.id.
agent.type read_only_udm.observer.application Asigna directamente el valor del campo agent.type.
agent.version read_only_udm.observer.platform_version Asigna directamente el valor del campo agent.version.
ecs.version read_only_udm.metadata.product_version Asigna directamente el valor del campo ecs.version.
host.architecture read_only_udm.target.asset.hardware.cpu_platform Asigna directamente el valor del campo host.architecture.
host.hostname read_only_udm.target.hostname Asigna directamente el valor del campo host.hostname.
host.id read_only_udm.principal.asset_id Concatena "VANDYKE_SFTP:" con el valor del campo host.id.
host.ip read_only_udm.target.ip Asigna directamente cada dirección IP de la matriz host.ip a un campo read_only_udm.target.ip independiente.
host.mac read_only_udm.target.mac Asigna directamente cada dirección MAC de la matriz host.mac a un campo read_only_udm.target.mac independiente.
host.os.kernel read_only_udm.target.platform_patch_level Asigna directamente el valor del campo host.os.kernel.
host.os.platform read_only_udm.target.platform Asigna el valor de host.os.platform a WINDOWS, LINUX, MAC o UNKNOWN_PLATFORM en función del valor.
host.os.version read_only_udm.target.platform_version Asigna directamente el valor del campo host.os.version.
log.file.path read_only_udm.principal.process.file.full_path Asigna directamente el valor del campo log.file.path.
logstash.collect.timestamp read_only_udm.metadata.collected_timestamp Analiza la marca de tiempo del campo logstash.collect.timestamp y la convierte en un objeto de marca de tiempo.
logstash.irm_environment read_only_udm.additional.fields.value.string_value Asigna directamente el valor del campo logstash.irm_environment. La clave se ha definido como "irm_environment".
logstash.irm_region read_only_udm.additional.fields.value.string_value Asigna directamente el valor del campo logstash.irm_region. La clave es "irm_region".
logstash.irm_site read_only_udm.additional.fields.value.string_value Asigna directamente el valor del campo logstash.irm_site. La clave es "irm_site".
logstash.process.host read_only_udm.observer.hostname Asigna directamente el valor del campo logstash.process.host.
mensaje Se usa para extraer varios campos mediante patrones grok y expresiones regulares.
read_only_udm.metadata.event_type Definir como "NETWORK_FTP"
read_only_udm.metadata.log_type Se ha definido como "VANDYKE_SFTP".
read_only_udm.metadata.product_event_type Extraído del campo de mensaje mediante un patrón grok
read_only_udm.metadata.product_name Se ha definido como "VANDYKE_SFTP".
read_only_udm.metadata.vendor_name Se ha definido como "VANDYKE SOFTWARE"
read_only_udm.network.application_protocol Asigna el valor "SSH" si el campo de descripción contiene "SSH2" o "SSH". De lo contrario, asigna el valor "HTTP" si el campo de método coincide con los métodos HTTP.
read_only_udm.network.http.method Se extrae del campo de mensaje mediante un patrón grok, solo si coincide con métodos HTTP comunes.
read_only_udm.network.http.referral_url Extraído del campo de mensaje mediante un patrón grok
read_only_udm.network.http.response_code Se extrae del campo de mensaje mediante un patrón grok y se convierte en un número entero.
read_only_udm.network.ip_protocol Se define como "TCP" si el campo de descripción contiene "TCP"
read_only_udm.principal.ip Extraído del campo de mensaje mediante un patrón grok
read_only_udm.principal.port Se extrae del campo de mensaje mediante un patrón grok y se convierte en un número entero.
read_only_udm.security_result.description Extraído del campo de mensaje mediante un patrón grok
read_only_udm.security_result.severity Se asigna el valor "HIGH" si syslog_severity es "error" o "warning", "MEDIUM" si es "notice" y "LOW" si es "information" o "info".
read_only_udm.security_result.severity_details Asigna directamente el valor del campo syslog_severity.
read_only_udm.target.ip Extraído del campo de mensaje mediante un patrón grok
read_only_udm.target.port Se extrae del campo de mensaje mediante un patrón grok y se convierte en un número entero.
read_only_udm.target.process.pid Extraído del campo de mensaje mediante un patrón grok
syslog_severity Se usa para determinar la gravedad de security_result.

¿Necesitas más ayuda? Recibe respuestas de los miembros de la comunidad y de los profesionales de Google SecOps.