Recoger registros de Elastic Packet Beats
En este documento se explica cómo ingerir registros de Elastic Packet Beats en Google Security Operations mediante Bindplane. El analizador primero inicializa los valores predeterminados de varios campos que se encuentran en los registros de Elastic Packet Beats. A continuación, extrae datos de los mensajes de registro mediante una combinación de grok
patrones y json
filtros, realiza conversiones de tipos de datos y asigna los campos extraídos a los campos correspondientes del modelo de datos unificado (UDM) en función del tipo de conjunto de datos de eventos (por ejemplo, flujo, DNS, HTTP, TLS o DHCPv4).
Antes de empezar
Asegúrate de que cumples los siguientes requisitos previos:
- Una instancia de Google SecOps.
- Un host Windows 2016 o posterior, o Linux con
systemd
. - Si se ejecuta a través de un proxy, asegúrate de que los puertos del cortafuegos estén abiertos según los requisitos del agente de Bindplane.
- Acceso privilegiado a la consola de gestión o al dispositivo de Elastic Packet Beats.
- Logstash instalado y configurado.
Obtener el archivo de autenticación de ingestión de Google SecOps
- 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.
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 de Bindplane en tu sistema operativo Windows o Linux siguiendo las instrucciones que se indican a continuación.
Instalación de ventanas
- 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 de Linux
- Abre un terminal con privilegios de superusuario 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 más opciones de instalación, consulta la 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
,vi
o Bloc de notas).
- Busca 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
- Sustituye el puerto y la dirección IP según sea necesario en tu infraestructura.
- Sustituye
YOUR_CUSTOMER_ID
por el ID de cliente real. - Actualiza
/path/to/ingestion-authentication-file.json
a la ruta en la que se guardó el archivo de autenticación en la sección Obtener el archivo de autenticación de ingestión 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 Servicios o introducir el siguiente comando:
net stop observiq-otel-collector && net start observiq-otel-collector
Configurar el reenvío de Syslog en Elastic Packet Beats
Como Packetbeat no admite la salida syslog directa, debes usar Logstash como intermediario.
Configurar Packetbeat para enviar registros a Logstash
- Inicia sesión en la consola de gestión de Elastic Packet Beats.
- Ve a Ajustes > Reenvío de registros.
- Haz clic en el botón + Añadir o Habilitar.
- Proporcione los siguientes detalles de configuración:
- Nombre: introduce un nombre descriptivo (por ejemplo,
Logstash Output
). - Host: introduce la dirección IP del servidor Logstash.
- Puerto: introduce el puerto de entrada de Logstash Beats (normalmente, 5044).
- Protocolo: selecciona Protocolo Beats.
- Formato: selecciona JSON.
- Zona horaria: selecciona la zona horaria UTC para que haya coherencia universal en todos los sistemas.
- Ve a la sección Eventos y selecciona los tipos de registro pertinentes o todos.
- Nombre: introduce un nombre descriptivo (por ejemplo,
Guarda 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"]
Sustituye
LOGSTASH_IP
por la dirección IP de tu servidor Logstash.
Configurar Logstash para que reenvíe datos a BindPlane mediante Syslog
Crea un archivo de configuración de la canalización de Logstash:
sudo nano /etc/logstash/conf.d/packetbeat-to-bindplane.conf
Añade 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}" } }
Sustituye
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 (INBOUND) / network.sent_bytes (OUTBOUND) | Asignación basada en el campo network.direction . Si es ENTRANTE, se asigna a network.received_bytes . Si es SALIENTE, se asigna a network.sent_bytes . |
client.ip | target.ip (INBOUND) / principal.ip (OUTBOUND) | Asignación basada en el campo network.direction . Si es ENTRANTE, se asigna a target.ip . Si es SALIENTE, se asigna a principal.ip . |
client.port | target.port (ENTRANTE) o principal.port (SALIENTE) | Asignación basada en el campo network.direction . Si es ENTRANTE, se asigna a target.port . Si es SALIENTE, 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 de los eventos FLOW. |
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 de los eventos FLOW. |
destination.port | target.port | Se asigna directamente desde el campo de registro sin procesar destination.port de los eventos FLOW. |
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, if dhcpv4.client_ip is empty) | Asignación basada en 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 en función del 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 entero sin signo. |
dhcpv4.option.message_type | network.dhcp.type | Se asigna a network.dhcp.type en función del 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 y 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 en función del 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 entero sin signo. |
dns.answers.type | network.dns.answers.type | Se asigna a network.dns.answers.type en función del 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 y NULL -> 0. |
dns.flags.authoritative | network.dns.authoritative | Se asigna directamente desde el campo de registro sin procesar dns.flags.authoritative si es true. |
dns.flags.recursion_available | network.dns.recursion_available | Se asigna directamente desde el campo de registro sin procesar dns.flags.recursion_available si es true. |
dns.flags.recursion_desired | network.dns.recursion_desired | Se asigna directamente desde el campo de registro sin procesar dns.flags.recursion_desired si es true. |
dns.flags.truncated_response | network.dns.truncated | Se asigna directamente desde el campo de registro sin procesar dns.flags.truncated_response si es true. |
dns.id | network.dns.id | Se asigna directamente desde el campo de registro sin procesar dns.id después de convertirlo en un entero sin signo. |
dns.question.class | network.dns.questions.class | Se asigna a network.dns.questions.class en función del 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 en función del 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 y NULL -> 0. |
dns.resolved_ip | network.dns.additional.data | Cada elemento de la matriz 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 en función del 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 de 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. Si no es así, el evento se descartará. | |
flow.id | network.session_id | Se asigna directamente desde el campo de registro sin procesar flow.id de los eventos FLOW. |
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 . |
nivel | security_result.severity | Se asigna a security_result.severity en función del valor de level . La asignación es la siguiente: INFO -> INFORMATIONAL , ERROR -> ERROR , WARNING -> LOW . |
Registrador | 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 eventos de TLS. |
server.bytes | network.sent_bytes (ENTRANTE) / network.received_bytes (SALIENTE) | Asignación basada en el campo network.direction . Si es ENTRANTE, se asigna a network.sent_bytes . Si es SALIENTE, se asigna a network.received_bytes . |
server.domain | principal.hostname, principal.asset.hostname (INBOUND) / target.hostname, target.asset.hostname (OUTBOUND) | Asignación basada en el campo network.direction . Si es ENTRANTE, se asigna a principal.hostname . Si es SALIENTE, se asigna a target.hostname . |
server.ip | principal.ip, principal.asset.ip (INBOUND) / target.ip, target.asset.ip (OUTBOUND) | Asignación basada en el campo network.direction . Si es ENTRANTE, se asigna a principal.ip . Si es SALIENTE, se asigna a target.ip . |
server.port | principal.port (INBOUND) / target.port (OUTBOUND) | Asignación basada en el campo network.direction . Si es ENTRANTE, se asigna a principal.port . Si es SALIENTE, se asigna a target.port . |
source.bytes | network.received_bytes | Se asigna directamente desde el campo de registro sin procesar source.bytes de los eventos FLOW. |
source.ip | principal.ip, principal.asset.ip | Se asigna directamente desde el campo de registro sin procesar source.ip de los eventos FLOW. |
source.mac | principal.mac | Se asigna directamente desde el campo de registro sin procesar source.mac de los eventos FLOW. |
source.port | principal.port | Se asigna directamente desde el campo de registro sin procesar source.port de los eventos FLOW. |
status | 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 de 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 de la matriz tls.client.supported_ciphers se procesa y se asigna a la matriz 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 (INBOUND) / target.url (OUTBOUND) | Asignación basada en el campo network.direction . Si es ENTRANTE, se asigna a principal.url . Si es SALIENTE, 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 | El valor predeterminado es GENERIC_EVENT . Se han cambiado a tipos de eventos específicos en función de la fuente de registro y los datos de eventos. |
|
metadata.vendor_name | El valor predeterminado es Elastic . |
|
metadata.product_name | El valor predeterminado es PacketBeat . |
|
security_result.action | El valor predeterminado es ALLOW . |
|
metadata.log_type | El valor predeterminado es ELASTIC_PACKETBEATS . |
¿Necesitas más ayuda? Recibe respuestas de los miembros de la comunidad y de los profesionales de Google SecOps.