Collecter les journaux ntopng
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
- Accédez à Paramètres du SIEM > Flux.
- Cliquez sur Ajouter.
- Dans le champ Nom du flux, saisissez un nom pour le flux (par exemple, ntopng Logs).
- Sélectionnez Webhook comme type de source.
- Sélectionnez Ntopng comme Type de journal.
- Cliquez sur Suivant.
- 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.
- Délimiteur de fractionnement: délimiteur utilisé pour séparer les lignes de journal, par exemple
- Cliquez sur Suivant.
- Vérifiez la configuration du flux dans l'écran Finaliser, puis cliquez sur Envoyer.
- Cliquez sur Générer une clé secrète pour générer une clé secrète permettant d'authentifier ce flux.
- 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.
- 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.
- Cliquez sur OK.
Créer une clé API pour le flux webhook
Accédez à la console Google Cloud > Identifiants.
Cliquez sur Créer des identifiants, puis sélectionnez Clé API.
Limitez l'accès de la clé API à l'API Google Security Operations.
Spécifier l'URL du point de terminaison
- Dans votre application cliente, spécifiez l'URL du point de terminaison HTTPS fournie dans le flux de webhook.
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.
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
- Connectez-vous à l'interface Web de ntopng.
- Sélectionnez le menu System (Système) dans le menu déroulant.
- Accédez à Notifications > Points de terminaison.
- Cliquez sur Ajouter .
- 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.
- Cliquez sur Ajouter.
- Accédez à Notifications > Destinataires.
- Cliquez sur Ajouter .
- 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.
- Cliquez sur Tester le destinataire pour vérifier la connexion.
- Cliquez sur Ajouter pour enregistrer le webhook.
Configurer les abonnés aux ressources de webhook ntopng
- Accédez à Pools (Pools).
Sélectionnez la ressource à partir de laquelle partager les événements.
Cliquez sur l'icône en forme de crayon dans la colonne Actions.
Cliquez sur le menu déroulant Destinataires.
Sélectionnez le destinataire du webhook Google SecOps.
Cliquez sur Modifier pour enregistrer la configuration.
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éé.