Collecter les journaux ntopng

Compatible avec:

Présentation

Cet analyseur extrait les journaux de surveillance réseau ntopng au format SYSLOG ou JSON. Il analyse le message de journal, convertit les champs pertinents au format UDM et enrichit l'événement avec des métadonnées telles que le nom du produit et du fournisseur. L'analyseur gère également les structures JSON imbriquées et met en correspondance des champs ntopng spécifiques avec des événements réseau UDM, y compris les alertes de flux et l'accès aux ressources utilisateur.

Avant de commencer

  • Assurez-vous de disposer d'une instance Google SecOps.
  • Assurez-vous de disposer d'un accès privilégié à ntopng.

Configurer un flux dans Google SecOps pour ingérer les journaux ntopng

  1. Accédez à Paramètres du SIEM > Flux.
  2. Cliquez sur Ajouter.
  3. Dans le champ Nom du flux, saisissez un nom pour le flux (par exemple, ntopng Logs).
  4. Sélectionnez Webhook comme type de source.
  5. Sélectionnez Ntopng comme Type de journal.
  6. Cliquez sur Suivant.
  7. Facultatif: spécifiez des valeurs pour les paramètres d'entrée suivants :
    • Délimiteur de fractionnement: délimiteur utilisé pour séparer les lignes de journal, par exemple \n.
    • Espace de noms des éléments: espace de noms des éléments.
    • Libellés d'ingestion: libellé appliqué aux événements de ce flux.
  8. Cliquez sur Suivant.
  9. Vérifiez la configuration du flux dans l'écran Finaliser, puis cliquez sur Envoyer.
  10. Cliquez sur Générer une clé secrète pour générer une clé secrète permettant d'authentifier ce flux.
  11. Copiez et stockez la clé secrète. Vous ne pourrez plus afficher cette clé secrète. Si nécessaire, vous pouvez générer une nouvelle clé secrète, mais cette action rend l'ancienne clé secrète obsolète.
  12. Dans l'onglet Détails, copiez l'URL du point de terminaison du flux dans le champ Informations sur le point de terminaison. Vous devez spécifier cette URL de point de terminaison dans votre application cliente.
  13. Cliquez sur OK.

Créer une clé API pour le flux webhook

  1. Accédez à la console Google Cloud > Identifiants.

    Accéder à "Identifiants"

  2. Cliquez sur Créer des identifiants, puis sélectionnez Clé API.

  3. Limitez l'accès de la clé API à l'API Google Security Operations.

Spécifier l'URL du point de terminaison

  1. Dans votre application cliente, spécifiez l'URL du point de terminaison HTTPS fournie dans le flux de webhook.
  2. Activez l'authentification en spécifiant la clé API et la clé secrète dans l'en-tête personnalisé au format suivant:

    X-goog-api-key = API_KEY
    X-Webhook-Access-Key = SECRET
    

    Recommandation: Spécifiez la clé API en tant qu'en-tête plutôt que dans l'URL.

  3. Si votre client webhook n'est pas compatible avec les en-têtes personnalisés, vous pouvez spécifier la clé API et la clé secrète à l'aide de paramètres de requête au format suivant:

    ENDPOINT_URL?key=API_KEY&secret=SECRET
    

    Remplacez les éléments suivants :

    • ENDPOINT_URL: URL du point de terminaison du flux.
    • API_KEY: clé API permettant de s'authentifier auprès de Google Security Operations.
    • SECRET: clé secrète que vous avez générée pour authentifier le flux.

Configurer un webhook sur ntopng pour Google SecOps

  1. Connectez-vous à l'interface Web de ntopng.
  2. Sélectionnez le menu System (Système) dans le menu déroulant.
  3. Accédez à Notifications > Points de terminaison.
  4. Cliquez sur Ajouter .
  5. Spécifiez les valeurs des paramètres d'entrée suivants :
    • Nom du point de terminaison: indiquez un nom unique et descriptif (par exemple, Google SecOps).
    • Type de point de terminaison: sélectionnez Webhook dans la liste.
    • URL du webhook: saisissez l'ENDPOINT_URL Google SecOps avec API_KEY et SECRET.
  6. Cliquez sur Ajouter.
  7. Accédez à Notifications > Destinataires.
  8. Cliquez sur Ajouter .
  9. Spécifiez les valeurs des paramètres d'entrée suivants :
    • Nom du destinataire: indiquez un nom unique et descriptif (par exemple, Google SecOps).
    • Sélectionner un point de terminaison: sélectionnez le point de terminaison créé précédemment.
    • Gravité: sélectionnez le niveau de gravité à envoyer à Google SecOps (par exemple, Info, Avertissement et Erreur).
    • Filtre de catégorie: sélectionnez ce que vous souhaitez envoyer à Google SecOps.
  10. Cliquez sur Tester le destinataire pour vérifier la connexion.
  11. Cliquez sur Ajouter pour enregistrer le webhook.

Configurer les abonnés aux ressources de webhook ntopng

  1. Accédez à Pools (Pools).
  2. Sélectionnez la ressource à partir de laquelle partager les événements.

  3. Cliquez sur l'icône en forme de crayon dans la colonne Actions.

  4. Cliquez sur le menu déroulant Destinataires.

  5. Sélectionnez le destinataire du webhook Google SecOps.

  6. Cliquez sur Modifier pour enregistrer la configuration.

  7. Répétez la procédure pour les autres ressources.

Tableau de mappage UDM

Champ de journal Mappage UDM Logique
action security_result.detection_fields.key=action, security_result.detection_fields.value=%{action} La valeur de action du journal brut est mappée sur un objet security_result.detection_fields avec la clé "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} La valeur de alert_generation.host_info.broadcast_domain_host du JSON imbriqué est mappée sur un objet security_result.detection_fields avec la clé "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} La valeur de alert_generation.host_info.dhcpHost du JSON imbriqué est mappée sur un objet security_result.detection_fields avec la clé "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} La valeur de alert_generation.host_info.is_blacklisted du JSON imbriqué est mappée sur un objet security_result.detection_fields avec la clé "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} La valeur de alert_generation.host_info.is_broadcast du JSON imbriqué est mappée sur un objet security_result.detection_fields avec la clé "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} La valeur de alert_generation.host_info.is_multicast du JSON imbriqué est mappée sur un objet security_result.detection_fields avec la clé "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} La valeur de alert_generation.host_info.localhost du JSON imbriqué est mappée sur un objet security_result.detection_fields avec la clé "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} La valeur de alert_generation.host_info.privatehost du fichier JSON imbriqué est mappée sur un objet security_result.detection_fields avec la clé "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} La valeur de alert_generation.host_info.systemhost du JSON imbriqué est mappée sur un objet security_result.detection_fields avec la clé "host_info systemhost".
alert_generation.script_key security_result.category_details=%{alert_generation.script_key} La valeur de alert_generation.script_key du JSON imbriqué est mappée sur security_result.category_details.
alert_generation.subdir security_result.detection_fields.key=alert_generation_subdir, security_result.detection_fields.value=%{alert_generation.subdir} La valeur de alert_generation.subdir du fichier JSON imbriqué est mappée sur un objet security_result.detection_fields avec la clé "alert_generation_subdir".
alert_id security_result.detection_fields.key=alert_id, security_result.detection_fields.value=%{alert_id} La valeur de alert_id du journal brut est mappée sur un objet security_result.detection_fields avec la clé "alert_id".
alerts_map security_result.detection_fields.key=alerts_map, security_result.detection_fields.value=%{alerts_map} La valeur de alerts_map du journal brut est mappée sur un objet security_result.detection_fields avec la clé "alerts_map".
cli2srv_bytes network.sent_bytes La valeur de cli2srv_bytes du journal brut est convertie en entier sans signature et mappée sur network.sent_bytes.
cli_asn principal.resource.attribute.labels.key=cli_asn, principal.resource.attribute.labels.value=%{cli_asn} La valeur de cli_asn du journal brut est convertie en chaîne et mappée sur un objet principal.resource.attribute.labels avec la clé "cli_asn".
cli_blacklisted principal.resource.attribute.labels.key=cli_blacklisted, principal.resource.attribute.labels.value=%{cli_blacklisted} La valeur de cli_blacklisted du journal brut est convertie en chaîne et mappée sur un objet principal.resource.attribute.labels avec la clé "cli_blacklisted".
cli_city_name principal.location.city La valeur de cli_city_name du journal brut est mappée sur principal.location.city.
cli_continent_name principal.resource.attribute.labels.key=cli_continent_name, principal.resource.attribute.labels.value=%{cli_continent_name} La valeur de cli_continent_name du journal brut est mappée sur un objet principal.resource.attribute.labels avec la clé "cli_continent_name".
cli_country_name principal.location.country_or_region La valeur de cli_country_name du journal brut est mappée sur 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} La valeur de cli_host_pool_id du journal brut est convertie en chaîne et mappée sur un objet principal.resource.attribute.labels avec la clé "cli_host_pool_id".
cli_ip principal.ip, principal.asset.ip La valeur de cli_ip du journal brut est mappée sur principal.ip et principal.asset.ip.
cli_localhost principal.resource.attribute.labels.key=cli_localhost, principal.resource.attribute.labels.value=%{cli_localhost} La valeur de cli_localhost du journal brut est convertie en chaîne et mappée sur un objet principal.resource.attribute.labels avec la clé "cli_localhost".
cli_location principal.location.name La valeur de cli_location du journal brut est convertie en chaîne. Si la valeur n'est pas "0", elle est mappée sur principal.location.name.
cli_name principal.hostname, principal.asset.hostname La valeur de cli_name du journal brut est mappée sur principal.hostname et principal.asset.hostname.
cli_network principal.resource.attribute.labels.key=cli_network, principal.resource.attribute.labels.value=%{cli_network} La valeur de cli_network du journal brut est convertie en chaîne et mappée sur un objet principal.resource.attribute.labels avec la clé "cli_network".
cli_port principal.port La valeur de cli_port du journal brut est convertie en entier et mappée sur principal.port.
entity_id principal.resource.attribute.labels.key=entity_id, principal.resource.attribute.labels.value=%{entity_id} La valeur de entity_id du journal brut est convertie en chaîne et mappée sur un objet principal.resource.attribute.labels avec la clé "entity_id".
entity_val principal.resource.attribute.labels.key=entity_val, principal.resource.attribute.labels.value=%{entity_val} La valeur de entity_val du journal brut est mappée à un objet principal.resource.attribute.labels avec la clé "entity_val", sauf si elle est égale à la valeur de ip.
event.type metadata.event_type Déterminé par la logique de l'analyseur en fonction de la présence des champs principal, target et network. Valeurs possibles: NETWORK_FLOW, NETWORK_UNCATEGORIZED, USER_RESOURCE_ACCESS, GENERIC_EVENT.
first_seen principal.asset.first_seen_time La valeur de first_seen du journal brut est convertie en chaîne, analysée en millisecondes depuis l'epoch et mappée sur principal.asset.first_seen_time.
flow_risk_bitmap security_result.detection_fields.key=flow_risk_bitmap, security_result.detection_fields.value=%{flow_risk_bitmap} La valeur de flow_risk_bitmap du journal brut est convertie en chaîne et mappée sur un objet security_result.detection_fields avec la clé "flow_risk_bitmap".
granularity security_result.detection_fields.key=granularity, security_result.detection_fields.value=%{granularity} La valeur de granularity du journal brut est convertie en chaîne et mappée sur un objet security_result.detection_fields avec la clé "granularité".
hash_entry_id security_result.detection_fields.key=hash_entry_id, security_result.detection_fields.value=%{hash_entry_id} La valeur de hash_entry_id du JSON imbriqué est mappée sur un objet security_result.detection_fields avec la clé "hash_entry_id".
host_ip principal.ip, principal.asset.ip L'adresse IP extraite de la partie <INT>Oct 20 15:34:53 1.1.1.1 du message est mappée sur principal.ip et principal.asset.ip.
ifid principal.asset_id La valeur de ifid du journal brut est convertie en chaîne et mappée sur principal.asset_id avec le préfixe "ifid: ".
ip principal.ip, principal.asset.ip ou target.ip, target.asset.ip Si is_client est défini sur "true", la valeur de ip du journal brut est mappée sur principal.ip et principal.asset.ip. Si is_server est défini sur "true", il est mappé sur target.ip et target.asset.ip.
is_cli_attacker security_result.detection_fields.key=is_cli_attacker, security_result.detection_fields.value=%{is_cli_attacker} La valeur de is_cli_attacker du journal brut est convertie en chaîne et mappée sur un objet security_result.detection_fields avec la clé "is_cli_attacker".
is_cli_victim security_result.detection_fields.key=is_cli_victim, security_result.detection_fields.value=%{is_cli_victim} La valeur de is_cli_victim du journal brut est convertie en chaîne et mappée sur un objet security_result.detection_fields avec la clé "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 La valeur de is_flow_alert du journal brut est convertie en chaîne et mappée sur un objet security_result.detection_fields avec la clé "is_flow_alert". Si is_flow_alert est défini sur "true", un objet security_result.detection_fields avec la clé "type d'alerte" et la valeur "flux" est également créé.
is_srv_attacker security_result.detection_fields.key=is_srv_attacker, security_result.detection_fields.value=%{is_srv_attacker} La valeur de is_srv_attacker du journal brut est convertie en chaîne et mappée sur un objet security_result.detection_fields avec la clé "is_srv_attacker".
is_srv_victim security_result.detection_fields.key=is_srv_victim, security_result.detection_fields.value=%{is_srv_victim} La valeur de is_srv_victim du journal brut est convertie en chaîne et mappée sur un objet security_result.detection_fields avec la clé "is_srv_victim".
metadata.product_name metadata.product_name=NTOPNG Code codé en dur sur "NTOPNG".
metadata.vendor_name metadata.vendor_name=%{vendor_name} La valeur de vendor_name du message est mappée sur metadata.vendor_name.
name principal.hostname, principal.asset.hostname ou target.hostname, target.asset.hostname Si is_client est défini sur "true", la valeur de name du journal brut est mappée sur principal.hostname et principal.asset.hostname. Si is_server est défini sur "true", il est mappé sur target.hostname et target.asset.hostname.
ntopng_key security_result.detection_fields.key=ntopng_key, security_result.detection_fields.value=%{ntopng_key} La valeur de ntopng.key (renommée ntopng_key) du fichier JSON imbriqué est mappée sur un objet security_result.detection_fields avec la clé "ntopng_key".
observation_point_id observer.asset_id La valeur de observation_point_id du journal brut est convertie en chaîne. S'il ne s'agit pas de"0", il est mappé sur observer.asset_id avec le préfixe "id: ".
pool_id principal.resource.attribute.labels.key=pool_id, principal.resource.attribute.labels.value=%{pool_id} La valeur de pool_id du journal brut est convertie en chaîne et mappée sur un objet principal.resource.attribute.labels avec la clé "pool_id".
probe_ip intermediary.ip La valeur de probe_ip du journal brut est mappée sur intermediary.ip.
proto.confidence security_result.confidence_details La valeur de proto.confidence du journal brut est convertie en chaîne et mappée sur security_result.confidence_details.
proto.http.last_method network.http.method La valeur de proto.http.last_method du journal brut est mappée sur network.http.method.
proto.http.last_return_code network.http.response_code La valeur de proto.http.last_return_code du journal brut est convertie en entier et mappée sur network.http.response_code.
proto.http.last_server_name network.tls.client.server_name La valeur de proto.http.server_name du journal brut est mappée sur network.tls.client.server_name.
proto.http.last_url network.http.referral_url La valeur de proto.http.last_url du journal brut est mappée sur network.http.referral_url.
proto.http.last_user_agent network.http.user_agent La valeur de proto.http.last_user_agent du journal brut est mappée sur network.http.user_agent.
proto.http.server_name network.tls.client.server_name La valeur de proto.http.server_name du journal brut est mappée sur network.tls.client.server_name.
proto.l4 network.ip_protocol La valeur de proto.l4 du journal brut est mappée sur network.ip_protocol.
proto_ndpi additional.fields.key=proto ndpi, additional.fields.value.string_value=%{proto_ndpi}, network.application_protocol La valeur de proto.ndpi (renommée proto_ndpi) du journal brut est mappée sur un objet additional.fields avec la clé "proto ndpi". Il permet également de déterminer la valeur de network.application_protocol en fonction de mots clés tels que "NTP" et "HTTP".
proto_ndpi_app principal.application La valeur de proto_ndpi_app du journal brut est mappée sur principal.application.
proto_ndpi_breed security_result.detection_fields.key=proto_ndpi_breed, security_result.detection_fields.value=%{proto_ndpi_breed} La valeur de proto_ndpi_breed du journal brut est convertie en chaîne et mappée sur un objet security_result.detection_fields avec la clé "proto_ndpi_breed".
proto_ndpi_cat security_result.category_details La valeur de proto_ndpi_cat du journal brut est mappée sur 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} La valeur de proto_ndpi_cat_id du journal brut est convertie en chaîne et mappée sur un objet security_result.detection_fields avec la clé "proto_ndpi_cat_id".
score security_result.detection_fields.key=score, security_result.detection_fields.value=%{score} La valeur de score du journal brut est convertie en chaîne et mappée sur un objet security_result.detection_fields avec la clé "score".
srv2cli_bytes network.received_bytes La valeur de srv2cli_bytes du journal brut est convertie en entier sans signature et mappée sur network.received_bytes.
srv_asn target.resource.attribute.labels.key=srv_asn, target.resource.attribute.labels.value=%{srv_asn} La valeur de srv_asn du journal brut est convertie en chaîne et mappée sur un objet target.resource.attribute.labels avec la clé "srv_asn".
srv_blacklisted target.resource.attribute.labels.key=srv_blacklisted, target.resource.attribute.labels.value=%{srv_blacklisted} La valeur de srv_blacklisted du journal brut est convertie en chaîne et mappée sur un objet target.resource.attribute.labels avec la clé "srv_blacklisted".
srv_city_name target.location.city La valeur de srv_city_name du journal brut est mappée sur target.location.city.
srv_continent_name target.resource.attribute.labels.key=srv_continent_name, target.resource.attribute.labels.value=%{srv_continent_name} La valeur de srv_continent_name du journal brut est mappée sur un objet target.resource.attribute.labels avec la clé "srv_continent_name".
srv_country_name target.location.country_or_region La valeur de srv_country_name du journal brut est mappée sur 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} La valeur de srv_host_pool_id du journal brut est convertie en chaîne et mappée sur un objet target.resource.attribute.labels avec la clé "srv_host_pool_id".
srv_ip target.ip, target.asset.ip La valeur de srv_ip du journal brut est mappée sur target.ip et target.asset.ip.
srv_localhost target.resource.attribute.labels.key=srv_localhost, target.resource.attribute.labels.value=%{srv_localhost} La valeur de srv_localhost du journal brut est convertie en chaîne et mappée sur un objet target.resource.attribute.labels avec la clé "srv_localhost".
srv_location target.location.name La valeur de srv_location du journal brut est convertie en chaîne. Si la valeur n'est pas "0", elle est mappée sur target.location.name.
srv_location_lat target.location.region_coordinates.latitude La valeur de srv_location_lat du journal brut est mappée sur target.location.region_coordinates.latitude.
srv_location_lon target.location.region_coordinates.longitude La valeur de srv_location_lon du journal brut est mappée sur target.location.region_coordinates.longitude.
srv_name target.hostname, target.asset.hostname La valeur de srv_name du journal brut est mappée sur target.hostname et target.asset.hostname.
srv_network target.resource.attribute.labels.key=srv_network, target.resource.attribute.labels.value=%{srv_network} La valeur de srv_network du journal brut est convertie en chaîne et mappée sur un objet target.resource.attribute.labels avec la clé "srv_network".
srv_port target.port La valeur de srv_port du journal brut est convertie en entier et mappée sur target.port.
tstamp additional.fields.key=tstamp, additional.fields.value.string_value=%{tstamp} La valeur de tstamp du journal brut est convertie en chaîne et mappée sur un objet additional.fields avec la clé "tstamp".
vlan_id principal.resource.attribute.labels.key=vlan_id, principal.resource.attribute.labels.value=%{vlan_id} La valeur de vlan_id du journal brut est convertie en chaîne et mappée sur un objet principal.resource.attribute.labels avec la clé "vlan_id".
when metadata.event_timestamp La valeur de when du journal brut est analysée en tant que code temporel et mappée sur metadata.event_timestamp.

Modifications

2024-02-01

  • Correction de bug:
  • Remplacement de "=>" par ":" dans le commentaire d'en-tête du fichier de configuration.

2023-11-16

  • Analyseur nouvellement créé.