Recopila registros de Elastic Packet Beats

Compatible con:

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

  1. Accede a la consola de Google SecOps.
  2. Ve a Configuración de SIEM > Agentes de recopilación.
  3. 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

  1. Accede a 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.

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

  1. Abre el símbolo del sistema 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 en Linux

  1. Abre una terminal con privilegios de raíz 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

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

  1. 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).
  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
        # 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
    

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

  1. Accede a la Consola de administración de Elastic Packet Beats.
  2. Ve a Configuración > Reenvío de registros.
  3. Haz clic en el botón + Agregar o Habilitar.
  4. 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.
  5. 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

  1. Crea un archivo de configuración de canalización de Logstash:

    sudo nano /etc/logstash/conf.d/packetbeat-to-bindplane.conf
    
  2. 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.