Recopila registros de Elastic Packet Beats
En este documento, se explica cómo transferir registros de Elastic Packet Beats a Google Security Operations con Bindplane. Primero, el analizador inicializa los valores predeterminados para varios campos que se encuentran en los registros de Elastic Packet Beats. Luego, extrae datos de los mensajes de registro con una combinación de patrones grok
y filtros json
, realiza conversiones de tipos de datos y asigna los campos extraídos a los campos correspondientes en el Modelo de datos unificado (UDM) según el tipo de conjunto de datos de eventos (por ejemplo, flujo, DNS, HTTP, TLS, DHCPv4).
Antes de comenzar
Asegúrate de cumplir con los siguientes requisitos previos:
- Es una instancia de Google SecOps.
- Un host de Windows 2016 o posterior, o Linux con
systemd
. - Si se ejecuta detrás de un proxy, asegúrate de que los puertos del firewall estén abiertos según los requisitos del agente de Bindplane.
- Acceso con privilegios a la consola o el dispositivo de administración de Elastic Packet Beats
- Logstash instalado y configurado
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 siguiente comando:
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
Instalación en Linux
- Abre una terminal con privilegios de raíz 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 obtener más opciones de instalación, consulta la guía de instalación.
Configura el agente de BindPlane para transferir Syslog y enviarlo a Google SecOps
Accede al archivo de configuración:
- Ubica el archivo
config.yaml
. Por lo general, 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
,vi
o Bloc de notas).
- Ubica el archivo
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 # Add optional ingestion labels for better organization log_type: 'ELASTIC_PACKETBEATS' raw_log_field: body ingestion_labels: service: pipelines: logs/source0__chronicle_w_labels-0: receivers: - udplog exporters: - chronicle/chronicle_w_labels
- Reemplaza el puerto y la dirección IP según sea necesario en tu infraestructura.
- Reemplaza
YOUR_CUSTOMER_ID
por el ID de cliente real. - Actualiza
/path/to/ingestion-authentication-file.json
a la ruta de acceso en la que se guardó el archivo de autenticación en la sección Cómo obtener el archivo de autenticación de la transferencia de Google SecOps.
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-collector
Para reiniciar el agente de Bindplane en Windows, puedes usar la consola de Servicios o ingresar el siguiente comando:
net stop observiq-otel-collector && net start observiq-otel-collector
Configura el reenvío de Syslog en Elastic Packet Beats
Dado que Packetbeat no admite la salida directa de syslog, debes usar Logstash como intermediario.
Configura Packetbeat para enviar registros a Logstash
- Accede a la Consola de administración de Elastic Packet Beats.
- Ve a Configuración > Reenvío de registros.
- Haz clic en el botón + Agregar o Habilitar.
- Proporciona los siguientes detalles de configuración:
- Nombre: Ingresa un nombre descriptivo (por ejemplo,
Logstash Output
). - Host: Ingresa la dirección IP del servidor de Logstash.
- Puerto: Ingresa el puerto de entrada de Logstash Beats (por lo general, 5044).
- Protocolo: Selecciona Protocolo de Beats.
- Formato: Selecciona JSON.
- Zona horaria: Selecciona la zona horaria UTC para garantizar la coherencia universal en todos los sistemas.
- Ve a la sección Eventos y selecciona los tipos de registros pertinentes o todos.
- Nombre: Ingresa un nombre descriptivo (por ejemplo,
Guarde la configuración.
Alternativa: Edita packetbeat.yml directamente:
# /etc/packetbeat/packetbeat.yml packetbeat.protocols: - type: dns ports: [53] - type: http ports: [80, 8080, 8000, 5000, 8002] send_headers: true send_all_headers: true - type: tls ports: [443, 993, 995, 5223, 8443, 8883, 9243] - type: dhcpv4 ports: [67, 68] # Enable processors for additional fields processors: - add_network_direction: source: private destination: private internal_networks: - private - community_id: # Send to Logstash using beats protocol output.logstash: hosts: ["LOGSTASH_IP:5044"]
Reemplaza
LOGSTASH_IP
por la dirección IP de tu servidor de Logstash.
Configura Logstash para que reenvíe datos a BindPlane con Syslog
Crea un archivo de configuración de canalización de Logstash:
sudo nano /etc/logstash/conf.d/packetbeat-to-bindplane.conf
Agrega la siguiente configuración:
# Receive from Packetbeat input { beats { port => 5044 } } # Optional: Add filters for data enrichment filter { # Preserve original message structure mutate { copy => { "@metadata" => "[@metadata_backup]" } } } # Send to BindPlane via syslog output { syslog { host => "BINDPLANE_IP" port => 514 protocol => "udp" rfc => "rfc5424" facility => "local0" severity => "informational" sourcehost => "%{[agent][hostname]}" appname => "packetbeat" procid => "%{[agent][id]}" msgid => "ELASTIC_PACKETBEATS" structured_data => "packetbeat@32473" message => "%{message}" } }
Reemplaza
BINDPLANE_IP
por la dirección IP de tu agente de BindPlane.
Reinicia Logstash para aplicar la configuración:
sudo systemctl restart logstash
Tabla de asignación de UDM
Campo de registro | Asignación de UDM | Lógica |
---|---|---|
@timestamp | metadata.event_timestamp | Se asigna directamente desde el campo de registro sin procesar @timestamp . |
agent.hostname | observer.hostname | Se asigna directamente desde el campo de registro sin procesar agent.hostname . |
agent.id | observer.asset_id | Se concatena con agent.type para formar el campo observer.asset_id . |
agent.type | observer.application | Se asigna directamente desde el campo de registro sin procesar agent.type . |
agent.version | observer.platform_version | Se asigna directamente desde el campo de registro sin procesar agent.version . |
audit_category | security_result.category_details | Se asigna directamente desde el campo de registro sin procesar audit_category . |
audit_cluster_name | additional.fields.audit_cluster_name.value.string_value | Se asigna directamente desde el campo de registro sin procesar audit_cluster_name . |
audit_node_host_address | observer.ip | Se asigna directamente desde el campo de registro sin procesar audit_node_host_address . |
audit_node_id | additional.fields.audit_node_id.value.string_value | Se asigna directamente desde el campo de registro sin procesar audit_node_id . |
audit_node_name | additional.fields.audit_node_name.value.string_value | Se asigna directamente desde el campo de registro sin procesar audit_node_name . |
audit_request_effective_user | observer.user.userid | Se asigna directamente desde el campo de registro sin procesar audit_request_effective_user . |
audit_request_initiating_user | additional.fields.audit_request_initiating_user.value.string_value | Se asigna directamente desde el campo de registro sin procesar audit_request_initiating_user . |
audit_request_remote_address | observer.ip | Se asigna directamente desde el campo de registro sin procesar audit_request_remote_address si es diferente de audit_node_host_address . |
client.bytes | network.received_bytes (ENTRANTE) / network.sent_bytes (SALIENTE) | Se asigna según el campo network.direction . Si es INBOUND, se asigna a network.received_bytes . Si es OUTBOUND, se asigna a network.sent_bytes . |
client.ip | target.ip (ENTRANTE) o principal.ip (SALIENTE) | Se asigna según el campo network.direction . Si es INBOUND, se asigna a target.ip . Si es OUTBOUND, se asigna a principal.ip . |
client.port | target.port (ENTRANTE) / principal.port (SALIENTE) | Se asigna según el campo network.direction . Si es INBOUND, se asigna a target.port . Si es OUTBOUND, se asigna a principal.port . |
cluster.uuid | additional.fields.uuid.value.string_value | Se asigna directamente desde el campo de registro sin procesar cluster.uuid . |
componente | additional.fields.component.value.string_value | Se asigna directamente desde el campo de registro sin procesar component . |
destination.bytes | network.sent_bytes | Se asigna directamente desde el campo de registro sin procesar destination.bytes para los eventos de FLUJO. |
destination.ip | target.ip | Se asigna directamente desde el campo de registro sin procesar destination.ip si network.direction no es INBOUND ni OUTBOUND. |
destination.mac | target.mac | Se asigna directamente desde el campo de registro sin procesar destination.mac para los eventos de FLUJO. |
destination.port | target.port | Se asigna directamente desde el campo de registro sin procesar destination.port para los eventos de FLUJO. |
dhcpv4.assigned_ip | network.dhcp.requested_address | Se asigna directamente desde el campo de registro sin procesar dhcpv4.assigned_ip . |
dhcpv4.client_ip | network.dhcp.yiaddr (ACK) / network.dhcp.ciaddr (REQUEST) / source.ip (REQUEST, si dhcpv4.client_ip está vacío) | Se asigna según el campo network.dhcp.type . Si es ACK, se asigna a network.dhcp.yiaddr . Si es REQUEST, se asigna a network.dhcp.ciaddr . Si REQUEST y dhcpv4.client_ip están vacíos, se asigna a source.ip . |
dhcpv4.client_mac | network.dhcp.client_identifier | Se asigna directamente desde el campo de registro sin procesar dhcpv4.client_mac después de convertirlo en bytes. |
dhcpv4.op_code | network.dhcp.opcode | Se asigna a network.dhcp.opcode según el valor de dhcpv4.op_code . Si dhcpv4.op_code es BOOTREPLY o BOOTREQUEST , el valor se asigna directamente. De lo contrario, se asigna a UNKNOWN_OPCODE . |
dhcpv4.option.hostname | network.dhcp.client_hostname | Se asigna directamente desde el campo de registro sin procesar dhcpv4.option.hostname . |
dhcpv4.option.ip_address_lease_time_sec | network.dhcp.lease_time_seconds | Se asigna directamente desde el campo de registro sin procesar dhcpv4.option.ip_address_lease_time_sec después de convertirlo en un número entero sin signo. |
dhcpv4.option.message_type | network.dhcp.type | Se asigna a network.dhcp.type según el valor de dhcpv4.option.message_type . La asignación es la siguiente: ack -> ACK , nack -> NAK , discover -> DISCOVER , offer -> OFFER , request -> REQUEST , decline -> DECLINE , release -> RELEASE , info -> INFORM . Si el valor no es uno de estos, se asigna a UNKNOWN_MESSAGE_TYPE . |
dhcpv4.option.server_identifier | network.dhcp.sname | Se asigna directamente desde el campo de registro sin procesar dhcpv4.option.server_identifier . |
dns.answers.data | network.dns.answers.data | Se asigna directamente desde el campo de registro sin procesar dns.answers.data . |
dns.answers.class | network.dns.answers.class | Se asigna a network.dns.answers.class según el valor de dns.answers.class . La asignación es la siguiente: IN -> 1, NONE -> 254, ANY -> 255. |
dns.answers.name | network.dns.answers.name | Se asigna directamente desde el campo de registro sin procesar dns.answers.name . |
dns.answers.ttl | network.dns.answers.ttl | Se asigna directamente desde el campo de registro sin procesar dns.answers.ttl después de convertirlo en un número entero sin signo. |
dns.answers.type | network.dns.answers.type | Se asigna a network.dns.answers.type según el valor de dns.answers.type . La asignación es la siguiente: A -> 1, NS -> 2, CNAME -> 5, SOA -> 6, PTR -> 12, MX -> 15, TXT -> 16, AAAA -> 28, SRV -> 33, NAPTR -> 35, DS -> 43, DNSKEY -> 48, IXFR -> 251, AXFR -> 252, TYPE99 -> 99, TKEY -> 249, ANY -> 255, ALL -> 255, URI -> 256, NULL -> 0. |
dns.flags.authoritative | network.dns.authoritative | Se asigna directamente desde el campo de registro sin procesar dns.flags.authoritative si es verdadero. |
dns.flags.recursion_available | network.dns.recursion_available | Se asigna directamente desde el campo de registro sin procesar dns.flags.recursion_available si es verdadero. |
dns.flags.recursion_desired | network.dns.recursion_desired | Se asigna directamente desde el campo de registro sin procesar dns.flags.recursion_desired si es verdadero. |
dns.flags.truncated_response | network.dns.truncated | Se asigna directamente desde el campo de registro sin procesar dns.flags.truncated_response si es verdadero. |
dns.id | network.dns.id | Se asigna directamente desde el campo de registro sin procesar dns.id después de convertirlo en un número entero sin signo. |
dns.question.class | network.dns.questions.class | Se asigna a network.dns.questions.class según el valor de dns.question.class . La asignación es la siguiente: IN -> 1, NONE -> 254, ANY -> 255. |
dns.question.name | network.dns.questions.name | Se asigna directamente desde el campo de registro sin procesar dns.question.name . |
dns.question.type | network.dns.questions.type | Se asigna a network.dns.questions.type según el valor de dns.question.type . La asignación es la siguiente: A -> 1, NS -> 2, CNAME -> 5, SOA -> 6, PTR -> 12, MX -> 15, TXT -> 16, AAAA -> 28, SRV -> 33, NAPTR -> 35, DS -> 43, DNSKEY -> 48, IXFR -> 251, AXFR -> 252, TYPE99 -> 99, TKEY -> 249, ANY -> 255, ALL -> 255, URI -> 256, NULL -> 0. |
dns.resolved_ip | network.dns.additional.data | Cada elemento del array dns.resolved_ip se procesa y se asigna al campo network.dns.additional.data . |
dns.response_code | network.dns.response_code | Se asigna a network.dns.response_code según el valor de dns.response_code . La asignación es la siguiente: NOERROR -> 0, FORMERR -> 1, SERVFAIL -> 2, NXDOMAIN -> 3, NOTIMP -> 4, REFUSED -> 5, YXDOMAIN -> 6, YXRRSET -> 7, NXRRSET -> 8, NOTAUTH -> 9, NOTZONE -> 10. |
error.message | security_result.summary | Se concatena con status para formar el campo security_result.summary para los eventos HTTP. |
event.dataset | metadata.product_event_type | Se asigna directamente desde el campo de registro sin procesar event.dataset . |
flow.final | Se usa para determinar si el flujo es final. De lo contrario, se descarta el evento. | |
flow.id | network.session_id | Se asigna directamente desde el campo de registro sin procesar flow.id para los eventos de FLUJO. |
headers.accept_encoding | security_result.about.labels.Accept-Encoding | Se asigna directamente desde el campo de registro sin procesar headers.accept_encoding . |
headers.content_length | additional.fields.content_length.value.string_value | Se asigna directamente desde el campo de registro sin procesar headers.content_length . |
headers.content_type | additional.fields.content_type.value.string_value | Se asigna directamente desde el campo de registro sin procesar headers.content_type . |
headers.http_accept | additional.fields.http_accept.value.string_value | Se asigna directamente desde el campo de registro sin procesar headers.http_accept . |
headers.http_host | principal.hostname, principal.asset.hostname | Se asigna directamente desde el campo de registro sin procesar headers.http_host . |
headers.http_user_agent | network.http.user_agent | Se asigna directamente desde el campo de registro sin procesar headers.http_user_agent . |
headers.request_method | network.http.method | Se asigna directamente desde el campo de registro sin procesar headers.request_method . |
headers.x_b3_parentspanid | additional.fields.x_b3_parentspanid.value.string_value | Se asigna directamente desde el campo de registro sin procesar headers.x_b3_parentspanid . |
headers.x_b3_sampled | additional.fields.x_b3_sampled.value.string_value | Se asigna directamente desde el campo de registro sin procesar headers.x_b3_sampled . |
headers.x_envoy_attempt_count | security_result.about.labels.x_envoy_attempt_count | Se asigna directamente desde el campo de registro sin procesar headers.x_envoy_attempt_count . |
headers.x_envoy_original_path | additional.fields.x_envoy_original_path.value.string_value | Se asigna directamente desde el campo de registro sin procesar headers.x_envoy_original_path . |
headers.x_forwarded_client_cert | additional.fields.client_cert.value.string_value | Se asigna directamente desde el campo de registro sin procesar headers.x_forwarded_client_cert . |
headers.x_forwarded_for | principal.ip, principal.asset.ip | Se asigna directamente desde el campo de registro sin procesar headers.x_forwarded_for después de extraer la dirección IP con Grok. |
headers.x_forwarded_proto | additional.fields.x_forwarded_proto.value.string_value | Se asigna directamente desde el campo de registro sin procesar headers.x_forwarded_proto . |
headers.x_request_id | additional.fields.x_request_id.value.string_value | Se asigna directamente desde el campo de registro sin procesar headers.x_request_id . |
host | principal.ip, principal.asset.ip | Se asigna directamente desde el campo de registro sin procesar host después de extraer la dirección IP con Grok. |
http.request.method | network.http.method | Se asigna directamente desde el campo de registro sin procesar http.request.method . |
level | security_result.severity | Se asigna a security_result.severity según el valor de level . La asignación es la siguiente: INFO -> INFORMATIONAL , ERROR -> ERROR , WARNING -> LOW . |
logger | additional.fields.logger.value.string_value | Se asigna directamente desde el campo de registro sin procesar logger . |
método | Se usa para determinar si el evento es un evento de DNS. | |
msg | security_result.description | Se asigna directamente desde el campo de registro sin procesar msg después de quitar las comillas dobles. |
network.community_id | network.community_id | Se asigna directamente desde el campo de registro sin procesar network.community_id . |
network.direction | network.direction | Se asigna directamente desde el campo de registro sin procesar network.direction después de convertirlo a mayúsculas. Si el valor es INGRESS o INBOUND , se asigna a INBOUND . Si el valor es EGRESS o OUTBOUND , se asigna a OUTBOUND . |
network.protocol | network.application_protocol | Se asigna directamente desde el campo de registro sin procesar network.protocol . |
network.transport | network.ip_protocol | Se asigna directamente desde el campo de registro sin procesar network.transport para los eventos de TLS. |
server.bytes | network.sent_bytes (ENTRANTE) / network.received_bytes (SALIENTE) | Se asigna según el campo network.direction . Si es INBOUND, se asigna a network.sent_bytes . Si es OUTBOUND, se asigna a network.received_bytes . |
server.domain | principal.hostname, principal.asset.hostname (ENTRANTE) / target.hostname, target.asset.hostname (SALIENTE) | Se asigna según el campo network.direction . Si es INBOUND, se asigna a principal.hostname . Si es OUTBOUND, se asigna a target.hostname . |
server.ip | principal.ip, principal.asset.ip (ENTRANTE) / target.ip, target.asset.ip (SALIENTE) | Se asigna según el campo network.direction . Si es INBOUND, se asigna a principal.ip . Si es OUTBOUND, se asigna a target.ip . |
server.port | principal.port (ENTRANTE) / target.port (SALIENTE) | Se asigna según el campo network.direction . Si es INBOUND, se asigna a principal.port . Si es OUTBOUND, se asigna a target.port . |
source.bytes | network.received_bytes | Se asigna directamente desde el campo de registro sin procesar source.bytes para los eventos de FLUJO. |
source.ip | principal.ip, principal.asset.ip | Se asigna directamente desde el campo de registro sin procesar source.ip para los eventos de FLUJO. |
source.mac | principal.mac | Se asigna directamente desde el campo de registro sin procesar source.mac para los eventos de FLUJO. |
source.port | principal.port | Se asigna directamente desde el campo de registro sin procesar source.port para los eventos de FLUJO. |
estado | metadata.description, security_result.summary | Se asigna a metadata.description si level está vacío. Se concatena con error.message para formar el campo security_result.summary para los eventos HTTP y TLS. |
tls.client.ja3 | network.tls.client.ja3 | Se asigna directamente desde el campo de registro sin procesar tls.client.ja3 . |
tls.client.server_name | network.tls.client.server_name | Se asigna directamente desde el campo de registro sin procesar tls.client.server_name . |
tls.client.supported_ciphers | network.tls.client.supported_ciphers | Cada elemento del array tls.client.supported_ciphers se procesa y se asigna al array network.tls.client.supported_ciphers . |
tls.cipher | network.tls.cipher | Se asigna directamente desde el campo de registro sin procesar tls.cipher . |
tls.detailed.server_certificate.not_after | network.tls.server.certificate.not_after | Se asigna directamente desde el campo de registro sin procesar tls.detailed.server_certificate.not_after después de convertirlo en una marca de tiempo. |
tls.detailed.server_certificate.not_before | network.tls.server.certificate.not_before | Se asigna directamente desde el campo de registro sin procesar tls.detailed.server_certificate.not_before después de convertirlo en una marca de tiempo. |
tls.detailed.server_certificate.serial_number | network.tls.server.certificate.serial | Se asigna directamente desde el campo de registro sin procesar tls.detailed.server_certificate.serial_number . |
tls.detailed.server_certificate.version | network.tls.server.certificate.version | Se asigna directamente desde el campo de registro sin procesar tls.detailed.server_certificate.version después de convertirlo en una cadena. |
tls.established | network.tls.established | Se asigna directamente desde el campo de registro sin procesar tls.established . |
tls.next_protocol | network.tls.next_protocol | Se asigna directamente desde el campo de registro sin procesar tls.next_protocol . |
tls.resumed | network.tls.resumed | Se asigna directamente desde el campo de registro sin procesar tls.resumed . |
tls.server.hash.sha1 | network.tls.server.certificate.sha1 | Se asigna directamente desde el campo de registro sin procesar tls.server.hash.sha1 después de convertirlo a minúsculas. |
tls.server.issuer | network.tls.server.certificate.issuer | Se asigna directamente desde el campo de registro sin procesar tls.server.issuer . |
tls.server.subject | network.tls.server.certificate.subject | Se asigna directamente desde el campo de registro sin procesar tls.server.subject . |
tls.version | network.tls.version | Se asigna directamente desde el campo de registro sin procesar tls.version . |
tls.version_protocol | network.tls.version_protocol | Se asigna directamente desde el campo de registro sin procesar tls.version_protocol . |
tipo | Se usa para determinar si el evento es un evento de DNS. | |
url.full | principal.url (ENTRANTE) / target.url (SALIENTE) | Se asigna según el campo network.direction . Si es INBOUND, se asigna a principal.url . Si es OUTBOUND, se asigna a target.url . |
user_id | target.user.userid | Se asigna directamente desde el campo de registro sin procesar user_id . |
user_name | target.user.user_display_name | Se asigna directamente desde el campo de registro sin procesar user_name . |
metadata.event_type | Se configura de forma predeterminada en GENERIC_EVENT . Se cambiaron a tipos de eventos específicos según la fuente de registro y los datos del evento. |
|
metadata.vendor_name | Se configura de forma predeterminada en Elastic . |
|
metadata.product_name | Se configura de forma predeterminada en PacketBeat . |
|
security_result.action | Se configura de forma predeterminada en ALLOW . |
|
metadata.log_type | Se configura de forma predeterminada en ELASTIC_PACKETBEATS . |
¿Necesitas más ayuda? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.