Raccogliere i log di ntopng
Panoramica
Questo parser estrae i log di monitoraggio della rete ntopng in formato SYSLOG o JSON. Analizza il messaggio di log, converte i campi pertinenti nel formato UDM e arricchisce l'evento con metadati come i nomi di prodotti e fornitori. Il parser gestisce anche le strutture JSON nidificate e mappa campi ntopng specifici agli eventi di rete UDM, inclusi gli avvisi sui flussi e l'accesso alle risorse utente.
Prima di iniziare
- Assicurati di avere un'istanza Google SecOps.
- Assicurati di disporre dell'accesso privilegiato a ntopng.
Configura un feed in Google SecOps per importare i log ntopng
- Vai a Impostazioni SIEM > Feed.
- Fai clic su Aggiungi nuovo.
- Nel campo Nome feed, inserisci un nome per il feed (ad esempio Log ntopng).
- Seleziona Webhook come Tipo di origine.
- Seleziona Ntopng come Tipo di log.
- Fai clic su Avanti.
- (Facoltativo) Specifica i valori per i seguenti parametri di input:
- Delimitatore di split: il delimitatore utilizzato per separare le righe di log, ad esempio
\n
. - Spazio dei nomi degli asset: lo spazio dei nomi degli asset.
- Etichette di importazione: l'etichetta applicata agli eventi di questo feed.
- Delimitatore di split: il delimitatore utilizzato per separare le righe di log, ad esempio
- Fai clic su Avanti.
- Controlla la configurazione del feed nella schermata Concludi e poi fai clic su Invia.
- Fai clic su Genera chiave segreta per generare una chiave segreta per autenticare questo feed.
- Copia e memorizza la chiave segreta. Non potrai più visualizzare questa chiave segreta. Se necessario, puoi rigenerare una nuova chiave segreta, ma questa azione rende obsoleta la chiave segreta precedente.
- Dalla scheda Dettagli, copia l'URL dell'endpoint del feed dal campo Informazioni endpoint. Devi specificare questo URL endpoint nell'applicazione client.
- Fai clic su Fine.
Crea una chiave API per il feed webhook
Vai alla console Google Cloud > Credenziali.
Fai clic su Crea credenziali e poi seleziona Chiave API.
Limita l'accesso della chiave API all'API Google Security Operations.
Specifica l'URL dell'endpoint
- Nell'applicazione client, specifica l'URL dell'endpoint HTTPS fornito nel feed webhook.
Attiva l'autenticazione specificando la chiave API e la chiave segreta nell'intestazione personalizzata nel seguente formato:
X-goog-api-key = API_KEY X-Webhook-Access-Key = SECRET
Consiglio: specifica la chiave API come intestazione anziché nell'URL.
Se il client webhook non supporta le intestazioni personalizzate, puoi specificare la chiave API e la chiave segreta utilizzando parametri di ricerca nel seguente formato:
ENDPOINT_URL?key=API_KEY&secret=SECRET
Sostituisci quanto segue:
ENDPOINT_URL
: l'URL dell'endpoint del feed.API_KEY
: la chiave API per l'autenticazione in Google Security Operations.SECRET
: la chiave segreta che hai generato per autenticare il feed.
Configurazione di un webhook su ntopng per Google SecOps
- Accedi all'interfaccia web di ntopng.
- Seleziona il menu Sistema dal menu a discesa.
- Vai a Notifiche > Endpoint.
- Fai clic su Aggiungi .
- Specifica i valori per i seguenti parametri di input:
- Nome endpoint: fornisci un nome univoco e descrittivo (ad esempio Google SecOps).
- Tipo di endpoint: seleziona Webhook dall'elenco.
- URL webhook: inserisci l'ENDPOINT_URL di Google SecOps con API_KEY e SECRET.
- Fai clic su Aggiungi.
- Vai a Notifiche > Destinatari.
- Fai clic su Aggiungi .
- Specifica i valori per i seguenti parametri di input:
- Nome del destinatario: fornisci un nome univoco e descrittivo (ad esempio Google SecOps).
- Seleziona endpoint: seleziona l'endpoint creato in precedenza.
- Gravità: seleziona la gravità da inviare a Google SecOps (ad esempio Informazioni, Avviso ed Errore).
- Filtro delle categorie: seleziona cosa inviare a Google SecOps.
- Fai clic su Test destinatario per verificare la connessione.
- Fai clic su Aggiungi per salvare l'webhook.
Configurazione degli abbonati alle risorse webhook ntopng
- Vai a Pool.
Seleziona la risorsa da cui condividere gli eventi.
Fai clic sull'icona a forma di matita nella colonna Azioni.
Fai clic sul menu a discesa Destinatari.
Seleziona il destinatario webhook Google SecOps.
Fai clic su Modifica per salvare la configurazione.
Ripeti la procedura per le altre risorse.
Tabella di mappatura UDM
Campo log | Mappatura UDM | Logica |
---|---|---|
action |
security_result.detection_fields.key=action , security_result.detection_fields.value=%{action} |
Il valore di action dal log non elaborato viene mappato a un oggetto security_result.detection_fields con chiave "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} |
Il valore di alert_generation.host_info.broadcast_domain_host dal JSON nidificato è mappato a un oggetto security_result.detection_fields con chiave "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} |
Il valore di alert_generation.host_info.dhcpHost dal JSON nidificato viene mappato a un oggetto security_result.detection_fields con chiave "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} |
Il valore di alert_generation.host_info.is_blacklisted dal JSON nidificato è mappato a un oggetto security_result.detection_fields con chiave "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} |
Il valore di alert_generation.host_info.is_broadcast dal JSON nidificato è mappato a un oggetto security_result.detection_fields con chiave "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} |
Il valore di alert_generation.host_info.is_multicast dal JSON nidificato viene mappato a un oggetto security_result.detection_fields con chiave "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} |
Il valore di alert_generation.host_info.localhost dal JSON nidificato è mappato a un oggetto security_result.detection_fields con chiave "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} |
Il valore di alert_generation.host_info.privatehost dal JSON nidificato è mappato a un oggetto security_result.detection_fields con chiave "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} |
Il valore di alert_generation.host_info.systemhost dal JSON nidificato è mappato a un oggetto security_result.detection_fields con chiave "host_info systemhost". |
alert_generation.script_key |
security_result.category_details=%{alert_generation.script_key} |
Il valore di alert_generation.script_key dal JSON nidificato è mappato a security_result.category_details . |
alert_generation.subdir |
security_result.detection_fields.key=alert_generation_subdir , security_result.detection_fields.value=%{alert_generation.subdir} |
Il valore di alert_generation.subdir dal JSON nidificato è mappato a un oggetto security_result.detection_fields con chiave "alert_generation_subdir". |
alert_id |
security_result.detection_fields.key=alert_id , security_result.detection_fields.value=%{alert_id} |
Il valore di alert_id dal log non elaborato viene mappato a un oggetto security_result.detection_fields con chiave "alert_id". |
alerts_map |
security_result.detection_fields.key=alerts_map , security_result.detection_fields.value=%{alerts_map} |
Il valore di alerts_map dal log non elaborato viene mappato a un oggetto security_result.detection_fields con chiave "alerts_map". |
cli2srv_bytes |
network.sent_bytes |
Il valore di cli2srv_bytes dal log non elaborato viene convertito in un numero intero non firmato e mappato a network.sent_bytes . |
cli_asn |
principal.resource.attribute.labels.key=cli_asn , principal.resource.attribute.labels.value=%{cli_asn} |
Il valore di cli_asn dal log non elaborato viene convertito in una stringa e mappato a un oggetto principal.resource.attribute.labels con chiave "cli_asn". |
cli_blacklisted |
principal.resource.attribute.labels.key=cli_blacklisted , principal.resource.attribute.labels.value=%{cli_blacklisted} |
Il valore di cli_blacklisted dal log non elaborato viene convertito in una stringa e mappato a un oggetto principal.resource.attribute.labels con chiave "cli_blacklisted". |
cli_city_name |
principal.location.city |
Il valore cli_city_name del log non elaborato è mappato a principal.location.city . |
cli_continent_name |
principal.resource.attribute.labels.key=cli_continent_name , principal.resource.attribute.labels.value=%{cli_continent_name} |
Il valore di cli_continent_name dal log non elaborato viene mappato a un oggetto principal.resource.attribute.labels con chiave "cli_continent_name". |
cli_country_name |
principal.location.country_or_region |
Il valore cli_country_name del log non elaborato è mappato a 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} |
Il valore di cli_host_pool_id dal log non elaborato viene convertito in una stringa e mappato a un oggetto principal.resource.attribute.labels con chiave "cli_host_pool_id". |
cli_ip |
principal.ip , principal.asset.ip |
Il valore cli_ip del log non elaborato è mappato a principal.ip e principal.asset.ip . |
cli_localhost |
principal.resource.attribute.labels.key=cli_localhost , principal.resource.attribute.labels.value=%{cli_localhost} |
Il valore di cli_localhost dal log non elaborato viene convertito in una stringa e mappato a un oggetto principal.resource.attribute.labels con chiave "cli_localhost". |
cli_location |
principal.location.name |
Il valore di cli_location dal log non elaborato viene convertito in una stringa. Se non è "0", viene mappato a principal.location.name . |
cli_name |
principal.hostname , principal.asset.hostname |
Il valore cli_name del log non elaborato è mappato a principal.hostname e principal.asset.hostname . |
cli_network |
principal.resource.attribute.labels.key=cli_network , principal.resource.attribute.labels.value=%{cli_network} |
Il valore di cli_network dal log non elaborato viene convertito in una stringa e mappato a un oggetto principal.resource.attribute.labels con chiave "cli_network". |
cli_port |
principal.port |
Il valore cli_port del log non elaborato viene convertito in un numero intero e mappato a principal.port . |
entity_id |
principal.resource.attribute.labels.key=entity_id , principal.resource.attribute.labels.value=%{entity_id} |
Il valore di entity_id dal log non elaborato viene convertito in una stringa e mappato a un oggetto principal.resource.attribute.labels con chiave "entity_id". |
entity_val |
principal.resource.attribute.labels.key=entity_val , principal.resource.attribute.labels.value=%{entity_val} |
Il valore di entity_val dal log non elaborato viene mappato a un oggetto principal.resource.attribute.labels con chiave "entity_val", a meno che non sia uguale al valore di ip . |
event.type |
metadata.event_type |
Determinato dalla logica del parser in base alla presenza dei campi principal , target e network . Valori possibili: NETWORK_FLOW , NETWORK_UNCATEGORIZED , USER_RESOURCE_ACCESS , GENERIC_EVENT . |
first_seen |
principal.asset.first_seen_time |
Il valore di first_seen dal log non elaborato viene convertito in una stringa, analizzato come millisecondi dall'epoca e mappato a principal.asset.first_seen_time . |
flow_risk_bitmap |
security_result.detection_fields.key=flow_risk_bitmap , security_result.detection_fields.value=%{flow_risk_bitmap} |
Il valore di flow_risk_bitmap dal log non elaborato viene convertito in una stringa e mappato a un oggetto security_result.detection_fields con chiave "flow_risk_bitmap". |
granularity |
security_result.detection_fields.key=granularity , security_result.detection_fields.value=%{granularity} |
Il valore di granularity dal log non elaborato viene convertito in una stringa e mappato a un oggetto security_result.detection_fields con chiave "granularity". |
hash_entry_id |
security_result.detection_fields.key=hash_entry_id , security_result.detection_fields.value=%{hash_entry_id} |
Il valore di hash_entry_id dal JSON nidificato viene mappato a un oggetto security_result.detection_fields con chiave "hash_entry_id". |
host_ip |
principal.ip , principal.asset.ip |
L'indirizzo IP estratto dalla parte <INT>Oct 20 15:34:53 1.1.1.1 del messaggio è mappato a principal.ip e principal.asset.ip . |
ifid |
principal.asset_id |
Il valore di ifid dal log non elaborato viene convertito in una stringa e mappato a principal.asset_id con il prefisso "ifid: ". |
ip |
principal.ip , principal.asset.ip o target.ip , target.asset.ip |
Se is_client è true, il valore di ip dal log non elaborato viene mappato a principal.ip e principal.asset.ip . Se is_server è true, viene mappato a 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} |
Il valore di is_cli_attacker dal log non elaborato viene convertito in una stringa e mappato a un oggetto security_result.detection_fields con chiave "is_cli_attacker". |
is_cli_victim |
security_result.detection_fields.key=is_cli_victim , security_result.detection_fields.value=%{is_cli_victim} |
Il valore di is_cli_victim dal log non elaborato viene convertito in una stringa e mappato a un oggetto security_result.detection_fields con chiave "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 |
Il valore di is_flow_alert dal log non elaborato viene convertito in una stringa e mappato a un oggetto security_result.detection_fields con chiave "is_flow_alert". Se is_flow_alert è true, viene creato anche un oggetto security_result.detection_fields con chiave "tipo di avviso" e valore "flusso". |
is_srv_attacker |
security_result.detection_fields.key=is_srv_attacker , security_result.detection_fields.value=%{is_srv_attacker} |
Il valore di is_srv_attacker dal log non elaborato viene convertito in una stringa e mappato a un oggetto security_result.detection_fields con chiave "is_srv_attacker". |
is_srv_victim |
security_result.detection_fields.key=is_srv_victim , security_result.detection_fields.value=%{is_srv_victim} |
Il valore di is_srv_victim dal log non elaborato viene convertito in una stringa e mappato a un oggetto security_result.detection_fields con chiave "is_srv_victim". |
metadata.product_name |
metadata.product_name=NTOPNG |
Hardcoded su "NTOPNG". |
metadata.vendor_name |
metadata.vendor_name=%{vendor_name} |
Il valore vendor_name del messaggio è mappato a metadata.vendor_name . |
name |
principal.hostname , principal.asset.hostname o target.hostname , target.asset.hostname |
Se is_client è true, il valore di name dal log non elaborato viene mappato a principal.hostname e principal.asset.hostname . Se is_server è true, viene mappato a target.hostname e target.asset.hostname . |
ntopng_key |
security_result.detection_fields.key=ntopng_key , security_result.detection_fields.value=%{ntopng_key} |
Il valore di ntopng.key (rinominato in ntopng_key ) dal JSON nidificato viene mappato a un oggetto security_result.detection_fields con chiave "ntopng_key". |
observation_point_id |
observer.asset_id |
Il valore di observation_point_id dal log non elaborato viene convertito in una stringa. Se non è "0", viene mappato a observer.asset_id con il prefisso "id: ". |
pool_id |
principal.resource.attribute.labels.key=pool_id , principal.resource.attribute.labels.value=%{pool_id} |
Il valore di pool_id dal log non elaborato viene convertito in una stringa e mappato a un oggetto principal.resource.attribute.labels con chiave "pool_id". |
probe_ip |
intermediary.ip |
Il valore probe_ip del log non elaborato è mappato a intermediary.ip . |
proto.confidence |
security_result.confidence_details |
Il valore di proto.confidence dal log non elaborato viene convertito in una stringa e mappato a security_result.confidence_details . |
proto.http.last_method |
network.http.method |
Il valore proto.http.last_method del log non elaborato è mappato a network.http.method . |
proto.http.last_return_code |
network.http.response_code |
Il valore proto.http.last_return_code del log non elaborato viene convertito in un numero intero e mappato a network.http.response_code . |
proto.http.last_server_name |
network.tls.client.server_name |
Il valore proto.http.server_name del log non elaborato è mappato a network.tls.client.server_name . |
proto.http.last_url |
network.http.referral_url |
Il valore proto.http.last_url del log non elaborato è mappato a network.http.referral_url . |
proto.http.last_user_agent |
network.http.user_agent |
Il valore proto.http.last_user_agent del log non elaborato è mappato a network.http.user_agent . |
proto.http.server_name |
network.tls.client.server_name |
Il valore proto.http.server_name del log non elaborato è mappato a network.tls.client.server_name . |
proto.l4 |
network.ip_protocol |
Il valore proto.l4 del log non elaborato è mappato a network.ip_protocol . |
proto_ndpi |
additional.fields.key=proto ndpi , additional.fields.value.string_value=%{proto_ndpi} , network.application_protocol |
Il valore di proto.ndpi (rinominato in proto_ndpi ) dal log non elaborato viene mappato a un oggetto additional.fields con chiave "proto ndpi". Viene utilizzato anche per determinare il valore di network.application_protocol in base a parole chiave come "NTP" e "HTTP". |
proto_ndpi_app |
principal.application |
Il valore proto_ndpi_app del log non elaborato è mappato a principal.application . |
proto_ndpi_breed |
security_result.detection_fields.key=proto_ndpi_breed , security_result.detection_fields.value=%{proto_ndpi_breed} |
Il valore di proto_ndpi_breed dal log non elaborato viene convertito in una stringa e mappato a un oggetto security_result.detection_fields con chiave "proto_ndpi_breed". |
proto_ndpi_cat |
security_result.category_details |
Il valore proto_ndpi_cat del log non elaborato è mappato a 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} |
Il valore di proto_ndpi_cat_id dal log non elaborato viene convertito in una stringa e mappato a un oggetto security_result.detection_fields con chiave "proto_ndpi_cat_id". |
score |
security_result.detection_fields.key=score , security_result.detection_fields.value=%{score} |
Il valore di score dal log non elaborato viene convertito in una stringa e mappato a un oggetto security_result.detection_fields con chiave "punteggio". |
srv2cli_bytes |
network.received_bytes |
Il valore di srv2cli_bytes dal log non elaborato viene convertito in un numero intero non firmato e mappato a network.received_bytes . |
srv_asn |
target.resource.attribute.labels.key=srv_asn , target.resource.attribute.labels.value=%{srv_asn} |
Il valore di srv_asn dal log non elaborato viene convertito in una stringa e mappato a un oggetto target.resource.attribute.labels con chiave "srv_asn". |
srv_blacklisted |
target.resource.attribute.labels.key=srv_blacklisted , target.resource.attribute.labels.value=%{srv_blacklisted} |
Il valore di srv_blacklisted dal log non elaborato viene convertito in una stringa e mappato a un oggetto target.resource.attribute.labels con chiave "srv_blacklisted". |
srv_city_name |
target.location.city |
Il valore srv_city_name del log non elaborato è mappato a target.location.city . |
srv_continent_name |
target.resource.attribute.labels.key=srv_continent_name , target.resource.attribute.labels.value=%{srv_continent_name} |
Il valore di srv_continent_name dal log non elaborato viene mappato a un oggetto target.resource.attribute.labels con chiave "srv_continent_name". |
srv_country_name |
target.location.country_or_region |
Il valore srv_country_name del log non elaborato è mappato a 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} |
Il valore di srv_host_pool_id dal log non elaborato viene convertito in una stringa e mappato a un oggetto target.resource.attribute.labels con chiave "srv_host_pool_id". |
srv_ip |
target.ip , target.asset.ip |
Il valore srv_ip del log non elaborato è mappato a target.ip e target.asset.ip . |
srv_localhost |
target.resource.attribute.labels.key=srv_localhost , target.resource.attribute.labels.value=%{srv_localhost} |
Il valore di srv_localhost dal log non elaborato viene convertito in una stringa e mappato a un oggetto target.resource.attribute.labels con chiave "srv_localhost". |
srv_location |
target.location.name |
Il valore di srv_location dal log non elaborato viene convertito in una stringa. Se non è "0", viene mappato a target.location.name . |
srv_location_lat |
target.location.region_coordinates.latitude |
Il valore srv_location_lat del log non elaborato è mappato a target.location.region_coordinates.latitude . |
srv_location_lon |
target.location.region_coordinates.longitude |
Il valore srv_location_lon del log non elaborato è mappato a target.location.region_coordinates.longitude . |
srv_name |
target.hostname , target.asset.hostname |
Il valore srv_name del log non elaborato è mappato a target.hostname e target.asset.hostname . |
srv_network |
target.resource.attribute.labels.key=srv_network , target.resource.attribute.labels.value=%{srv_network} |
Il valore di srv_network dal log non elaborato viene convertito in una stringa e mappato a un oggetto target.resource.attribute.labels con chiave "srv_network". |
srv_port |
target.port |
Il valore srv_port del log non elaborato viene convertito in un numero intero e mappato a target.port . |
tstamp |
additional.fields.key=tstamp , additional.fields.value.string_value=%{tstamp} |
Il valore di tstamp dal log non elaborato viene convertito in una stringa e mappato a un oggetto additional.fields con chiave "tstamp". |
vlan_id |
principal.resource.attribute.labels.key=vlan_id , principal.resource.attribute.labels.value=%{vlan_id} |
Il valore di vlan_id dal log non elaborato viene convertito in una stringa e mappato a un oggetto principal.resource.attribute.labels con chiave "vlan_id". |
when |
metadata.event_timestamp |
Il valore di when dal log non elaborato viene analizzato come timestamp e mappato a metadata.event_timestamp . |
Modifiche
2024-02-01
- Correzione di bug:
- "=>" è stato modificato in ":" nel commento dell'intestazione del file conf.
2023-11-16
- Parser appena creato.