Recolha registos do Elastic Packet Beats
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
- Inicie sessão na consola Google SecOps.
- Aceda a Definições do SIEM > Agentes de recolha.
- 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
- Inicie sessão na consola Google SecOps.
- Aceda a Definições do SIEM > Perfil.
- 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
- Abra a Linha de comandos ou o PowerShell como administrador.
Execute o seguinte 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 raiz ou sudo.
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
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).
- Localize o ficheiro
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
- Substitua a porta e o endereço IP conforme necessário na sua infraestrutura.
- Substitua
YOUR_CUSTOMER_ID
pelo ID de cliente real. - Atualize
/path/to/ingestion-authentication-file.json
para o caminho onde o ficheiro de autenticação foi guardado na secção Obtenha o ficheiro de autenticação de carregamento do Google SecOps.
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
- Inicie sessão na Elastic Packet Beats Management Console.
- Aceda a Definições > Encaminhamento de registos.
- Clique no botão + Adicionar ou Ativar.
- 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.
- Nome: introduza um nome descritivo (por exemplo,
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
Crie um ficheiro de configuração do 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 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.