Recoger registros de Elastic Packet Beats

Disponible en:

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

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

  1. Inicia sesión en 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.

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

  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 de Linux

  1. Abre un terminal con privilegios de superusuario 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 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

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

  1. Inicia sesión en la consola de gestión de Elastic Packet Beats.
  2. Ve a Ajustes > Reenvío de registros.
  3. Haz clic en el botón + Añadir o Habilitar.
  4. 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.
  5. 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

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

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