Coletar registros do ntopng

Compatível com:

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

  1. Acesse Configurações do SIEM > Feeds.
  2. Clique em Adicionar novo.
  3. No campo Nome do feed, insira um nome para o feed (por exemplo, ntopng Logs).
  4. Selecione Webhook como o Tipo de origem.
  5. Selecione Ntopng como o Tipo de registro.
  6. Clique em Próxima.
  7. 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.
  8. Clique em Próxima.
  9. Revise a configuração do feed na tela Finalizar e clique em Enviar.
  10. Clique em Gerar chave secreta para gerar uma chave secreta para autenticar esse feed.
  11. 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.
  12. 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.
  13. Clique em Concluído.

Criar uma chave de API para o feed de webhook

  1. Acesse o console do Google Cloud > Credenciais.

    Ir para Credenciais

  2. Clique em Criar credenciais e, em seguida, selecione Chave de API.

  3. Restrinja o acesso da chave de API à API Google Security Operations.

Especificar o URL do endpoint

  1. No aplicativo cliente, especifique o URL do endpoint HTTPS fornecido no feed de webhook.
  2. 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.

  3. 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

  1. Faça login na interface da Web do ntopng.
  2. Selecione o menu System no menu suspenso.
  3. Acesse Notificações > Endpoints.
  4. Clique em adicionar .
  5. 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.
  6. Clique em Adicionar.
  7. Acesse Notificações > Destinatários.
  8. Clique em adicionar .
  9. 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.
  10. Clique em Testar destinatário para verificar a conexão.
  11. Clique em Adicionar para salvar o webhook.

Como configurar assinantes de recursos de webhook do ntopng

  1. Acesse Pools.
  2. Selecione o recurso para compartilhar os eventos.

  3. Clique no ícone de lápis na coluna Ações.

  4. Clique no menu suspenso Destinatários.

  5. Selecione o destinatário do webhook do Google SecOps.

  6. Clique em Editar para salvar a configuração.

  7. 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.