Recopila registros de Fortinet FortiWeb
En este documento, se explica cómo transferir registros de Fortinet FortiWeb a Google Security Operations con Bindplane.
El analizador extrae campos de los registros con formato KV de Fortinet FortiWeb. Utiliza grok o kv para analizar el mensaje de registro y, luego, asigna estos valores al Modelo de datos unificados (UDM). También establece valores de metadatos predeterminados para el origen y el tipo del evento.
Antes de comenzar
Asegúrate de cumplir con los siguientes requisitos previos:
- Una instancia de Google SecOps
- Windows Server 2016 o versiones posteriores, o host de Linux con
systemd - Si se ejecuta detrás de un proxy, asegúrate de que los puertos de firewall estén abiertos según los requisitos del agente de Bindplane.
- Acceso privilegiado a la interfaz web de Fortinet FortiWeb
Obtén el archivo de autenticación de transferencia de Google SecOps
- Accede a la consola de Google SecOps.
- Ve a Configuración de SIEM > Agentes de recopilación.
- Descarga el archivo de autenticación de transferencia. Guarda el archivo de forma segura en el sistema en el que se instalará BindPlane.
Obtén el ID de cliente de Google SecOps
- Accede a 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.
Instala el agente de BindPlane
Instala el agente de Bindplane en tu sistema operativo Windows o Linux según las siguientes instrucciones.
Instalación en Windows
- Abre el símbolo del sistema o PowerShell como administrador.
Ejecuta el comando siguiente:
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quietEspera a que se complete la instalación.
Ejecute el siguiente comando para verificar la instalación:
sc query observiq-otel-collector
El servicio debe mostrarse como RUNNING.
Instalación en Linux
- Abre una terminal con privilegios de administrador o sudo.
Ejecuta el comando siguiente:
sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.shEspera a que se complete la instalación.
Ejecute el siguiente comando para verificar la instalación:
sudo systemctl status observiq-otel-collector
El servicio debería mostrarse como activo (en ejecución).
Recursos de instalación adicionales
Para obtener más opciones de instalación y solucionar problemas, consulta la guía de instalación del agente de Bindplane.
Configura el agente de BindPlane para transferir Syslog y enviarlo a Google SecOps
Ubica el archivo de configuración
Linux:
sudo nano /etc/bindplane-agent/config.yamlWindows:
notepad "C:\Program Files\observIQ OpenTelemetry Collector\config.yaml"
Edita el archivo de configuración
Reemplaza todo el contenido de
config.yamlcon la siguiente configuración:receivers: udplog: listen_address: "0.0.0.0:514" exporters: chronicle/chronicle_w_labels: compression: gzip creds_file_path: '/path/to/ingestion-authentication-file.json' customer_id: 'YOUR_CUSTOMER_ID' endpoint: malachiteingestion-pa.googleapis.com log_type: 'FORTINET_FORTIWEB' raw_log_field: body ingestion_labels: service: pipelines: logs/source0__chronicle_w_labels-0: receivers: - udplog exporters: - chronicle/chronicle_w_labels
Parámetros de configuración
Reemplaza los marcadores de posición que se indican más abajo:
Configuración del receptor:
udplog: Usaudplogpara el registro del sistema UDP otcplogpara el registro del sistema TCP.0.0.0.0: Dirección IP en la que se realizará la escucha (0.0.0.0para escuchar en todas las interfaces)514: Número de puerto en el que se debe escuchar (puerto syslog estándar)
Configuración del exportador:
creds_file_path: Ruta de acceso completa al archivo de autenticación de la transferencia:- Linux:
/etc/bindplane-agent/ingestion-auth.json - Windows:
C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json
- Linux:
YOUR_CUSTOMER_ID: ID de cliente de la sección Obtén el ID de clienteendpoint: URL del extremo regional:- EE.UU.:
malachiteingestion-pa.googleapis.com - Europa:
europe-malachiteingestion-pa.googleapis.com - Asia:
asia-southeast1-malachiteingestion-pa.googleapis.com - Consulta Extremos regionales para obtener la lista completa.
- EE.UU.:
log_type: Tipo de registro tal como aparece en Chronicle (FORTINET_FORTIWEB)
Guarda el archivo de configuración
- Después de editarlo, guarda el archivo:
- Linux: Presiona
Ctrl+O, luegoEntery, después,Ctrl+X. - Windows: Haz clic en Archivo > Guardar
- Linux: Presiona
Reinicia el agente de Bindplane para aplicar los cambios
Para reiniciar el agente de Bindplane en Linux, ejecuta el siguiente comando:
sudo systemctl restart observiq-otel-collectorVerifica que el servicio esté en ejecución:
sudo systemctl status observiq-otel-collectorRevisa los registros en busca de errores:
sudo journalctl -u observiq-otel-collector -f
Para reiniciar el agente de Bindplane en Windows, elige una de las siguientes opciones:
Símbolo del sistema o PowerShell como administrador:
net stop observiq-otel-collector && net start observiq-otel-collectorConsola de Services:
- Presiona
Win+R, escribeservices.mscy presiona Intro. - Busca observIQ OpenTelemetry Collector.
Haz clic con el botón derecho y selecciona Reiniciar.
Verifica que el servicio esté en ejecución:
sc query observiq-otel-collectorRevisa los registros en busca de errores:
type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
- Presiona
Configura el reenvío de Syslog de Fortinet FortiWeb
- Accede a la interfaz web de FortiWeb.
- Ve a Log & Report > Log Config > Other Log Settings.
- En Política de Syslog, haz clic en Crear nueva para agregar una política de Syslog nueva.
- Proporciona los siguientes detalles de configuración:
- Nombre de la política: Ingresa un nombre descriptivo (por ejemplo,
Google-SecOps-Bindplane). - Dirección IP: Ingresa la dirección IP del host del agente de Bindplane.
- Puerto: Ingresa
514. - Habilitar: Selecciona Habilitar.
- Facility: Selecciona local0 (o la instalación que prefieras).
- Log Level: Selecciona information (o el nivel que prefieras).
- Nombre de la política: Ingresa un nombre descriptivo (por ejemplo,
- En la sección Log Type, habilita lo siguiente:
- Registro de ataque
- Registro de eventos
- Registro de tráfico
- Haz clic en Aceptar para guardar los cambios.
- Para verificar que se envíen los mensajes de syslog, consulta los registros del agente de Bindplane.
Tabla de asignación de UDM
| Campo de registro | Asignación de UDM | Lógica |
|---|---|---|
| acción | additional.fields[].value.string_value | El valor se asigna directamente. |
| acción | security_result.action_details | Si la acción es "Permitir" o "Aceptar", security_result.action_details se establece en "ALLOW". Si la acción es "Denied", "deny", "block" o "Block", security_result.action_details se establece en "BLOCK". |
| app | network.application_protocol | El valor se asigna directamente después de convertirse a mayúsculas. Solo si el valor es uno de HTTPS, HTTP, DNS, DHCP o SMB. |
| app_name | additional.fields[].key | La clave se establece en "appName". |
| app_name | additional.fields[].value.string_value | El valor se asigna directamente. |
| backend_service | additional.fields[].key | La clave se establece en "backend_service". |
| backend_service | additional.fields[].value.string_value | El valor se asigna directamente. |
| cat | security_result.category_details | El valor se asigna directamente. |
| client_level | security_result.category | Si client_level es "Malicious", security_result.category se establece en "NETWORK_MALICIOUS". |
| cn1 | additional.fields[].value.string_value | Se asigna al campo threatWeight. |
| cn1Label | additional.fields[].key | La clave se establece en el valor de cn1Label. |
| cn2 | additional.fields[].value.string_value | Se asigna al campo de longitud. |
| cn2Label | additional.fields[].key | La clave se establece en el valor de cn2Label. |
| cn3 | additional.fields[].value.string_value | Se asigna al campo signatureID. |
| cn3Label | additional.fields[].key | La clave se establece en el valor de cn3Label. |
| cs1 | additional.fields[].value.string_value | El valor se asigna directamente. |
| cs1Label | additional.fields[].key | La clave se establece en el valor de cs1Label. |
| cs1 | principal.user.product_object_id | El valor se asigna directamente cuando cs1Label coincide con "userID" (sin distinción entre mayúsculas y minúsculas). |
| cs2 | additional.fields[].value.string_value | El valor se asigna directamente. |
| cs2Label | additional.fields[].key | La clave se establece en el valor de cs2Label. |
| cs2 | principal.user.userid | El valor se asigna directamente cuando cs2Label coincide con "userName" (sin distinguir mayúsculas de minúsculas) y suid está vacío. |
| cs3 | additional.fields[].value.string_value | El valor se asigna directamente. |
| cs3Label | additional.fields[].key | La clave se establece en el valor de cs3Label. |
| cs3 | metadata.severity | El valor se asigna directamente cuando cs3Label es "level" y cs3 no está vacío. |
| cs4 | additional.fields[].value.string_value | Se asigna al campo subType. |
| cs4Label | additional.fields[].key | La clave se establece en el valor de cs4Label. |
| cs5 | additional.fields[].value.string_value | Se asigna al campo threatLevel. |
| cs5Label | additional.fields[].key | La clave se establece en el valor de cs5Label. |
| cs6 | additional.fields[].value.string_value | Se asigna al campo owaspTop10. |
| cs6Label | additional.fields[].key | La clave se establece en el valor de cs6Label. |
| fecha | metadata.event_timestamp.seconds | Se combina con la fecha y hora, y se analiza para generar segundos de época. |
| dev_id | principal.resource.id | El valor se asigna directamente. |
| devname | principal.resource.name | El valor se asigna directamente. |
| device_event_class_id | metadata.product_event_type | Se usa en el análisis de CEF. |
| device_product | metadata.product_name | Se usa en el análisis de CEF. |
| device_vendor | metadata.vendor_name | Se usa en el análisis de CEF. |
| device_version | metadata.product_version | Se usa en el análisis de CEF. |
| dhost | target.hostname | El valor se asigna directamente. |
| dpt | target.port | El valor se asigna y convierte directamente en un número entero. |
| DST | target.ip | El valor se asigna directamente. |
| dst_port | target.port | El valor se asigna y convierte directamente en un número entero. |
| dstepid | target.process.pid | El valor se asigna directamente. |
| dsteuid | target.user.userid | El valor se asigna directamente. |
| event_name | metadata.product_event_type | Se usa en el análisis de CEF. |
| http_agent | network.http.parsed_user_agent | El valor se analiza como una cadena de usuario-agente. |
| http_method | network.http.method | El valor se asigna directamente. |
| http_refer | network.http.referral_url | El valor se asigna directamente. |
| http_session_id | network.session_id | El valor se asigna directamente. |
| http_url | target.url | El valor se asigna directamente. |
| http_version | metadata.product_version | El valor se asigna directamente. |
| longitud | additional.fields[].key | La clave se establece en "length". |
| longitud | additional.fields[].value.string_value | El valor se asigna directamente. |
| log_type | metadata.log_type | Se codifica como "FORTINET_FORTIWEB". |
| main_type | additional.fields[].key | La clave se establece en "mainType". |
| main_type | additional.fields[].value.string_value | El valor se asigna directamente. |
| mensaje | Varios campos | Se analizó con los filtros grok y kv para extraer diferentes campos. |
| ml_allow_method | additional.fields[].key | La clave se establece en "ml_allow_method". |
| ml_allow_method | additional.fields[].value.string_value | El valor se asigna directamente. |
| ml_arg_dbid | additional.fields[].key | La clave se establece en "ml_arg_dbid". |
| ml_arg_dbid | additional.fields[].value.string_value | El valor se asigna directamente. |
| ml_domain_index | additional.fields[].key | La clave se establece en "ml_domain_index". |
| ml_domain_index | additional.fields[].value.string_value | El valor se asigna directamente. |
| ml_log_arglen | additional.fields[].key | La clave se establece en "ml_log_arglen". |
| ml_log_arglen | additional.fields[].value.string_value | El valor se asigna directamente. |
| ml_log_hmm_probability | additional.fields[].key | La clave se establece en "ml_log_hmm_probability". |
| ml_log_hmm_probability | additional.fields[].value.string_value | El valor se asigna directamente. |
| ml_log_sample_arglen_mean | additional.fields[].key | La clave se establece en "ml_log_sample_arglen_mean". |
| ml_log_sample_arglen_mean | additional.fields[].value.string_value | El valor se asigna directamente. |
| ml_log_sample_prob_mean | additional.fields[].key | La clave se establece en "ml_log_sample_prob_mean". |
| ml_log_sample_prob_mean | additional.fields[].value.string_value | El valor se asigna directamente. |
| ml_svm_accuracy | additional.fields[].key | La clave se establece en "ml_svm_accuracy". |
| ml_svm_accuracy | additional.fields[].value.string_value | El valor se asigna directamente. |
| ml_svm_log_main_types | additional.fields[].key | La clave se establece en "ml_svm_log_main_types". |
| ml_svm_log_main_types | additional.fields[].value.string_value | El valor se asigna directamente. |
| ml_svm_log_match_types | additional.fields[].key | La clave se establece en "ml_svm_log_match_types". |
| ml_svm_log_match_types | additional.fields[].value.string_value | El valor se asigna directamente. |
| ml_url_dbid | additional.fields[].key | La clave se establece en "ml_url_dbid". |
| ml_url_dbid | additional.fields[].value.string_value | El valor se asigna directamente. |
| monitor_status | additional.fields[].key | La clave se establece en "monitor_status". |
| monitor_status | additional.fields[].value.string_value | El valor se asigna directamente. |
| msg | metadata.description | El valor se asigna directamente. |
| owasp_top10 | additional.fields[].key | La clave se establece en "owaspTop10". |
| owasp_top10 | additional.fields[].value.string_value | El valor se asigna directamente. |
| principal_app | principal.application | El valor se asigna directamente. |
| principal_host | principal.hostname | El valor se asigna directamente. |
| protocolo | network.ip_protocol | El valor se asigna directamente después de convertirse a mayúsculas. |
| solicitud | target.url | El valor se asigna directamente. |
| requestMethod | network.http.method | El valor se asigna directamente. |
| rt | metadata.event_timestamp.seconds | Se analiza como milisegundos desde el ciclo y se convierte en segundos. |
| security_result.severity | security_result.severity | Se deriva de severity_level. Se asigna a diferentes valores de gravedad del UDM según el valor del registro sin procesar. El valor predeterminado es UNKNOWN_SEVERITY si no se encuentra ninguna coincidencia. |
| server_pool_name | additional.fields[].key | La clave se establece en "server_pool_name". |
| server_pool_name | additional.fields[].value.string_value | El valor se asigna directamente. |
| servicio | network.application_protocol | El valor se asigna directamente después de convertirse a mayúsculas. |
| servicio | target.application | El valor se asigna directamente después de convertirse a mayúsculas si no es uno de los siguientes: HTTPS, HTTP, DNS, DHCP o SMB. |
| gravedad, | security_result.severity | Si la gravedad está vacía y cs3Label es "level", se usa el valor de cs3. Luego, se asigna a un valor de gravedad del UDM (BAJA, ALTA, etcétera). |
| signature_id | security_result.rule_id | El valor se asigna directamente. |
| signature_subclass | security_result.detection_fields[].key | La clave se establece en "signature_subclass". |
| signature_subclass | security_result.detection_fields[].value | El valor se asigna directamente. |
| src | principal.ip | El valor se asigna directamente. |
| src_country | principal.location.country_or_region | El valor se asigna directamente. |
| src_ip | principal.ip | El valor se asigna directamente. |
| src_port | principal.port | El valor se asigna y convierte directamente en un número entero. |
| srccountry | principal.location.country_or_region | El valor se asigna directamente. |
| sub_type | additional.fields[].key | La clave se establece en "subType". |
| sub_type | additional.fields[].value.string_value | El valor se asigna directamente. |
| subtype | target.resource.resource_subtype | El valor se asigna directamente. |
| suid | principal.user.userid | El valor se asigna directamente. |
| threat_level | additional.fields[].key | La clave se establece en "threatLevel". |
| threat_level | additional.fields[].value.string_value | El valor se asigna directamente. |
| threat_weight | security_result.detection_fields[].key | La clave se establece en "threat_weight". |
| threat_weight | security_result.detection_fields[].value | El valor se asigna directamente. |
| hora | metadata.event_timestamp.seconds | Se combina con la fecha y se analiza para generar segundos de época. |
| user_id | principal.user.product_object_id | El valor se asigna directamente. |
| user_name | additional.fields[].key | La clave se establece en "userName". |
| user_name | additional.fields[].value.string_value | El valor se asigna directamente. |
| user_name | principal.user.userid | El valor se asigna directamente. |
| N/A | metadata.event_type | Se establece en "NETWORK_CONNECTION" si están presentes principal.ip y target.ip. Se establece en "USER_UNCATEGORIZED" si están presentes principal.ip y principal.user. Se establece en "STATUS_UPDATE" si solo está presente principal.ip. De lo contrario, se establece en "GENERIC_EVENT". |
| N/A | metadata.log_type | Se codifica como "FORTINET_FORTIWEB". |
| N/A | metadata.product_name | Está codificado como "FORTINET FORTIWEB" o "FortiWEB Cloud" según el formato de registro. |
| N/A | metadata.vendor_name | Está codificado como "FORTINET" o "Fortinet" según el formato de registro. |
| N/A | principal.resource.resource_type | Está codificado como "DEVICE" si dev_id está presente. |
¿Necesitas más ayuda? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.