Collecter les journaux ntopng
Présentation
Ce parseur extrait les journaux de surveillance du réseau ntopng au format SYSLOG ou JSON. Il analyse le message du journal, convertit les champs pertinents au format UDM et enrichit l'événement avec des métadonnées telles que les noms de produits et de fournisseurs. L'analyseur gère également les structures JSON imbriquées et mappe des champs ntopng spécifiques aux événements réseau UDM, y compris les alertes de flux et l'accès aux ressources utilisateur.
Avant de commencer
Assurez-vous de remplir les conditions préalables suivantes :
- Instance Google SecOps.
- Accès privilégié à ntopng.
Configurer des flux
Il existe deux points d'entrée différents pour configurer les flux dans la plate-forme Google SecOps :
- Paramètres SIEM> Flux
- Plate-forme de contenu > Packs de contenu
Configurer des flux à partir de Paramètres SIEM > Flux
Pour configurer un flux, procédez comme suit :
- Accédez à Paramètres SIEM > Flux.
- Cliquez sur Add New Feed (Ajouter un flux).
- Sur la page suivante, cliquez sur Configurer un seul flux.
- Dans le champ Nom du flux, saisissez un nom pour le flux (par exemple, Journaux Ntopng).
- Sélectionnez Webhook comme type de source.
- Sélectionnez Ntopng comme Type de journal.
- Cliquez sur Suivant.
- Facultatif : Spécifiez les valeurs des paramètres d'entrée suivants :
- Délimiteur de fractionnement : délimiteur utilisé pour séparer les lignes de journaux, tel que
\n
.
- Délimiteur de fractionnement : délimiteur utilisé pour séparer les lignes de journaux, tel que
- Cliquez sur Suivant.
- Vérifiez la configuration du flux sur 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 l'ancienne deviendra obsolète.
- Dans l'onglet Détails, copiez l'URL du point de terminaison du flux à partir du champ Informations sur le point de terminaison. Vous devez spécifier cette URL de point de terminaison dans votre application cliente.
- Cliquez sur OK.
Configurer des flux depuis le Hub de contenu
Indiquez les valeurs des champs suivants :
- Délimiteur de fractionnement : délimiteur utilisé pour séparer les lignes de journaux, tel que
\n
.
Options avancées
- Nom du flux : valeur préremplie qui identifie le flux.
- Type de source : méthode utilisée pour collecter les journaux dans Google SecOps.
- Espace de noms de l'élément : espace de noms associé au flux.
Libellés d'ingestion : libellés appliqués à tous les événements de ce flux.
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 l'ancienne deviendra obsolète.
Dans l'onglet Détails, copiez l'URL du point de terminaison du flux à partir du champ Informations sur le point de terminaison. Vous devez spécifier cette URL de point de terminaison dans votre application cliente.
Créer une clé API pour le flux de webhook
Accédez à la consoleGoogle Cloud > Identifiants.
Cliquez sur Créer des identifiants, puis sélectionnez Clé API.
Restreignez l'accès à 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 au lieu de la spécifier dans l'URL.
Si votre client de webhook n'accepte pas 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 pour 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 ntopng.
- Sélectionnez le menu 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 les éléments à 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.
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.
Table 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 à 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 à 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 à 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 à 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 à 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 à 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 à 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 à 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 JSON imbriqué est mappée à 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 non signé 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 à 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 elle n'est pas égale à "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 nombre 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 sur 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 tant que 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é "granularity". |
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 à 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 à 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é "alert type" et la valeur "flow" 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 |
Codé en dur sur "NTOPNG". |
metadata.vendor_name |
metadata.vendor_name=%{vendor_name} |
La valeur de vendor_name du message est mappée à 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 JSON imbriqué est mappée à 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. Si la valeur n'est pas "0", elle est mappée 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 nombre 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 à un objet additional.fields avec la clé "proto ndpi". Il est également utilisé pour 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 à 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 à 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 non signé 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 à 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 elle n'est pas égale à "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 nombre 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 qu'horodatage et mappée sur metadata.event_timestamp . |
Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.