Coletar registros do Elastic Packet Beats
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
- Faça login no console do Google SecOps.
- Acesse Configurações do SIEM > Agentes de coleta.
- 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
- Faça login no console do Google SecOps.
- Acesse Configurações do SIEM > Perfil.
- 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
- Abra o Prompt de Comando ou o PowerShell como administrador.
Execute este comando:
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
Instalação do Linux
- Abra um terminal com privilégios de root ou sudo.
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
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).
- Localize o arquivo
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
- Faça login no Elastic Packet Beats Management Console.
- Acesse Configurações > Encaminhamento de registros.
- Clique no botão + Adicionar ou Ativar.
- 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.
- Nome: insira um nome descritivo, por exemplo,
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
Crie um arquivo de configuração de pipeline do Logstash:
sudo nano /etc/logstash/conf.d/packetbeat-to-bindplane.conf
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.