Recolha registos do ntopng
Vista geral
Este analisador extrai registos de monitorização de rede ntopng no formato SYSLOG ou JSON. Analisa a mensagem de registo, converte os campos relevantes para o formato UDM e enriquece o evento com metadados, como os nomes dos produtos e dos fornecedores. O analisador também processa estruturas JSON aninhadas e mapeia campos ntopng específicos para eventos de rede UDM, incluindo alertas de fluxo e acesso a recursos do utilizador.
Antes de começar
Certifique-se de que tem os seguintes pré-requisitos:
- Instância do Google SecOps.
- Acesso privilegiado ao ntopng.
Configure feeds
Para configurar um feed, siga estes passos:
- Aceda a Definições do SIEM > Feeds.
- Clique em Adicionar novo feed.
- Na página seguinte, clique em Configurar um único feed.
- No campo Nome do feed, introduza um nome para o feed; por exemplo, Registos Ntopng.
- Selecione Webhook como o Tipo de origem.
- Selecione Ntopng como o Tipo de registo.
- Clicar em Seguinte.
- Opcional: especifique valores para os seguintes parâmetros de entrada:
- Delimitador de divisão: o delimitador usado para separar linhas de registo, como
\n
.
- Delimitador de divisão: o delimitador usado para separar linhas de registo, como
- Clicar em Seguinte.
- Reveja a configuração do feed no ecrã Finalizar e, de seguida, clique em Enviar.
- Clique em Gerar chave secreta para gerar uma chave secreta para autenticar este feed.
- Copie e armazene a chave secreta. Não pode ver esta chave secreta novamente. Se necessário, pode regenerar uma nova chave secreta, mas esta ação torna a chave secreta anterior obsoleta.
- No separador Detalhes, copie o URL do ponto final do feed do campo Informações do ponto final. Tem de especificar este URL do ponto final na sua aplicação cliente.
- Clique em Concluído.
Crie uma chave da API para o feed de webhook
Aceda à Google Cloud consola > Credenciais.
Clique em Criar credenciais e, de seguida, selecione Chave de API.
Restrinja o acesso da chave de API à API Google Security Operations.
Especifique o URL do ponto final
- Na aplicação cliente, especifique o URL do ponto final HTTPS fornecido no feed do webhook.
Ative a autenticação especificando a chave da 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 da API como um cabeçalho em vez de a especificar no URL.
Se o seu cliente de webhook não suportar cabeçalhos personalizados, pode especificar a chave da API e a chave secreta através de parâmetros de consulta no seguinte formato:
ENDPOINT_URL?key=API_KEY&secret=SECRET
Substitua o seguinte:
ENDPOINT_URL
: o URL do ponto final do feed.API_KEY
: a chave da API para autenticar no Google Security Operations.SECRET
: a chave secreta que gerou para autenticar o feed.
Configurar um webhook no ntopng para o Google SecOps
- Inicie sessão na interface Web do ntopng.
- Selecione o menu Sistema no menu pendente.
- Aceda a Notificações > Pontos finais.
- Clique em Adicionar .
- Especifique valores para os seguintes parâmetros de entrada:
- Nome do ponto final: indique um nome único e descritivo (por exemplo, Google SecOps).
- Tipo de ponto final: selecione Webhook na lista.
- URL do webhook: introduza o ENDPOINT_URL do Google SecOps com API_KEY e SECRET.
- Clique em Adicionar.
- Aceda a Notificações > Destinatários.
- Clique em Adicionar .
- Especifique valores para os seguintes parâmetros de entrada:
- Nome do destinatário: indique um nome exclusivo e descritivo (por exemplo, Google SecOps).
- Selecionar ponto final: selecione o ponto final criado anteriormente.
- Gravidade: selecione a gravidade a enviar para o Google SecOps (por exemplo, Informação, Aviso e Erro).
- Filtro de categorias: selecione o que enviar para o Google SecOps.
- Clique em Testar destinatário para validar a associação.
- Clique em Adicionar para guardar o webhook.
Configurar subscritores de recursos de webhook do ntopng
- Aceda a Pools.
Selecione o recurso a partir do qual quer partilhar os eventos.
Clique no ícone de lápis na coluna Ações.
Clique no menu pendente Destinatários.
Selecione o destinatário do webhook do Google SecOps.
Clique em Editar para guardar a configuração.
Repita o processo para outros recursos.
Tabela de mapeamento da UDM
Campo de registo | Mapeamento de UDM | Lógica |
---|---|---|
action |
security_result.detection_fields.key=action , security_result.detection_fields.value=%{action} |
O valor de action do registo não processado é 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 registo não processado é 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 registo não processado é mapeado para um objeto security_result.detection_fields com a chave "alerts_map". |
cli2srv_bytes |
network.sent_bytes |
O valor de cli2srv_bytes do registo não processado é convertido num 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 registo não processado é convertido numa 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 registo não processado é convertido numa 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 registo não processado é 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 registo não processado é 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 registo não processado é 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 registo não processado é convertido numa 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 registo não processado é 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 registo não processado é convertido numa 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 registo não processado é convertido numa string. Se não for "0", é mapeado para principal.location.name . |
cli_name |
principal.hostname , principal.asset.hostname |
O valor de cli_name do registo não processado é 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 registo não processado é convertido numa 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 registo não processado é convertido num 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 registo não processado é convertido numa 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 registo não processado é 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 e GENERIC_EVENT . |
first_seen |
principal.asset.first_seen_time |
O valor de first_seen do registo não processado é convertido numa 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 registo não processado é convertido numa 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 registo não processado é convertido numa string e mapeado para um objeto security_result.detection_fields com a chave "granularity". |
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 registo não processado é convertido numa 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 registo não processado é mapeado para principal.ip e principal.asset.ip . Se is_server for verdadeiro, é 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 registo não processado é convertido numa 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 registo não processado é convertido numa 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 registo não processado é convertido numa string e mapeado para um objeto security_result.detection_fields com a chave "is_flow_alert". Se is_flow_alert for verdadeiro, também é criado um objeto security_result.detection_fields com a chave "alert type" e o valor "flow". |
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 registo não processado é convertido numa 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 registo não processado é convertido numa string e mapeado para um objeto security_result.detection_fields com a chave "is_srv_victim". |
metadata.product_name |
metadata.product_name=NTOPNG |
Codificado de forma rígida para "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 registo não processado é mapeado para principal.hostname e principal.asset.hostname . Se is_server for verdadeiro, é 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 (com o nome alterado 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 registo não processado é convertido numa string. Se não for "0", é 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 registo não processado é convertido numa 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 registo não processado é mapeado para intermediary.ip . |
proto.confidence |
security_result.confidence_details |
O valor de proto.confidence do registo não processado é convertido numa string e mapeado para security_result.confidence_details . |
proto.http.last_method |
network.http.method |
O valor de proto.http.last_method do registo não processado é mapeado para network.http.method . |
proto.http.last_return_code |
network.http.response_code |
O valor de proto.http.last_return_code do registo não processado é convertido num 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 registo não processado é mapeado para network.tls.client.server_name . |
proto.http.last_url |
network.http.referral_url |
O valor de proto.http.last_url do registo não processado é mapeado para network.http.referral_url . |
proto.http.last_user_agent |
network.http.user_agent |
O valor de proto.http.last_user_agent do registo não processado é mapeado para network.http.user_agent . |
proto.http.server_name |
network.tls.client.server_name |
O valor de proto.http.server_name do registo não processado é mapeado para network.tls.client.server_name . |
proto.l4 |
network.ip_protocol |
O valor de proto.l4 do registo não processado é 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 (com o nome alterado para proto_ndpi ) do registo não processado é mapeado para um objeto additional.fields com a chave "proto ndpi". 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 registo não processado é 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 registo não processado é convertido numa 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 registo não processado é 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 registo não processado é convertido numa 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 registo não processado é convertido numa 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 registo não processado é convertido num 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 registo não processado é convertido numa 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 registo não processado é convertido numa 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 registo não processado é 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 registo não processado é 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 registo não processado é 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 registo não processado é convertido numa 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 registo não processado é 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 registo não processado é convertido numa 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 registo não processado é convertido numa string. Se não for "0", é mapeado para target.location.name . |
srv_location_lat |
target.location.region_coordinates.latitude |
O valor de srv_location_lat do registo não processado é mapeado para target.location.region_coordinates.latitude . |
srv_location_lon |
target.location.region_coordinates.longitude |
O valor de srv_location_lon do registo não processado é mapeado para target.location.region_coordinates.longitude . |
srv_name |
target.hostname , target.asset.hostname |
O valor de srv_name do registo não processado é 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 registo não processado é convertido numa 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 registo não processado é convertido num número inteiro e mapeado para target.port . |
tstamp |
additional.fields.key=tstamp , additional.fields.value.string_value=%{tstamp} |
O valor de tstamp do registo não processado é convertido numa 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 registo não processado é convertido numa string e mapeado para um objeto principal.resource.attribute.labels com a chave "vlan_id". |
when |
metadata.event_timestamp |
O valor de when do registo não processado é analisado como uma data/hora e mapeado para metadata.event_timestamp . |
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais da Google SecOps.