Recolha registos do Elastic Packet Beats

Compatível com:

Este documento explica como carregar registos do Elastic Packet Beats para o Google Security Operations através do Bindplane. O analisador primeiro inicializa os valores predefinidos para vários campos encontrados nos registos do Elastic Packet Beats. Em seguida, extrai dados das mensagens de registo através de uma combinação de padrões grok e filtros json, realiza conversões de tipos 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, flow, dns, http, tls, dhcpv4).

Antes de começar

Certifique-se de que cumpre os seguintes pré-requisitos:

  • Uma instância do Google SecOps.
  • Um anfitrião Windows 2016 ou posterior, ou Linux com systemd.
  • Se estiver a ser executado através de um proxy, certifique-se de que as portas da firewall estão abertas de acordo com os requisitos do agente Bindplane.
  • Acesso privilegiado à consola de gestão ou ao dispositivo Elastic Packet Beats.
  • O Logstash está instalado e configurado.

Obtenha o ficheiro de autenticação de carregamento do Google SecOps

  1. Inicie sessão na consola Google SecOps.
  2. Aceda a Definições do SIEM > Agentes de recolha.
  3. Transfira o ficheiro de autenticação de carregamento.
    • Guarde o ficheiro de forma segura no sistema onde o Bindplane vai ser instalado.

Obtenha o ID de cliente do Google SecOps

  1. Inicie sessão na consola Google SecOps.
  2. Aceda a Definições do SIEM > Perfil.
  3. Copie e guarde o ID do cliente da secção Detalhes da organização.

Instale o agente do Bindplane

Instale o agente do Bindplane no seu sistema operativo Windows ou Linux de acordo com as seguintes instruções.

Instalação do Windows

  1. Abra a Linha de comandos ou o PowerShell como administrador.
  2. Execute o seguinte 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 raiz ou sudo.
  2. Execute o seguinte comando:

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

Recursos de instalação adicionais

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

Configure o agente Bindplane para carregar o Syslog e enviá-lo para o Google SecOps

  1. Aceda ao ficheiro de configuração:

    • Localize o ficheiro config.yaml. Normalmente, encontra-se no diretório /etc/bindplane-agent/ no Linux ou no diretório de instalação no Windows.
    • Abra o ficheiro com um editor de texto (por exemplo, nano, vi ou Bloco de notas).
  2. Edite o ficheiro 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
    

Reinicie o agente do Bindplane para aplicar as alterações

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

    sudo systemctl restart observiq-otel-collector
    
  • Para reiniciar o agente Bindplane no Windows, pode usar a consola Serviços ou introduzir o seguinte comando:

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

Configure o encaminhamento de Syslog no Elastic Packet Beats

Uma vez que o Packetbeat não suporta a saída syslog direta, tem de usar o Logstash como intermediário.

Configure o Packetbeat para enviar registos para o Logstash

  1. Inicie sessão na Elastic Packet Beats Management Console.
  2. Aceda a Definições > Encaminhamento de registos.
  3. Clique no botão + Adicionar ou Ativar.
  4. Indique os seguintes detalhes de configuração:
    • Nome: introduza um nome descritivo (por exemplo, Logstash Output).
    • Anfitrião: introduza o endereço IP do servidor Logstash.
    • Porta: introduza 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 uma consistência universal entre sistemas.
    • Aceda à secção Eventos e selecione os tipos de registos relevantes ou todos.
  5. Guarde a configuração.

    Alternativa: edite o ficheiro 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 seu servidor Logstash.

Configure o Logstash para encaminhar para o BindPlane através do Syslog

  1. Crie um ficheiro de configuração do 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 seu agente do BindPlane.

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

    sudo systemctl restart logstash
    

Tabela de mapeamento do UDM

Campo de registo Mapeamento do UDM Lógica
@timestamp metadata.event_timestamp Mapeado diretamente a partir do campo de registo não processado @timestamp.
agent.hostname observer.hostname Mapeado diretamente a partir do campo de registo não processado agent.hostname.
agent.id observer.asset_id Concatenado com agent.type para formar o campo observer.asset_id.
agent.type observer.application Mapeado diretamente a partir do campo de registo não processado agent.type.
agent.version observer.platform_version Mapeado diretamente a partir do campo de registo não processado agent.version.
audit_category security_result.category_details Mapeado diretamente a partir do campo de registo não processado audit_category.
audit_cluster_name additional.fields.audit_cluster_name.value.string_value Mapeado diretamente a partir do campo de registo não processado audit_cluster_name.
audit_node_host_address observer.ip Mapeado diretamente a partir do campo de registo não processado audit_node_host_address.
audit_node_id additional.fields.audit_node_id.value.string_value Mapeado diretamente a partir do campo de registo não processado audit_node_id.
audit_node_name additional.fields.audit_node_name.value.string_value Mapeado diretamente a partir do campo de registo não processado audit_node_name.
audit_request_effective_user observer.user.userid Mapeado diretamente a partir do campo de registo não processado audit_request_effective_user.
audit_request_initiating_user additional.fields.audit_request_initiating_user.value.string_value Mapeado diretamente a partir do campo de registo não processado audit_request_initiating_user.
audit_request_remote_address observer.ip Mapeado diretamente a partir do campo de registo não processado audit_request_remote_address se for diferente de audit_node_host_address.
client.bytes network.received_bytes (INBOUND) / network.sent_bytes (OUTBOUND) Mapeada com base no campo network.direction. Se for INBOUND, é mapeado para network.received_bytes. Se for OUTBOUND, é mapeado para network.sent_bytes.
client.ip target.ip (INBOUND) / principal.ip (OUTBOUND) Mapeada com base no campo network.direction. Se for INBOUND, é mapeado para target.ip. Se for OUTBOUND, é mapeado para principal.ip.
client.port target.port (INBOUND) / principal.port (OUTBOUND) Mapeada com base no campo network.direction. Se for INBOUND, é mapeado para target.port. Se for OUTBOUND, é mapeado para principal.port.
cluster.uuid additional.fields.uuid.value.string_value Mapeado diretamente a partir do campo de registo não processado cluster.uuid.
componente additional.fields.component.value.string_value Mapeado diretamente a partir do campo de registo não processado component.
destination.bytes network.sent_bytes Mapeado diretamente a partir do campo de registo não processado destination.bytes para eventos FLOW.
destination.ip target.ip Mapeado diretamente a partir do campo de registo não processado destination.ip se network.direction não for INBOUND nem OUTBOUND.
destination.mac target.mac Mapeado diretamente a partir do campo de registo não processado destination.mac para eventos FLOW.
destination.port target.port Mapeado diretamente a partir do campo de registo não processado destination.port para eventos FLOW.
dhcpv4.assigned_ip network.dhcp.requested_address Mapeado diretamente a partir do campo de registo não processado dhcpv4.assigned_ip.
dhcpv4.client_ip network.dhcp.yiaddr (ACK) / network.dhcp.ciaddr (REQUEST) / source.ip (REQUEST, se dhcpv4.client_ip estiver vazio) Mapeada com base no campo network.dhcp.type. Se for ACK, está mapeado para network.dhcp.yiaddr. Se for REQUEST, está mapeado para network.dhcp.ciaddr. Se REQUEST e dhcpv4.client_ip estiverem vazios, é mapeado para source.ip.
dhcpv4.client_mac network.dhcp.client_identifier Mapeado diretamente a partir do campo de registo não processado dhcpv4.client_mac após a conversão em 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 é mapeado diretamente. Caso contrário, é mapeado para UNKNOWN_OPCODE.
dhcpv4.option.hostname network.dhcp.client_hostname Mapeado diretamente a partir do campo de registo não processado dhcpv4.option.hostname.
dhcpv4.option.ip_address_lease_time_sec network.dhcp.lease_time_seconds Mapeado diretamente a partir do campo de registo não processado dhcpv4.option.ip_address_lease_time_sec após a conversão num número inteiro não assinado.
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 destes, é mapeado para UNKNOWN_MESSAGE_TYPE.
dhcpv4.option.server_identifier network.dhcp.sname Mapeado diretamente a partir do campo de registo não processado dhcpv4.option.server_identifier.
dns.answers.data network.dns.answers.data Mapeado diretamente a partir do campo de registo não processado dns.answers.data.
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 a partir do campo de registo não processado dns.answers.name.
dns.answers.ttl network.dns.answers.ttl Mapeado diretamente a partir do campo de registo não processado dns.answers.ttl após a conversão num número inteiro não assinado.
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 a partir do campo de registo não processado dns.flags.authoritative se for verdadeiro.
dns.flags.recursion_available network.dns.recursion_available Mapeado diretamente a partir do campo de registo não processado dns.flags.recursion_available se for verdadeiro.
dns.flags.recursion_desired network.dns.recursion_desired Mapeado diretamente a partir do campo de registo não processado dns.flags.recursion_desired se for verdadeiro.
dns.flags.truncated_response network.dns.truncated Mapeado diretamente a partir do campo de registo não processado dns.flags.truncated_response se for verdadeiro.
dns.id network.dns.id Mapeado diretamente a partir do campo de registo não processado dns.id após a conversão num número inteiro não assinado.
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 a partir do campo de registo não processado dns.question.name.
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 a partir do campo de registo não processado event.dataset.
flow.final Usado para determinar se o fluxo é final. Caso contrário, o evento é ignorado.
flow.id network.session_id Mapeado diretamente a partir do campo de registo não processado flow.id para eventos FLOW.
headers.accept_encoding security_result.about.labels.Accept-Encoding Mapeado diretamente a partir do campo de registo não processado headers.accept_encoding.
headers.content_length additional.fields.content_length.value.string_value Mapeado diretamente a partir do campo de registo não processado headers.content_length.
headers.content_type additional.fields.content_type.value.string_value Mapeado diretamente a partir do campo de registo não processado headers.content_type.
headers.http_accept additional.fields.http_accept.value.string_value Mapeado diretamente a partir do campo de registo não processado headers.http_accept.
headers.http_host principal.hostname, principal.asset.hostname Mapeado diretamente a partir do campo de registo não processado headers.http_host.
headers.http_user_agent network.http.user_agent Mapeado diretamente a partir do campo de registo não processado headers.http_user_agent.
headers.request_method network.http.method Mapeado diretamente a partir do campo de registo não processado headers.request_method.
headers.x_b3_parentspanid additional.fields.x_b3_parentspanid.value.string_value Mapeado diretamente a partir do campo de registo não processado headers.x_b3_parentspanid.
headers.x_b3_sampled additional.fields.x_b3_sampled.value.string_value Mapeado diretamente a partir do campo de registo não processado headers.x_b3_sampled.
headers.x_envoy_attempt_count security_result.about.labels.x_envoy_attempt_count Mapeado diretamente a partir do campo de registo não processado headers.x_envoy_attempt_count.
headers.x_envoy_original_path additional.fields.x_envoy_original_path.value.string_value Mapeado diretamente a partir do campo de registo não processado headers.x_envoy_original_path.
headers.x_forwarded_client_cert additional.fields.client_cert.value.string_value Mapeado diretamente a partir do campo de registo não processado headers.x_forwarded_client_cert.
headers.x_forwarded_for principal.ip, principal.asset.ip Mapeado diretamente a partir do campo de registo não processado headers.x_forwarded_for após a extração do endereço IP através do grok.
headers.x_forwarded_proto additional.fields.x_forwarded_proto.value.string_value Mapeado diretamente a partir do campo de registo não processado headers.x_forwarded_proto.
headers.x_request_id additional.fields.x_request_id.value.string_value Mapeado diretamente a partir do campo de registo não processado headers.x_request_id.
anfitrião principal.ip, principal.asset.ip Mapeado diretamente a partir do campo de registo não processado host após a extração do endereço IP através do grok.
http.request.method network.http.method Mapeado diretamente a partir do campo de registo não processado http.request.method.
nível security_result.severity Mapeado para security_result.severity com base no valor de level. O mapeamento é o seguinte: INFO -> INFORMATIONAL, ERROR -> ERROR, WARNING -> LOW.
registador additional.fields.logger.value.string_value Mapeado diretamente a partir do campo de registo não processado logger.
método Usado para determinar se o evento é um evento DNS.
msg security_result.description Mapeado diretamente a partir do campo de registo não processado msg após a remoção das aspas duplas.
network.community_id network.community_id Mapeado diretamente a partir do campo de registo não processado network.community_id.
network.direction network.direction Mapeado diretamente a partir do campo de registo não processado network.direction após a conversão para maiúsculas. Se o valor for INGRESS ou INBOUND, é mapeado para INBOUND. Se o valor for EGRESS ou OUTBOUND, é mapeado para OUTBOUND.
network.protocol network.application_protocol Mapeado diretamente a partir do campo de registo não processado network.protocol.
network.transport network.ip_protocol Mapeado diretamente a partir do campo de registo não processado network.transport para eventos TLS.
server.bytes network.sent_bytes (INBOUND) / network.received_bytes (OUTBOUND) Mapeada com base no campo network.direction. Se for INBOUND, é mapeado para network.sent_bytes. Se for OUTBOUND, é mapeado para network.received_bytes.
server.domain principal.hostname, principal.asset.hostname (INBOUND) / target.hostname, target.asset.hostname (OUTBOUND) Mapeada com base no campo network.direction. Se for INBOUND, é mapeado para principal.hostname. Se for OUTBOUND, é mapeado para target.hostname.
server.ip principal.ip, principal.asset.ip (INBOUND) / target.ip, target.asset.ip (OUTBOUND) Mapeada com base no campo network.direction. Se for INBOUND, é mapeado para principal.ip. Se for OUTBOUND, é mapeado para target.ip.
server.port principal.port (INBOUND) / target.port (OUTBOUND) Mapeada com base no campo network.direction. Se for INBOUND, é mapeado para principal.port. Se for OUTBOUND, é mapeado para target.port.
source.bytes network.received_bytes Mapeado diretamente a partir do campo de registo não processado source.bytes para eventos FLOW.
source.ip principal.ip, principal.asset.ip Mapeado diretamente a partir do campo de registo não processado source.ip para eventos FLOW.
source.mac principal.mac Mapeado diretamente a partir do campo de registo não processado source.mac para eventos FLOW.
source.port principal.port Mapeado diretamente a partir do campo de registo não processado source.port para eventos FLOW.
estado 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 a partir do campo de registo não processado tls.client.ja3.
tls.client.server_name network.tls.client.server_name Mapeado diretamente a partir do campo de registo não processado tls.client.server_name.
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 a partir do campo de registo não processado tls.cipher.
tls.detailed.server_certificate.not_after network.tls.server.certificate.not_after Mapeado diretamente a partir do campo de registo não processado tls.detailed.server_certificate.not_after após a conversão para uma data/hora.
tls.detailed.server_certificate.not_before network.tls.server.certificate.not_before Mapeado diretamente a partir do campo de registo não processado tls.detailed.server_certificate.not_before após a conversão para uma data/hora.
tls.detailed.server_certificate.serial_number network.tls.server.certificate.serial Mapeado diretamente a partir do campo de registo não processado tls.detailed.server_certificate.serial_number.
tls.detailed.server_certificate.version network.tls.server.certificate.version Mapeado diretamente a partir do campo de registo não processado tls.detailed.server_certificate.version após a conversão para uma string.
tls.established network.tls.established Mapeado diretamente a partir do campo de registo não processado tls.established.
tls.next_protocol network.tls.next_protocol Mapeado diretamente a partir do campo de registo não processado tls.next_protocol.
tls.resumed network.tls.resumed Mapeado diretamente a partir do campo de registo não processado tls.resumed.
tls.server.hash.sha1 network.tls.server.certificate.sha1 Mapeado diretamente a partir do campo de registo não processado tls.server.hash.sha1 após a conversão para letras minúsculas.
tls.server.issuer network.tls.server.certificate.issuer Mapeado diretamente a partir do campo de registo não processado tls.server.issuer.
tls.server.subject network.tls.server.certificate.subject Mapeado diretamente a partir do campo de registo não processado tls.server.subject.
tls.version network.tls.version Mapeado diretamente a partir do campo de registo não processado tls.version.
tls.version_protocol network.tls.version_protocol Mapeado diretamente a partir do campo de registo não processado tls.version_protocol.
escrever Usado para determinar se o evento é um evento DNS.
url.full principal.url (INBOUND) / target.url (OUTBOUND) Mapeada com base no campo network.direction. Se for INBOUND, é mapeado para principal.url. Se for OUTBOUND, é mapeado para target.url.
user_id target.user.userid Mapeado diretamente a partir do campo de registo não processado user_id.
user_name target.user.user_display_name Mapeado diretamente a partir do campo de registo não processado user_name.
metadata.event_type Predefinido como GENERIC_EVENT. Alterado para tipos de eventos específicos com base na origem do registo e nos dados de eventos.
metadata.vendor_name Predefinido como Elastic.
metadata.product_name Predefinido como PacketBeat.
security_result.action Predefinido como ALLOW.
metadata.log_type Predefinido como ELASTIC_PACKETBEATS.

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