Recoger registros de SFTP de VanDyke VShell
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
systemdpara 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.
- Inicia sesión en la consola de Google SecOps.
- Ve a Configuración de SIEM > Agentes de recogida.
- 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
- Inicia sesión en la consola de Google SecOps.
- Ve a Configuración de SIEM > Perfil.
- 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
- Abre la petición de comando o PowerShell como administrador.
Ejecuta el siguiente comando:
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
Instalación de Linux
- Abre un terminal con privilegios de root o sudo.
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
- Para ver otras opciones de instalación, consulta esta guía de instalación.
Configurar el agente de Bindplane para ingerir Syslog y enviarlo a Google SecOps
Accede al archivo de configuración:
- 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. - Abre el archivo con un editor de texto (por ejemplo,
nano,vio Bloc de notas).
- Busca el archivo
Edita el archivo
config.yamlde 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.jsona 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
udplogportcplog.
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-agentPara 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
- Inicia sesión en el panel de control de VShell.
- Ve a la configuración de registro.
- 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.
- Haz clic en Aplicar > Aceptar.
Para VShell en Linux o macOS
- Edita el archivo vshelld_config (normalmente
/etc/vshell/vshelld_config). Configure los siguientes parámetros:
SyslogFacility LOG_LOCAL3 LogLevel INFOConfigura el syslog de tu sistema para que reenvíe LOG_LOCAL3 al agente de Bindplane:
- Edita
/etc/rsyslog.confo/etc/syslog-ng/syslog-ng.conf. - Añade
local3.* @bindplane-agent-ip:514(para UDP) olocal3.* @@bindplane-agent-ip:514(para TCP).
- Edita
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
- Crea un segmento de Amazon S3 siguiendo esta guía de usuario: Crear un segmento.
- Guarda el nombre y la región del segmento para consultarlos más adelante (por ejemplo,
vandyke-sftp-logs). - Crea un usuario siguiendo esta guía: Crear un usuario de gestión de identidades y accesos.
- Selecciona el usuario creado.
- Selecciona la pestaña Credenciales de seguridad.
- En la sección Claves de acceso, haz clic en Crear clave de acceso.
- Selecciona Servicio de terceros en Caso práctico.
- Haz clic en Siguiente.
- Opcional: añade una etiqueta de descripción.
- Haz clic en Crear clave de acceso.
- Haz clic en Descargar archivo CSV para guardar la clave de acceso y la clave de acceso secreta para futuras consultas.
- Haz clic en Listo.
- Selecciona la pestaña Permisos.
- En la sección Políticas de permisos, haz clic en Añadir permisos.
- Selecciona Añadir permisos.
- Seleccione Adjuntar políticas directamente.
- Busca la política AmazonS3FullAccess.
- Selecciona la política.
- Haz clic en Siguiente.
- 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)
- Descarga e instala NXLog Community Edition desde nxlog.co.
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>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 defaultCrea un perfil de credenciales de AWS:
Set-AWSCredential -AccessKey YOUR_ACCESS_KEY -SecretKey YOUR_SECRET_KEY -StoreAs default- 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)
Instala Fluent Bit:
curl https://raw.githubusercontent.com/fluent/fluent-bit/master/install.sh | shConfigura
/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.gzConfigura las credenciales de AWS:
export AWS_ACCESS_KEY_ID=YOUR_ACCESS_KEY export AWS_SECRET_ACCESS_KEY=YOUR_SECRET_KEYIniciar Fluent Bit:
sudo systemctl enable fluent-bit sudo systemctl start fluent-bit
Configurar un feed en Google SecOps para ingerir registros de VanDyke VShell
- Ve a Configuración de SIEM > Feeds.
- Haz clic en Añadir feed.
- En el campo Nombre del feed, introduce un nombre para el feed (por ejemplo,
VanDyke VShell SFTP logs). - Selecciona Amazon S3 V2 como Tipo de fuente.
- Seleccione VanDyke SFTP como Tipo de registro (personalizado).
- Haz clic en Siguiente.
- 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.
- URI de S3:
- Haz clic en Siguiente.
- 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.