Coletar registros do ntopng
Visão geral
Esse analisador extrai os registros de monitoramento de rede ntopng no formato SYSLOG ou JSON. Ele analisa a mensagem de registro, converte os campos relevantes para o formato UDM e enriquece o evento com metadados, como nomes de produtos e fornecedores. O analisador também processa estruturas JSON aninhadas e mapeia campos específicos de ntopng para eventos de rede do UDM, incluindo alertas de fluxo e acesso a recursos do usuário.
Antes de começar
- Verifique se você tem uma instância do Google SecOps.
- Verifique se você tem acesso privilegiado ao ntopng.
Configurar um feed no Google SecOps para ingerir os registros do ntopng
- Acesse Configurações do SIEM > Feeds.
- Clique em Adicionar novo.
- No campo Nome do feed, insira um nome para o feed (por exemplo, ntopng Logs).
- Selecione Webhook como o Tipo de origem.
- Selecione Ntopng como o Tipo de registro.
- Clique em Próxima.
- Opcional: especifique valores para os seguintes parâmetros de entrada:
- Delimitador de divisão: o delimitador usado para separar linhas de registro, como
\n
. - Namespace de recursos: o namespace de recursos.
- Rótulos de ingestão: o rótulo aplicado aos eventos desse feed.
- Delimitador de divisão: o delimitador usado para separar linhas de registro, como
- Clique em Próxima.
- Revise a configuração do feed na tela Finalizar e clique em Enviar.
- Clique em Gerar chave secreta para gerar uma chave secreta para autenticar esse feed.
- Copie e armazene a chave secreta. Não é possível acessar essa chave secreta novamente. Se necessário, você pode gerar uma nova chave secreta, mas essa ação torna a chave secreta anterior obsoleta.
- Na guia Detalhes, copie o URL do endpoint do feed no campo Informações do endpoint. É necessário especificar esse URL de endpoint no aplicativo cliente.
- Clique em Concluído.
Criar uma chave de API para o feed de webhook
Acesse o console do Google Cloud > Credenciais.
Clique em Criar credenciais e, em seguida, selecione Chave de API.
Restrinja o acesso da chave de API à API Google Security Operations.
Especificar o URL do endpoint
- No aplicativo cliente, especifique o URL do endpoint HTTPS fornecido no feed de webhook.
Ative a autenticação especificando a chave de API e a chave secreta como parte do cabeçalho personalizado no seguinte formato:
X-goog-api-key = API_KEY X-Webhook-Access-Key = SECRET
Recomendação: especifique a chave de API como um cabeçalho em vez de especificar no URL.
Se o cliente do webhook não tiver suporte a cabeçalhos personalizados, especifique a chave de API e a chave secreta usando parâmetros de consulta no seguinte formato:
ENDPOINT_URL?key=API_KEY&secret=SECRET
Substitua:
ENDPOINT_URL
: o URL do endpoint do feed.API_KEY
: a chave de API para autenticação no Google Security Operations.SECRET
: a chave secreta gerada para autenticar o feed.
Como configurar um webhook no ntopng para o Google SecOps
- Faça login na interface da Web do ntopng.
- Selecione o menu System no menu suspenso.
- Acesse Notificações > Endpoints.
- Clique em adicionar .
- Especifique valores para os seguintes parâmetros de entrada:
- Nome do endpoint: forneça um nome exclusivo e descritivo (por exemplo, Google SecOps).
- Tipo de endpoint: selecione Webhook na lista.
- URL do webhook: insira o ENDPOINT_URL do Google SecOps com API_KEY e SECRET.
- Clique em Adicionar.
- Acesse Notificações > Destinatários.
- Clique em adicionar .
- Especifique valores para os seguintes parâmetros de entrada:
- Nome do destinatário: forneça um nome exclusivo e descritivo (por exemplo, Google SecOps).
- Selecionar endpoint: selecione o endpoint criado anteriormente.
- Gravidade: selecione a gravidade a ser enviada ao Google SecOps (por exemplo, Informações, Alerta e Erro).
- Filtro de categoria: selecione o que enviar ao Google SecOps.
- Clique em Testar destinatário para verificar a conexão.
- Clique em Adicionar para salvar o webhook.
Como configurar assinantes de recursos de webhook do ntopng
- Acesse Pools.
Selecione o recurso para compartilhar os eventos.
Clique no ícone de lápis na coluna Ações.
Clique no menu suspenso Destinatários.
Selecione o destinatário do webhook do Google SecOps.
Clique em Editar para salvar a configuração.
Repita o processo para outros recursos.
Tabela de mapeamento do UDM
Campo de registro | Mapeamento do UDM | Lógica |
---|---|---|
action |
security_result.detection_fields.key=action , security_result.detection_fields.value=%{action} |
O valor de action do registro bruto é mapeado para um objeto security_result.detection_fields com a chave "action". |
alert_generation.host_info.broadcast_domain_host |
security_result.detection_fields.key=host_info broadcast_domain_host , security_result.detection_fields.value=%{alert_generation.host_info.broadcast_domain_host} |
O valor de alert_generation.host_info.broadcast_domain_host do JSON aninhado é mapeado para um objeto security_result.detection_fields com a chave "host_info broadcast_domain_host". |
alert_generation.host_info.dhcpHost |
security_result.detection_fields.key=host_info dhcpHost , security_result.detection_fields.value=%{alert_generation.host_info.dhcpHost} |
O valor de alert_generation.host_info.dhcpHost do JSON aninhado é mapeado para um objeto security_result.detection_fields com a chave "host_info dhcpHost". |
alert_generation.host_info.is_blacklisted |
security_result.detection_fields.key=host_info is_blacklisted , security_result.detection_fields.value=%{alert_generation.host_info.is_blacklisted} |
O valor de alert_generation.host_info.is_blacklisted do JSON aninhado é mapeado para um objeto security_result.detection_fields com a chave "host_info is_blacklisted". |
alert_generation.host_info.is_broadcast |
security_result.detection_fields.key=host_info is_broadcast , security_result.detection_fields.value=%{alert_generation.host_info.is_broadcast} |
O valor de alert_generation.host_info.is_broadcast do JSON aninhado é mapeado para um objeto security_result.detection_fields com a chave "host_info is_broadcast". |
alert_generation.host_info.is_multicast |
security_result.detection_fields.key=host_info is_multicast , security_result.detection_fields.value=%{alert_generation.host_info.is_multicast} |
O valor de alert_generation.host_info.is_multicast do JSON aninhado é mapeado para um objeto security_result.detection_fields com a chave "host_info is_multicast". |
alert_generation.host_info.localhost |
security_result.detection_fields.key=host_info localhost , security_result.detection_fields.value=%{alert_generation.host_info.localhost} |
O valor de alert_generation.host_info.localhost do JSON aninhado é mapeado para um objeto security_result.detection_fields com a chave "host_info localhost". |
alert_generation.host_info.privatehost |
security_result.detection_fields.key=host_info privatehost , security_result.detection_fields.value=%{alert_generation.host_info.privatehost} |
O valor de alert_generation.host_info.privatehost do JSON aninhado é mapeado para um objeto security_result.detection_fields com a chave "host_info privatehost". |
alert_generation.host_info.systemhost |
security_result.detection_fields.key=host_info systemhost , security_result.detection_fields.value=%{alert_generation.host_info.systemhost} |
O valor de alert_generation.host_info.systemhost do JSON aninhado é mapeado para um objeto security_result.detection_fields com a chave "host_info systemhost". |
alert_generation.script_key |
security_result.category_details=%{alert_generation.script_key} |
O valor de alert_generation.script_key do JSON aninhado é mapeado para security_result.category_details . |
alert_generation.subdir |
security_result.detection_fields.key=alert_generation_subdir , security_result.detection_fields.value=%{alert_generation.subdir} |
O valor de alert_generation.subdir do JSON aninhado é mapeado para um objeto security_result.detection_fields com a chave "alert_generation_subdir". |
alert_id |
security_result.detection_fields.key=alert_id , security_result.detection_fields.value=%{alert_id} |
O valor de alert_id do registro bruto é mapeado para um objeto security_result.detection_fields com a chave "alert_id". |
alerts_map |
security_result.detection_fields.key=alerts_map , security_result.detection_fields.value=%{alerts_map} |
O valor de alerts_map do registro bruto é mapeado para um objeto security_result.detection_fields com a chave "alerts_map". |
cli2srv_bytes |
network.sent_bytes |
O valor de cli2srv_bytes do registro bruto é convertido em um número inteiro sem sinal e mapeado para network.sent_bytes . |
cli_asn |
principal.resource.attribute.labels.key=cli_asn , principal.resource.attribute.labels.value=%{cli_asn} |
O valor de cli_asn do registro bruto é convertido em uma string e mapeado para um objeto principal.resource.attribute.labels com a chave "cli_asn". |
cli_blacklisted |
principal.resource.attribute.labels.key=cli_blacklisted , principal.resource.attribute.labels.value=%{cli_blacklisted} |
O valor de cli_blacklisted do registro bruto é convertido em uma string e mapeado para um objeto principal.resource.attribute.labels com a chave "cli_blacklisted". |
cli_city_name |
principal.location.city |
O valor de cli_city_name do registro bruto é mapeado para principal.location.city . |
cli_continent_name |
principal.resource.attribute.labels.key=cli_continent_name , principal.resource.attribute.labels.value=%{cli_continent_name} |
O valor de cli_continent_name do registro bruto é mapeado para um objeto principal.resource.attribute.labels com a chave "cli_continent_name". |
cli_country_name |
principal.location.country_or_region |
O valor de cli_country_name do registro bruto é mapeado para principal.location.country_or_region . |
cli_host_pool_id |
principal.resource.attribute.labels.key=cli_host_pool_id , principal.resource.attribute.labels.value=%{cli_host_pool_id} |
O valor de cli_host_pool_id do registro bruto é convertido em uma string e mapeado para um objeto principal.resource.attribute.labels com a chave "cli_host_pool_id". |
cli_ip |
principal.ip , principal.asset.ip |
O valor de cli_ip do registro bruto é mapeado para principal.ip e principal.asset.ip . |
cli_localhost |
principal.resource.attribute.labels.key=cli_localhost , principal.resource.attribute.labels.value=%{cli_localhost} |
O valor de cli_localhost do registro bruto é convertido em uma string e mapeado para um objeto principal.resource.attribute.labels com a chave "cli_localhost". |
cli_location |
principal.location.name |
O valor de cli_location do registro bruto é convertido em uma string. Se não for "0", será mapeado para principal.location.name . |
cli_name |
principal.hostname , principal.asset.hostname |
O valor de cli_name do registro bruto é mapeado para principal.hostname e principal.asset.hostname . |
cli_network |
principal.resource.attribute.labels.key=cli_network , principal.resource.attribute.labels.value=%{cli_network} |
O valor de cli_network do registro bruto é convertido em uma string e mapeado para um objeto principal.resource.attribute.labels com a chave "cli_network". |
cli_port |
principal.port |
O valor de cli_port do registro bruto é convertido em um número inteiro e mapeado para principal.port . |
entity_id |
principal.resource.attribute.labels.key=entity_id , principal.resource.attribute.labels.value=%{entity_id} |
O valor de entity_id do registro bruto é convertido em uma string e mapeado para um objeto principal.resource.attribute.labels com a chave "entity_id". |
entity_val |
principal.resource.attribute.labels.key=entity_val , principal.resource.attribute.labels.value=%{entity_val} |
O valor de entity_val do registro bruto é mapeado para um objeto principal.resource.attribute.labels com a chave "entity_val", a menos que seja igual ao valor de ip . |
event.type |
metadata.event_type |
Determinado pela lógica do analisador com base na presença dos campos principal , target e network . Valores possíveis: NETWORK_FLOW , NETWORK_UNCATEGORIZED , USER_RESOURCE_ACCESS , GENERIC_EVENT . |
first_seen |
principal.asset.first_seen_time |
O valor de first_seen do registro bruto é convertido em uma string, analisado como milissegundos desde a época e mapeado para principal.asset.first_seen_time . |
flow_risk_bitmap |
security_result.detection_fields.key=flow_risk_bitmap , security_result.detection_fields.value=%{flow_risk_bitmap} |
O valor de flow_risk_bitmap do registro bruto é convertido em uma string e mapeado para um objeto security_result.detection_fields com a chave "flow_risk_bitmap". |
granularity |
security_result.detection_fields.key=granularity , security_result.detection_fields.value=%{granularity} |
O valor de granularity do registro bruto é convertido em uma string e mapeado para um objeto security_result.detection_fields com a chave "granularidade". |
hash_entry_id |
security_result.detection_fields.key=hash_entry_id , security_result.detection_fields.value=%{hash_entry_id} |
O valor de hash_entry_id do JSON aninhado é mapeado para um objeto security_result.detection_fields com a chave "hash_entry_id". |
host_ip |
principal.ip , principal.asset.ip |
O endereço IP extraído da parte <INT>Oct 20 15:34:53 1.1.1.1 da mensagem é mapeado para principal.ip e principal.asset.ip . |
ifid |
principal.asset_id |
O valor de ifid do registro bruto é convertido em uma string e mapeado para principal.asset_id com o prefixo "ifid: ". |
ip |
principal.ip , principal.asset.ip ou target.ip , target.asset.ip |
Se is_client for verdadeiro, o valor de ip do registro bruto será mapeado para principal.ip e principal.asset.ip . Se is_server for verdadeiro, ele será mapeado para target.ip e target.asset.ip . |
is_cli_attacker |
security_result.detection_fields.key=is_cli_attacker , security_result.detection_fields.value=%{is_cli_attacker} |
O valor de is_cli_attacker do registro bruto é convertido em uma string e mapeado para um objeto security_result.detection_fields com a chave "is_cli_attacker". |
is_cli_victim |
security_result.detection_fields.key=is_cli_victim , security_result.detection_fields.value=%{is_cli_victim} |
O valor de is_cli_victim do registro bruto é convertido em uma string e mapeado para um objeto security_result.detection_fields com a chave "is_cli_victim". |
is_flow_alert |
security_result.detection_fields.key=is_flow_alert , security_result.detection_fields.value=%{is_flow_alert} , security_result.detection_fields.key=alert type , security_result.detection_fields.value=flow |
O valor de is_flow_alert do registro bruto é convertido em uma string e mapeado para um objeto security_result.detection_fields com a chave "is_flow_alert". Se is_flow_alert for verdadeiro, um objeto security_result.detection_fields com a chave "alert type" e o valor "flow" também será criado. |
is_srv_attacker |
security_result.detection_fields.key=is_srv_attacker , security_result.detection_fields.value=%{is_srv_attacker} |
O valor de is_srv_attacker do registro bruto é convertido em uma string e mapeado para um objeto security_result.detection_fields com a chave "is_srv_attacker". |
is_srv_victim |
security_result.detection_fields.key=is_srv_victim , security_result.detection_fields.value=%{is_srv_victim} |
O valor de is_srv_victim do registro bruto é convertido em uma string e mapeado para um objeto security_result.detection_fields com a chave "is_srv_victim". |
metadata.product_name |
metadata.product_name=NTOPNG |
Fixado em "NTOPNG". |
metadata.vendor_name |
metadata.vendor_name=%{vendor_name} |
O valor de vendor_name da mensagem é mapeado para metadata.vendor_name . |
name |
principal.hostname , principal.asset.hostname ou target.hostname , target.asset.hostname |
Se is_client for verdadeiro, o valor de name do registro bruto será mapeado para principal.hostname e principal.asset.hostname . Se is_server for verdadeiro, ele será mapeado para target.hostname e target.asset.hostname . |
ntopng_key |
security_result.detection_fields.key=ntopng_key , security_result.detection_fields.value=%{ntopng_key} |
O valor de ntopng.key (renomeado para ntopng_key ) do JSON aninhado é mapeado para um objeto security_result.detection_fields com a chave "ntopng_key". |
observation_point_id |
observer.asset_id |
O valor de observation_point_id do registro bruto é convertido em uma string. Se não for "0", será mapeado para observer.asset_id com o prefixo "id: ". |
pool_id |
principal.resource.attribute.labels.key=pool_id , principal.resource.attribute.labels.value=%{pool_id} |
O valor de pool_id do registro bruto é convertido em uma string e mapeado para um objeto principal.resource.attribute.labels com a chave "pool_id". |
probe_ip |
intermediary.ip |
O valor de probe_ip do registro bruto é mapeado para intermediary.ip . |
proto.confidence |
security_result.confidence_details |
O valor de proto.confidence do registro bruto é convertido em uma string e mapeado para security_result.confidence_details . |
proto.http.last_method |
network.http.method |
O valor de proto.http.last_method do registro bruto é mapeado para network.http.method . |
proto.http.last_return_code |
network.http.response_code |
O valor de proto.http.last_return_code do registro bruto é convertido em um número inteiro e mapeado para network.http.response_code . |
proto.http.last_server_name |
network.tls.client.server_name |
O valor de proto.http.server_name do registro bruto é mapeado para network.tls.client.server_name . |
proto.http.last_url |
network.http.referral_url |
O valor de proto.http.last_url do registro bruto é mapeado para network.http.referral_url . |
proto.http.last_user_agent |
network.http.user_agent |
O valor de proto.http.last_user_agent do registro bruto é mapeado para network.http.user_agent . |
proto.http.server_name |
network.tls.client.server_name |
O valor de proto.http.server_name do registro bruto é mapeado para network.tls.client.server_name . |
proto.l4 |
network.ip_protocol |
O valor de proto.l4 do registro bruto é mapeado para network.ip_protocol . |
proto_ndpi |
additional.fields.key=proto ndpi , additional.fields.value.string_value=%{proto_ndpi} , network.application_protocol |
O valor de proto.ndpi (renomeado para proto_ndpi ) do registro bruto é mapeado para um objeto additional.fields com a chave "proto ndpi". Ele também é usado para determinar o valor de network.application_protocol com base em palavras-chave como "NTP" e "HTTP". |
proto_ndpi_app |
principal.application |
O valor de proto_ndpi_app do registro bruto é mapeado para principal.application . |
proto_ndpi_breed |
security_result.detection_fields.key=proto_ndpi_breed , security_result.detection_fields.value=%{proto_ndpi_breed} |
O valor de proto_ndpi_breed do registro bruto é convertido em uma string e mapeado para um objeto security_result.detection_fields com a chave "proto_ndpi_breed". |
proto_ndpi_cat |
security_result.category_details |
O valor de proto_ndpi_cat do registro bruto é mapeado para security_result.category_details . |
proto_ndpi_cat_id |
security_result.detection_fields.key=proto_ndpi_cat_id , security_result.detection_fields.value=%{proto_ndpi_cat_id} |
O valor de proto_ndpi_cat_id do registro bruto é convertido em uma string e mapeado para um objeto security_result.detection_fields com a chave "proto_ndpi_cat_id". |
score |
security_result.detection_fields.key=score , security_result.detection_fields.value=%{score} |
O valor de score do registro bruto é convertido em uma string e mapeado para um objeto security_result.detection_fields com a chave "score". |
srv2cli_bytes |
network.received_bytes |
O valor de srv2cli_bytes do registro bruto é convertido em um número inteiro sem sinal e mapeado para network.received_bytes . |
srv_asn |
target.resource.attribute.labels.key=srv_asn , target.resource.attribute.labels.value=%{srv_asn} |
O valor de srv_asn do registro bruto é convertido em uma string e mapeado para um objeto target.resource.attribute.labels com a chave "srv_asn". |
srv_blacklisted |
target.resource.attribute.labels.key=srv_blacklisted , target.resource.attribute.labels.value=%{srv_blacklisted} |
O valor de srv_blacklisted do registro bruto é convertido em uma string e mapeado para um objeto target.resource.attribute.labels com a chave "srv_blacklisted". |
srv_city_name |
target.location.city |
O valor de srv_city_name do registro bruto é mapeado para target.location.city . |
srv_continent_name |
target.resource.attribute.labels.key=srv_continent_name , target.resource.attribute.labels.value=%{srv_continent_name} |
O valor de srv_continent_name do registro bruto é mapeado para um objeto target.resource.attribute.labels com a chave "srv_continent_name". |
srv_country_name |
target.location.country_or_region |
O valor de srv_country_name do registro bruto é mapeado para target.location.country_or_region . |
srv_host_pool_id |
target.resource.attribute.labels.key=srv_host_pool_id , target.resource.attribute.labels.value=%{srv_host_pool_id} |
O valor de srv_host_pool_id do registro bruto é convertido em uma string e mapeado para um objeto target.resource.attribute.labels com a chave "srv_host_pool_id". |
srv_ip |
target.ip , target.asset.ip |
O valor de srv_ip do registro bruto é mapeado para target.ip e target.asset.ip . |
srv_localhost |
target.resource.attribute.labels.key=srv_localhost , target.resource.attribute.labels.value=%{srv_localhost} |
O valor de srv_localhost do registro bruto é convertido em uma string e mapeado para um objeto target.resource.attribute.labels com a chave "srv_localhost". |
srv_location |
target.location.name |
O valor de srv_location do registro bruto é convertido em uma string. Se não for "0", será mapeado para target.location.name . |
srv_location_lat |
target.location.region_coordinates.latitude |
O valor de srv_location_lat do registro bruto é mapeado para target.location.region_coordinates.latitude . |
srv_location_lon |
target.location.region_coordinates.longitude |
O valor de srv_location_lon do registro bruto é mapeado para target.location.region_coordinates.longitude . |
srv_name |
target.hostname , target.asset.hostname |
O valor de srv_name do registro bruto é mapeado para target.hostname e target.asset.hostname . |
srv_network |
target.resource.attribute.labels.key=srv_network , target.resource.attribute.labels.value=%{srv_network} |
O valor de srv_network do registro bruto é convertido em uma string e mapeado para um objeto target.resource.attribute.labels com a chave "srv_network". |
srv_port |
target.port |
O valor de srv_port do registro bruto é convertido em um número inteiro e mapeado para target.port . |
tstamp |
additional.fields.key=tstamp , additional.fields.value.string_value=%{tstamp} |
O valor de tstamp do registro bruto é convertido em uma string e mapeado para um objeto additional.fields com a chave "tstamp". |
vlan_id |
principal.resource.attribute.labels.key=vlan_id , principal.resource.attribute.labels.value=%{vlan_id} |
O valor de vlan_id do registro bruto é convertido em uma string e mapeado para um objeto principal.resource.attribute.labels com a chave "vlan_id". |
when |
metadata.event_timestamp |
O valor de when do registro bruto é analisado como um carimbo de data/hora e mapeado para metadata.event_timestamp . |
Alterações
2024-02-01
- Correção de bugs:
- A mudança de "=>" para ":" no comentário de cabeçalho do arquivo de configuração.
2023-11-16
- Parser recém-criado.