Coletar registros do Elastic Packet Beats

Compatível com:

Este documento explica como ingerir registros do Elastic Packet Beats no Google Security Operations usando o Bindplane. Primeiro, o analisador inicializa valores padrão para vários campos encontrados nos registros do Elastic Packet Beats. Em seguida, ele extrai dados das mensagens de registro usando uma combinação de padrões grok e filtros json, realiza conversões de tipo de dados e mapeia os campos extraídos para os campos correspondentes no modelo de dados unificado (UDM) com base no tipo de conjunto de dados de eventos (por exemplo, fluxo, dns, http, tls, dhcpv4).

Antes de começar

Verifique se você tem os pré-requisitos a seguir:

  • Uma instância do Google SecOps.
  • Um host Windows 2016 ou mais recente ou Linux com systemd.
  • Se você estiver executando por trás de um proxy, verifique se as portas do firewall estão abertas de acordo com os requisitos do agente do Bindplane.
  • Acesso privilegiado ao console ou dispositivo de gerenciamento do Elastic Packet Beats.
  • O Logstash está instalado e configurado.

Receber o arquivo de autenticação de ingestão do Google SecOps

  1. Faça login no console do Google SecOps.
  2. Acesse Configurações do SIEM > Agentes de coleta.
  3. Baixe o arquivo de autenticação de ingestão.
    • Salve o arquivo de forma segura no sistema em que o Bindplane será instalado.

Receber o ID de cliente do Google SecOps

  1. Faça login no console do Google SecOps.
  2. Acesse Configurações do SIEM > Perfil.
  3. Copie e salve o ID do cliente na seção Detalhes da organização.

Instalar o agente do Bindplane

Instale o agente do Bindplane no sistema operacional Windows ou Linux de acordo com as instruções a seguir.

Instalação do Windows

  1. Abra o Prompt de Comando ou o PowerShell como administrador.
  2. Execute este comando:

    msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
    

Instalação do Linux

  1. Abra um terminal com privilégios de root ou sudo.
  2. Execute este comando:

    sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
    

Outros recursos de instalação

Para mais opções de instalação, consulte o guia de instalação.

Configurar o agente do Bindplane para ingerir o Syslog e enviar ao Google SecOps

  1. Acesse o arquivo de configuração:

    • Localize o arquivo config.yaml. Normalmente, ele fica no diretório /etc/bindplane-agent/ no Linux ou no diretório de instalação no Windows.
    • Abra o arquivo usando um editor de texto (por exemplo, nano, vi ou Bloco de Notas).
  2. Edite o arquivo config.yaml da seguinte forma:

    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
    
    • Substitua a porta e o endereço IP conforme necessário na sua infraestrutura.
    • Substitua YOUR_CUSTOMER_ID pelo ID do cliente real.
    • Atualize /path/to/ingestion-authentication-file.json para o caminho em que o arquivo de autenticação foi salvo na seção Receber arquivo de autenticação de ingestão do Google SecOps.

Reinicie o agente do Bindplane para aplicar as mudanças

  • Para reiniciar o agente do Bindplane em Linux, execute o seguinte comando:

    sudo systemctl restart observiq-otel-collector
    
  • Para reiniciar o agente do Bindplane no Windows, use o console Serviços ou insira o seguinte comando:

    net stop observiq-otel-collector && net start observiq-otel-collector
    

Configurar o encaminhamento do Syslog no Elastic Packet Beats

Como o Packetbeat não oferece suporte à saída direta do syslog, é necessário usar o Logstash como intermediário.

Configurar o Packetbeat para enviar registros ao Logstash

  1. Faça login no Elastic Packet Beats Management Console.
  2. Acesse Configurações > Encaminhamento de registros.
  3. Clique no botão + Adicionar ou Ativar.
  4. Informe os seguintes detalhes de configuração:
    • Nome: insira um nome descritivo, por exemplo, Logstash Output.
    • Host: insira o endereço IP do servidor Logstash.
    • Porta: digite a porta de entrada do Logstash Beats (normalmente 5044).
    • Protocolo: selecione Protocolo Beats.
    • Formato: selecione JSON.
    • Fuso horário: selecione o fuso horário UTC para consistência universal em todos os sistemas.
    • Acesse a seção Eventos e selecione os tipos de registros relevantes ou todos.
  5. Salve a configuração.

    Alternativa: edite packetbeat.yml diretamente

    # /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"]
    

    Substitua LOGSTASH_IP pelo endereço IP do servidor do Logstash.

Configurar o Logstash para encaminhar ao BindPlane usando o Syslog

  1. Crie um arquivo de configuração de pipeline do Logstash:

    sudo nano /etc/logstash/conf.d/packetbeat-to-bindplane.conf
    
  2. Adicione a seguinte configuração:

    # 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}"
      }
    }
    

    Substitua BINDPLANE_IP pelo endereço IP do agente do BindPlane.

  • Reinicie o Logstash para aplicar a configuração:

    sudo systemctl restart logstash
    

Tabela de mapeamento do UDM

Campo de registro Mapeamento do UDM Lógica
@timestamp metadata.event_timestamp Mapeado diretamente do campo @timestamp do registro bruto.
agent.hostname observer.hostname Mapeado diretamente do campo agent.hostname do registro bruto.
agent.id observer.asset_id Concatenado com agent.type para formar o campo observer.asset_id.
agent.type observer.application Mapeado diretamente do campo agent.type do registro bruto.
agent.version observer.platform_version Mapeado diretamente do campo agent.version do registro bruto.
audit_category security_result.category_details Mapeado diretamente do campo audit_category do registro bruto.
audit_cluster_name additional.fields.audit_cluster_name.value.string_value Mapeado diretamente do campo audit_cluster_name do registro bruto.
audit_node_host_address observer.ip Mapeado diretamente do campo audit_node_host_address do registro bruto.
audit_node_id additional.fields.audit_node_id.value.string_value Mapeado diretamente do campo audit_node_id do registro bruto.
audit_node_name additional.fields.audit_node_name.value.string_value Mapeado diretamente do campo audit_node_name do registro bruto.
audit_request_effective_user observer.user.userid Mapeado diretamente do campo audit_request_effective_user do registro bruto.
audit_request_initiating_user additional.fields.audit_request_initiating_user.value.string_value Mapeado diretamente do campo audit_request_initiating_user do registro bruto.
audit_request_remote_address observer.ip Mapeado diretamente do campo de registro bruto audit_request_remote_address se for diferente de audit_node_host_address.
client.bytes network.received_bytes (ENTRADA) / network.sent_bytes (SAÍDA) Mapeado com base no campo network.direction. Se for INBOUND, ele será mapeado para network.received_bytes. Se for OUTBOUND, ele será mapeado para network.sent_bytes.
client.ip target.ip (INBOUND) / principal.ip (OUTBOUND) Mapeado com base no campo network.direction. Se for INBOUND, ele será mapeado para target.ip. Se for OUTBOUND, ele será mapeado para principal.ip.
client.port target.port (INBOUND) / principal.port (OUTBOUND) Mapeado com base no campo network.direction. Se for INBOUND, ele será mapeado para target.port. Se for OUTBOUND, ele será mapeado para principal.port.
cluster.uuid additional.fields.uuid.value.string_value Mapeado diretamente do campo cluster.uuid do registro bruto.
componente additional.fields.component.value.string_value Mapeado diretamente do campo component do registro bruto.
destination.bytes network.sent_bytes Mapeado diretamente do campo destination.bytes do registro bruto para eventos de FLUXO.
destination.ip target.ip Mapeado diretamente do campo de registro bruto destination.ip se network.direction não for INBOUND ou OUTBOUND.
destination.mac target.mac Mapeado diretamente do campo destination.mac do registro bruto para eventos de FLUXO.
destination.port target.port Mapeado diretamente do campo destination.port do registro bruto para eventos de FLUXO.
dhcpv4.assigned_ip network.dhcp.requested_address Mapeado diretamente do campo dhcpv4.assigned_ip do registro bruto.
dhcpv4.client_ip network.dhcp.yiaddr (ACK) / network.dhcp.ciaddr (REQUEST) / source.ip (REQUEST, se dhcpv4.client_ip estiver vazio) Mapeado com base no campo network.dhcp.type. Se for ACK, ele será mapeado para network.dhcp.yiaddr. Se for REQUEST, ele será mapeado para network.dhcp.ciaddr. Se REQUEST e dhcpv4.client_ip estiverem vazios, ele será mapeado para source.ip.
dhcpv4.client_mac network.dhcp.client_identifier Mapeado diretamente do campo de registro bruto dhcpv4.client_mac após a conversão para bytes.
dhcpv4.op_code network.dhcp.opcode Mapeado para network.dhcp.opcode com base no valor de dhcpv4.op_code. Se dhcpv4.op_code for BOOTREPLY ou BOOTREQUEST, o valor será mapeado diretamente. Caso contrário, ele será mapeado para UNKNOWN_OPCODE.
dhcpv4.option.hostname network.dhcp.client_hostname Mapeado diretamente do campo dhcpv4.option.hostname do registro bruto.
dhcpv4.option.ip_address_lease_time_sec network.dhcp.lease_time_seconds Mapeado diretamente do campo de registro bruto dhcpv4.option.ip_address_lease_time_sec depois de convertê-lo em um número inteiro sem sinal.
dhcpv4.option.message_type network.dhcp.type Mapeado para network.dhcp.type com base no valor de dhcpv4.option.message_type. O mapeamento é o seguinte: ack -> ACK, nack -> NAK, discover -> DISCOVER, offer -> OFFER, request -> REQUEST, decline -> DECLINE, release -> RELEASE, info -> INFORM. Se o valor não for um deles, ele será mapeado para UNKNOWN_MESSAGE_TYPE.
dhcpv4.option.server_identifier network.dhcp.sname Mapeado diretamente do campo dhcpv4.option.server_identifier do registro bruto.
dns.answers.data network.dns.answers.data Mapeado diretamente do campo dns.answers.data do registro bruto.
dns.answers.class network.dns.answers.class Mapeado para network.dns.answers.class com base no valor de dns.answers.class. O mapeamento é o seguinte: IN -> 1, NONE -> 254, ANY -> 255.
dns.answers.name network.dns.answers.name Mapeado diretamente do campo dns.answers.name do registro bruto.
dns.answers.ttl network.dns.answers.ttl Mapeado diretamente do campo de registro bruto dns.answers.ttl depois de convertê-lo em um número inteiro sem sinal.
dns.answers.type network.dns.answers.type Mapeado para network.dns.answers.type com base no valor de dns.answers.type. O mapeamento é o seguinte: 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 Mapeado diretamente do campo de registro bruto dns.flags.authoritative se for verdadeiro.
dns.flags.recursion_available network.dns.recursion_available Mapeado diretamente do campo de registro bruto dns.flags.recursion_available se for verdadeiro.
dns.flags.recursion_desired network.dns.recursion_desired Mapeado diretamente do campo de registro bruto dns.flags.recursion_desired se for verdadeiro.
dns.flags.truncated_response network.dns.truncated Mapeado diretamente do campo de registro bruto dns.flags.truncated_response se for verdadeiro.
dns.id network.dns.id Mapeado diretamente do campo de registro bruto dns.id depois de convertê-lo em um número inteiro sem sinal.
dns.question.class network.dns.questions.class Mapeado para network.dns.questions.class com base no valor de dns.question.class. O mapeamento é o seguinte: IN -> 1, NONE -> 254, ANY -> 255.
dns.question.name network.dns.questions.name Mapeado diretamente do campo dns.question.name do registro bruto.
dns.question.type network.dns.questions.type Mapeado para network.dns.questions.type com base no valor de dns.question.type. O mapeamento é o seguinte: 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 na matriz dns.resolved_ip é processado e mapeado para o campo network.dns.additional.data.
dns.response_code network.dns.response_code Mapeado para network.dns.response_code com base no valor de dns.response_code. O mapeamento é o seguinte: 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 Concatenado com status para formar o campo security_result.summary para eventos HTTP.
event.dataset metadata.product_event_type Mapeado diretamente do campo event.dataset do registro bruto.
flow.final Usado para determinar se o fluxo é final. Caso contrário, o evento será descartado.
flow.id network.session_id Mapeado diretamente do campo flow.id do registro bruto para eventos de FLUXO.
headers.accept_encoding security_result.about.labels.Accept-Encoding Mapeado diretamente do campo headers.accept_encoding do registro bruto.
headers.content_length additional.fields.content_length.value.string_value Mapeado diretamente do campo headers.content_length do registro bruto.
headers.content_type additional.fields.content_type.value.string_value Mapeado diretamente do campo headers.content_type do registro bruto.
headers.http_accept additional.fields.http_accept.value.string_value Mapeado diretamente do campo headers.http_accept do registro bruto.
headers.http_host principal.hostname, principal.asset.hostname Mapeado diretamente do campo headers.http_host do registro bruto.
headers.http_user_agent network.http.user_agent Mapeado diretamente do campo headers.http_user_agent do registro bruto.
headers.request_method network.http.method Mapeado diretamente do campo headers.request_method do registro bruto.
headers.x_b3_parentspanid additional.fields.x_b3_parentspanid.value.string_value Mapeado diretamente do campo headers.x_b3_parentspanid do registro bruto.
headers.x_b3_sampled additional.fields.x_b3_sampled.value.string_value Mapeado diretamente do campo headers.x_b3_sampled do registro bruto.
headers.x_envoy_attempt_count security_result.about.labels.x_envoy_attempt_count Mapeado diretamente do campo headers.x_envoy_attempt_count do registro bruto.
headers.x_envoy_original_path additional.fields.x_envoy_original_path.value.string_value Mapeado diretamente do campo headers.x_envoy_original_path do registro bruto.
headers.x_forwarded_client_cert additional.fields.client_cert.value.string_value Mapeado diretamente do campo headers.x_forwarded_client_cert do registro bruto.
headers.x_forwarded_for principal.ip, principal.asset.ip Mapeado diretamente do campo de registro bruto headers.x_forwarded_for após extrair o endereço IP usando grok.
headers.x_forwarded_proto additional.fields.x_forwarded_proto.value.string_value Mapeado diretamente do campo headers.x_forwarded_proto do registro bruto.
headers.x_request_id additional.fields.x_request_id.value.string_value Mapeado diretamente do campo headers.x_request_id do registro bruto.
host principal.ip, principal.asset.ip Mapeado diretamente do campo de registro bruto host após extrair o endereço IP usando grok.
http.request.method network.http.method Mapeado diretamente do campo http.request.method do registro bruto.
level security_result.severity Mapeado para security_result.severity com base no valor de level. O mapeamento é o seguinte: INFO -> INFORMATIONAL, ERROR -> ERROR, WARNING -> LOW.
logger additional.fields.logger.value.string_value Mapeado diretamente do campo logger do registro bruto.
método Usado para determinar se o evento é um evento de DNS.
msg security_result.description Mapeado diretamente do campo de registro bruto msg após a remoção das aspas duplas.
network.community_id network.community_id Mapeado diretamente do campo network.community_id do registro bruto.
network.direction network.direction Mapeado diretamente do campo de registro bruto network.direction após a conversão para maiúsculas. Se o valor for INGRESS ou INBOUND, ele será mapeado para INBOUND. Se o valor for EGRESS ou OUTBOUND, ele será mapeado para OUTBOUND.
network.protocol network.application_protocol Mapeado diretamente do campo network.protocol do registro bruto.
network.transport network.ip_protocol Mapeado diretamente do campo de registro bruto network.transport para eventos TLS.
server.bytes network.sent_bytes (ENTRADA) / network.received_bytes (SAÍDA) Mapeado com base no campo network.direction. Se for INBOUND, ele será mapeado para network.sent_bytes. Se for OUTBOUND, ele será mapeado para network.received_bytes.
server.domain principal.hostname, principal.asset.hostname (INBOUND) / target.hostname, target.asset.hostname (OUTBOUND) Mapeado com base no campo network.direction. Se for INBOUND, ele será mapeado para principal.hostname. Se for OUTBOUND, ele será mapeado para target.hostname.
server.ip principal.ip, principal.asset.ip (INBOUND) / target.ip, target.asset.ip (OUTBOUND) Mapeado com base no campo network.direction. Se for INBOUND, ele será mapeado para principal.ip. Se for OUTBOUND, ele será mapeado para target.ip.
server.port principal.port (INBOUND) / target.port (OUTBOUND) Mapeado com base no campo network.direction. Se for INBOUND, ele será mapeado para principal.port. Se for OUTBOUND, ele será mapeado para target.port.
source.bytes network.received_bytes Mapeado diretamente do campo source.bytes do registro bruto para eventos de FLUXO.
source.ip principal.ip, principal.asset.ip Mapeado diretamente do campo source.ip do registro bruto para eventos de FLUXO.
source.mac principal.mac Mapeado diretamente do campo source.mac do registro bruto para eventos de FLUXO.
source.port principal.port Mapeado diretamente do campo source.port do registro bruto para eventos de FLUXO.
status metadata.description, security_result.summary Mapeado para metadata.description se level estiver vazio. Concatenado com error.message para formar o campo security_result.summary para eventos HTTP e TLS.
tls.client.ja3 network.tls.client.ja3 Mapeado diretamente do campo tls.client.ja3 do registro bruto.
tls.client.server_name network.tls.client.server_name Mapeado diretamente do campo tls.client.server_name do registro bruto.
tls.client.supported_ciphers network.tls.client.supported_ciphers Cada elemento na matriz tls.client.supported_ciphers é processado e mapeado para a matriz network.tls.client.supported_ciphers.
tls.cipher network.tls.cipher Mapeado diretamente do campo tls.cipher do registro bruto.
tls.detailed.server_certificate.not_after network.tls.server.certificate.not_after Mapeado diretamente do campo de registro bruto tls.detailed.server_certificate.not_after após a conversão para um carimbo de data/hora.
tls.detailed.server_certificate.not_before network.tls.server.certificate.not_before Mapeado diretamente do campo de registro bruto tls.detailed.server_certificate.not_before após a conversão para um carimbo de data/hora.
tls.detailed.server_certificate.serial_number network.tls.server.certificate.serial Mapeado diretamente do campo tls.detailed.server_certificate.serial_number do registro bruto.
tls.detailed.server_certificate.version network.tls.server.certificate.version Mapeado diretamente do campo de registro bruto tls.detailed.server_certificate.version depois de convertê-lo em uma string.
tls.established network.tls.established Mapeado diretamente do campo tls.established do registro bruto.
tls.next_protocol network.tls.next_protocol Mapeado diretamente do campo tls.next_protocol do registro bruto.
tls.resumed network.tls.resumed Mapeado diretamente do campo tls.resumed do registro bruto.
tls.server.hash.sha1 network.tls.server.certificate.sha1 Mapeado diretamente do campo de registro bruto tls.server.hash.sha1 depois de convertê-lo para letras minúsculas.
tls.server.issuer network.tls.server.certificate.issuer Mapeado diretamente do campo tls.server.issuer do registro bruto.
tls.server.subject network.tls.server.certificate.subject Mapeado diretamente do campo tls.server.subject do registro bruto.
tls.version network.tls.version Mapeado diretamente do campo tls.version do registro bruto.
tls.version_protocol network.tls.version_protocol Mapeado diretamente do campo tls.version_protocol do registro bruto.
tipo Usado para determinar se o evento é um evento de DNS.
url.full principal.url (INBOUND) / target.url (OUTBOUND) Mapeado com base no campo network.direction. Se for INBOUND, ele será mapeado para principal.url. Se for OUTBOUND, ele será mapeado para target.url.
user_id target.user.userid Mapeado diretamente do campo user_id do registro bruto.
user_name target.user.user_display_name Mapeado diretamente do campo user_name do registro bruto.
metadata.event_type Definido como GENERIC_EVENT por padrão. Mudou para tipos de eventos específicos com base na origem do registro e nos dados de eventos.
metadata.vendor_name Definido como Elastic por padrão.
metadata.product_name Definido como PacketBeat por padrão.
security_result.action Definido como ALLOW por padrão.
metadata.log_type Definido como ELASTIC_PACKETBEATS por padrão.

Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.