Raccogliere i log degli avvisi Netskope v1
Panoramica
Questo parser estrae i log degli avvisi Netskope dai messaggi in formato JSON, trasformandoli nell'UDM di Google Security Operations. Normalizza i campi, analizza i timestamp, gestisce gli avvisi e le severità, estrae le informazioni di rete (IP, porte, protocolli), arricchisce i dati utente e dei file e mappa i campi alla struttura UDM. Il parser gestisce anche attività Netskope specifiche come accessi ed eventi DLP e aggiunge etichette personalizzate per un contesto avanzato.
Prima di iniziare
- Assicurati di avere un'istanza Google SecOps.
- Assicurati di disporre dell'accesso privilegiato a Netskope.
Attivare l'accesso all'API REST di Netskope
- Accedi al tenant Netskope utilizzando le tue credenziali di amministratore.
- Vai a Impostazioni > Strumenti > API REST v1.
- Crea una nuova chiave API specifica per Google SecOps.
- Fornisci un nome descrittivo (ad esempio Chiave Google SecOps).
- Copia e salva la chiave e il token segreto generati.
Configura un feed in Google SecOps per importare i log di avviso di Netskope
- Vai a Impostazioni SIEM > Feed.
- Fai clic su Aggiungi nuova.
- Nel campo Nome feed, inserisci un nome per il feed (ad esempio Log degli avvisi Netskope).
- Seleziona API di terze parti come Tipo di origine.
- Seleziona Netskope come Tipo di log.
- Fai clic su Avanti.
- Specifica i valori per i seguenti parametri di input:
- Intestazione HTTP di autenticazione:coppia di chiavi generata in precedenza in formato
<key>:<secret>
, utilizzata per l'autenticazione all'API Netskope. - Nome host dell'API:il FQDN (nome di dominio completo) dell'endpoint API REST di Netskope (ad esempio
myinstance.goskope.com
). - Endpoint API: inserisci alerts.
- Tipo di contenuti:inserisci tutti.
- Spazio dei nomi degli asset: lo spazio dei nomi degli asset.
- Etichette di importazione: l'etichetta applicata agli eventi di questo feed.
- Intestazione HTTP di autenticazione:coppia di chiavi generata in precedenza in formato
- Fai clic su Avanti.
- Controlla la configurazione del feed nella schermata Concludi e poi fai clic su Invia.
(Facoltativo) Aggiungi una configurazione del feed per importare i log eventi di Netskope
- Vai a Impostazioni SIEM > Feed.
- Fai clic su Aggiungi nuova.
- Nel campo Nome feed, inserisci un nome per il feed, ad esempio Log eventi Netskope.
- Seleziona API di terze parti come Tipo di origine.
- Seleziona Netskope come Tipo di log.
- Fai clic su Avanti.
- Specifica i valori per i seguenti parametri di input:
- Intestazione HTTP di autenticazione:coppia di chiavi generata in precedenza in formato
<key>:<secret>
, utilizzata per l'autenticazione all'API Netskope. - Nome host dell'API:il FQDN (nome di dominio completo) dell'endpoint API REST di Netskope (ad esempio
myinstance.goskope.com
). - Endpoint API: inserisci events.
- Tipo di contenuto:inserisci pagina, applicazione, audit, infrastruttura o rete a seconda degli eventi che vuoi analizzare.
- Spazio dei nomi degli asset: lo spazio dei nomi degli asset.
- Etichette di importazione: l'etichetta applicata agli eventi di questo feed.
- Intestazione HTTP di autenticazione:coppia di chiavi generata in precedenza in formato
- Fai clic su Avanti.
- Controlla la configurazione del feed nella schermata Concludi e poi fai clic su Invia.
Tabella di mappatura UDM
Campo log | Mappatura UDM | Logica |
---|---|---|
access_method |
extensions.auth.auth_details |
Mappato direttamente dal campo access_method . |
action |
security_result.action |
Mappato direttamente dal campo action o impostato su QUARANTINE se action è "alert" o "bypass". ALLOW se action è consentito. BLOCK se action è bloccato. |
action |
security_result.action_details |
Mappato dal campo action se è "alert" o "bypass". |
activity |
security_result.description |
Mappato direttamente dal campo activity . |
alert |
is_alert |
Imposta true se alert è "yes", false in caso contrario. |
alert_name |
- | Non mappato all'oggetto IDM. |
alert_type |
security_result.category_details |
Mappato direttamente dal campo alert_type . |
app |
target.application |
Mappato direttamente dal campo app . |
app_activity |
additional.fields {key:"app_activity", value:{string_value: |
Mappato direttamente dal campo app_activity come coppia chiave-valore in additional.fields . |
app_session_id |
target.resource.attribute.labels {key:"App Session Id", value: |
Estratto dal campo message utilizzando grok e aggiunto come etichetta. |
appcategory |
security_result.category_details |
Mappato direttamente dal campo appcategory se category è vuoto. |
browser |
network.http.user_agent |
Mappato direttamente dal campo browser , se non "unknown". |
browser_version |
network.http.parsed_user_agent.browser_version |
Mappato direttamente dal campo browser_version . |
browser_version |
network.http.parsed_user_agent.family |
Imposta su "USER_DEFINED" se è presente browser_version . |
category |
security_result.category_details |
Mappato direttamente dal campo category . |
cci |
security_result.detection_fields {key:"cci", value: |
Mappato direttamente dal campo cci come coppia chiave-valore in detection_fields . |
ccl |
security_result.confidence |
Impostato in base al valore di ccl : "scarso" o "basso" corrisponde a LOW_CONFIDENCE , "medio" a MEDIUM_CONFIDENCE , "alto" o "eccellente" a HIGH_CONFIDENCE . |
ccl |
security_result.confidence_details |
Mappato direttamente dal campo ccl . |
client_bytes |
network.sent_bytes |
Mappato direttamente dal campo client_bytes dopo la conversione in numero intero non firmato. |
count |
additional.fields {key:"count", value:{string_value: |
Mappato direttamente dal campo count come coppia chiave-valore in additional.fields . |
device |
principal.resource.resource_subtype |
Mappato direttamente dal campo device . |
device |
principal.resource.type |
Impostato su "DEVICE" se è presente il campo device . |
dlp_file |
target.file.full_path |
Mappato direttamente dal campo dlp_file , se presente, altrimenti da file_path . |
dlp_profile |
security_result.rule_type |
Mappato direttamente dal campo dlp_profile . |
dlp_rule |
security_result.rule_name |
Mappato direttamente dal campo dlp_rule . |
dlp_rule_severity |
security_result.severity |
Mappato direttamente dal campo dlp_rule_severity se alert_type è DLP. |
dlp_rule_severity |
_severity |
Mappato dal campo dlp_rule_severity se severity è vuoto. |
domain |
target.asset.hostname |
Mappato direttamente dal campo domain . |
domain |
target.hostname |
Mappato direttamente dal campo domain . |
dsthost |
target.asset.hostname |
Viene mappato direttamente dal campo dsthost se non è un indirizzo IP e dstip è vuoto, altrimenti viene mappato a target.hostname . |
dsthost |
target.hostname |
Mappato direttamente dal campo dsthost se non è un indirizzo IP e dstip non è vuoto. |
dstip |
target.asset.ip |
Mappato direttamente dal campo dstip . |
dstip |
target.ip |
Mappato direttamente dal campo dstip . |
dstport |
target.port |
Mappato direttamente dal campo dstport dopo la conversione in numero intero. |
dst_country |
target.location.country_or_region |
Mappato direttamente dal campo dst_country . |
dst_location |
target.location.city |
Mappato direttamente dal campo dst_location . |
dst_region |
target.location.name |
Mappato direttamente dal campo dst_region . |
file_path |
target.file.full_path |
Mappato direttamente dal campo file_path se dlp_file è vuoto. |
file_size |
target.file.size |
Mappato direttamente dal campo file_size dopo la conversione in numero intero non firmato. |
file_type |
target.file.mime_type |
Mappato direttamente dal campo file_type , se non "Sconosciuto". |
from_user |
network.email.from |
Mappato direttamente dal campo from_user se si tratta di un indirizzo email. |
from_user_category |
principal.resource.attribute.labels {key:"From User Category", value: |
Mappato direttamente dal campo from_user_category come coppia chiave-valore in principal.resource.attribute.labels . |
hostname |
principal.asset.hostname |
Mappato direttamente dal campo hostname , se non vuoto, altrimenti da instance_id . |
hostname |
principal.hostname |
Mappato direttamente dal campo hostname , se non vuoto, altrimenti da instance_id . |
id.time |
metadata.event_timestamp |
Analizzati e mappati a event_timestamp nei metadati. |
instance_id |
principal.asset.hostname |
Mappato direttamente dal campo instance_id se hostname è vuoto. |
instance_id |
principal.hostname |
Mappato direttamente dal campo instance_id se hostname è vuoto. |
intermediary |
intermediary |
Mappato direttamente dal campo intermediary . |
ip_protocol |
network.ip_protocol |
Mappato dal campo ip_protocol dopo essere stato analizzato dal file parse_ip_protocol.include . |
is_alert |
is_alert |
Campo generato dall'analizzatore. Imposta su true se il campo alert è "yes". |
is_significant |
is_significant |
Campo generato dall'analizzatore. Impostato su true se _severity è "CRITICAL" o "HIGH". |
ja3 |
network.tls.client.ja3 |
Mappato direttamente dal campo ja3 se corrisponde a un pattern esadecimale. |
ja3s |
network.tls.server.ja3s |
Mappato direttamente dal campo ja3s se corrisponde a un pattern esadecimale. |
malware_id |
security_result.threat_id |
Mappato direttamente dal campo malware_id . |
malware_name |
security_result.threat_name |
Mappato direttamente dal campo malware_name . |
malware_severity |
security_result.severity |
Mappato direttamente dal campo malware_severity dopo la conversione in lettere maiuscole. |
malware_type |
security_result.detection_fields {key:"Malware Type", value: |
Mappato direttamente dal campo malware_type come coppia chiave-valore in detection_fields . |
matched_username |
principal.user.email_addresses |
Mappato direttamente dal campo matched_username se si tratta di un indirizzo email. |
md5 |
target.file.md5 |
Mappato direttamente dal campo md5 se non è vuoto o se è "Non disponibile". |
metadata.event_type |
metadata.event_type |
Impostato inizialmente su "GENERIC_EVENT", quindi potenzialmente sostituito in base ad altri campi. Imposta NETWORK_HTTP se sono presenti srcip o hostname e dstip o dsthost o domain . Imposta STATUS_UPDATE se sono presenti srcip o hostname , ma non dstip , dsthost o domain . Imposta USER_UNCATEGORIZED se è presente user . Imposta su EMAIL_UNCATEGORIZED se activity è "Scansione introspettiva" e sono presenti shared_with o from_user . Impostato su USER_LOGIN se activity è "Accesso non riuscito", "Accesso riuscito" o "Tentativo di accesso". |
metadata.log_type |
metadata.log_type |
Imposta su "NETSKOPE_ALERT". |
metadata.product_log_id |
metadata.product_log_id |
Mappato direttamente dal campo _id . |
metadata.product_name |
metadata.product_name |
Imposta su "Avviso Netskope". |
metadata.vendor_name |
metadata.vendor_name |
Imposta su "Netskope". |
netskope_pop |
observer.hostname |
Mappato direttamente dal campo netskope_pop . |
object |
additional.fields {key:"Object", value:{string_value: |
Mappato direttamente dal campo object come coppia chiave-valore in additional.fields . |
object_id |
additional.fields {key:"Object id", value:{string_value: |
Mappato direttamente dal campo object_id come coppia chiave-valore in additional.fields . |
object_type |
additional.fields {key:"Object type", value:{string_value: |
Mappato direttamente dal campo object_type come coppia chiave-valore in additional.fields . |
organization_unit |
principal.administrative_domain |
Mappato direttamente dal campo organization_unit . |
os |
principal.platform |
Mappato dal campo os : "Windows" corrisponde a WINDOWS , "MAC" a MAC , "LINUX" a LINUX . |
os_version |
principal.platform_version |
Mappato direttamente dal campo os_version . |
other_categories |
- | Non mappato all'oggetto IDM. |
page |
network.http.referral_url |
Mappato direttamente dal campo page se referer è vuoto. |
policy |
security_result.summary |
Mappato direttamente dal campo policy . |
principal.user.email_addresses |
principal.user.email_addresses |
Unito dal campo user se si tratta di un indirizzo email. |
protocol |
network.application_protocol |
Mappato direttamente dal campo protocol dopo aver rimosso tutto dopo il primo "/". Convertito in maiuscolo. |
publisher_cn |
additional.fields {key:"publisher_cn", value:{string_value: |
Mappato direttamente dal campo publisher_cn come coppia chiave-valore in additional.fields . |
publisher_name |
additional.fields {key:"publisher_name", value:{string_value: |
Mappato direttamente dal campo publisher_name come coppia chiave-valore in additional.fields . |
referer |
network.http.referral_url |
Mappato direttamente dal campo referer . |
security_result.alert_state |
security_result.alert_state |
Imposta su "ALERTING" se alert è "yes", su "NOT_ALERTING" se alert è "no", su "UNSPECIFIED" in caso contrario. |
security_result.category_details |
security_result.category_details |
Unito dai campi category , appcategory o alert_type . |
security_result.confidence |
security_result.confidence |
Derivato dal campo ccl . |
security_result.confidence_details |
security_result.confidence_details |
Mappato direttamente dal campo ccl . |
security_result.description |
security_result.description |
Mappato direttamente dal campo activity . |
security_result.rule_name |
security_result.rule_name |
Mappato direttamente dal campo dlp_rule . |
security_result.rule_type |
security_result.rule_type |
Mappato direttamente dal campo dlp_profile . |
security_result.severity |
security_result.severity |
Derivato dai campi _severity , malware_severity o dlp_rule_severity . |
security_result.summary |
security_result.summary |
Mappato direttamente dal campo policy . |
security_result.threat_id |
security_result.threat_id |
Mappato direttamente dal campo malware_id . |
security_result.threat_name |
security_result.threat_name |
Mappato direttamente dal campo malware_name . |
server_bytes |
network.received_bytes |
Mappato direttamente dal campo server_bytes dopo la conversione in numero intero non firmato. |
severity |
_severity |
Mappato direttamente dal campo severity . |
sha256 |
target.file.sha256 |
Mappato direttamente dal campo sha256 . |
shared_with |
network.email.to |
Analizzata dal campo shared_with e aggiunta all'array network.email.to se si tratta di un indirizzo email. |
site |
additional.fields {key:"site", value:{string_value: |
Mappato direttamente dal campo site come coppia chiave-valore in additional.fields . |
src_country |
principal.location.country_or_region |
Mappato direttamente dal campo src_country . |
src_latitude |
principal.location.region_latitude |
Mappato direttamente dal campo src_latitude . |
src_location |
principal.location.city |
Mappato direttamente dal campo src_location . |
src_longitude |
principal.location.region_longitude |
Mappato direttamente dal campo src_longitude . |
src_region |
principal.location.name |
Mappato direttamente dal campo src_region . |
srcip |
principal.asset.ip |
Estratto dal campo srcip utilizzando grok e unito agli array principal.asset.ip e principal.ip . |
srcip |
principal.ip |
Estratto dal campo srcip utilizzando grok e unito agli array principal.asset.ip e principal.ip . |
srcport |
principal.port |
Mappato direttamente dal campo srcport dopo la conversione in numero intero. |
target.user.email_addresses |
target.user.email_addresses |
Unito dal campo to_user se si tratta di un indirizzo email. |
threat_match_field |
security_result.detection_fields {key:"Threat Match Field", value: |
Mappato direttamente dal campo threat_match_field come coppia chiave-valore in detection_fields . |
timestamp |
metadata.event_timestamp |
Analizzati dai campi timestamp o id.time . |
to_user |
target.user.email_addresses |
Analizzata dal campo to_user e aggiunta all'array target.user.email_addresses se si tratta di un indirizzo email. |
to_user_category |
target.resource.attribute.labels {key:"To User Category", value: |
Mappato direttamente dal campo to_user_category come coppia chiave-valore in target.resource.attribute.labels . |
traffic_type |
security_result.detection_fields {key:"traffic_type", value: |
Mappato direttamente dal campo traffic_type come coppia chiave-valore in detection_fields . |
tunnel_id |
additional.fields {key:"tunnel_id", value:{string_value: |
Mappato direttamente dal campo tunnel_id come coppia chiave-valore in additional.fields . |
tunnel_type |
additional.fields {key:"tunnel_type", value:{string_value: |
Mappato direttamente dal campo tunnel_type come coppia chiave-valore in additional.fields . |
type |
security_result.detection_fields {key:"type", value: |
Mappato direttamente dal campo type come coppia chiave-valore in detection_fields . |
ur_normalized |
- | Non mappato all'oggetto IDM. |
url |
target.url |
Mappato direttamente dal campo url . |
user |
event.idm.read_only_udm.principal.user.userid |
Mappato direttamente dal campo user . |
user |
principal.user.email_addresses |
Mappato direttamente dal campo user se si tratta di un indirizzo email. |
useragent |
network.http.user_agent |
Mappato direttamente dal campo useragent . |
useragent |
network.http.parsed_user_agent |
Convertito in parseduseragent e mappato a network.http.parsed_user_agent . |
user_agent |
network.http.user_agent |
Mappato direttamente dal campo user_agent . |
user_agent |
network.http.parsed_user_agent |
Convertito in parseduseragent e mappato a network.http.parsed_user_agent . |
Modifiche
2024-06-04
- "matched_username" è stato mappato a "principal.user.email_addresses".
- Quando "action" è "bypass" o "alert", mappa "action" a "security_result.action_details" e imposta "security_result.action" su "QUARANTINE".
- Quando "alert_type" è "DLP", mappa "dlp_rule_severity" a "security_result.severity".
2024-02-19
- È stata modificata la mappatura di "client_bytes" da "network.received_bytes" a "network.sent_bytes".
- È stata modificata la mappatura di "server_bytes" da "network.sent_bytes" a "network.received_bytes".
2024-02-08
- "useragent" e "user_agent" sono stati mappati a "network.http.user_agent" e "network.http.parsed_user_agent".
2023-11-10
- È stato aggiunto il pattern Grok per verificare se "srcip" è un pattern IP valido.
- "instance_id" è stato mappato a "principal.hostname".
- "traffic_type" è stato mappato a "security_result.detection_fields".
- "app_activity" è stato mappato a "additional.fields".
- "count" è stato mappato a "additional.fields".
- "site" è stato mappato a "additional.fields".
- "device" è stato mappato a "principal.resource.resource_sub_type".
- "type" è stato mappato a "security_result.detection_fields".
- È stata modificata la mappatura di "hostname" utilizzando "replace" anziché "rename".
- La mappatura "cci" è stata modificata da "additional.fields" a "security_result.detection_fields".
- La mappatura "ccl" è stata modificata da "additional.fields" a "security_result.confidence_details".
- "security_result.confidence" compilato in base al valore in "ccl".
2023-07-14
- Correzione di bug -
- Valore estratto per "browser_session_id","app_session_id" utilizzando il pattern Grok prima della mappatura.
- È stata aggiunta la verifica della condizione per convalidare l'email prima di mappare il campo "to_user".
2023-07-06
- Miglioramento:
- Pattern Grok modificato per identificare se "dsthost" è o meno un indirizzo IP.
- Se "dsthost" è un indirizzo IP, viene mappato a "target.ip", altrimenti a "target.hostname".
2023-06-06
- Miglioramento:
- "domain" è stato mappato a "target.hostname".
- "app_session_id" è stato mappato a "target.resource.attribute.labels".
- "malware_severity" è stato mappato a "security_result.severity".
- "malware_type" è stato mappato a "security_result.detection_fields".
- "threat_match_field" è stato mappato a "security_result.detection_fields".
- "ja3" è stato mappato a "network.tls.client.ja3".
- "ja3s" è stato mappato a "network.tls.server.ja3s".
- "cci" e "ccl" sono stati mappati a "additional.fields".
- "access_method" è stato mappato a "extensions.auth.auth_details".
- "browser_version" è stato mappato a "network.http.parsed_user_agent.browser_version".
- "dlp_profile" è stato mappato a "security_result.rule_type".
- "dlp_rule" è stato mappato a "security_result.rule_name".
- "netskope_pop" è stato mappato a "observer.hostname".
- "pagina" è stato mappato a "network.http.referral_url".
- "to_user" è stato mappato a "target.user.email_addresses".
- "to_user_category" è stato mappato a "target.resource.attribute.labels".
2023-03-23
- Miglioramento:
- "security_result.alert_state" è stato mappato a "ALERTING" se "alert" è uguale a "yes".
- "security_result.alert_state" è stato mappato a "NOT_ALERTING" se "alert" è uguale a "no".
- "security_result.alert_state" è stato mappato a "UNSPECIFIED" se "alert" è nullo.
2022-07-23
- È stata rimossa la mappatura non necessaria per "metadata.description".
2022-07-01
- Il campo "os" mappato a "principal.platform".
- Il campo "dsthost" mappato a "target.ip" se "dsthost" è un indirizzo IP, altrimenti mappato a "target.hostname".
- Il campo "dstport" mappato a "target.port".
- Il campo "srcport" è stato mappato a "principal.port".
- Il campo "user" mappato a "principal.user.email_addresses", se "user" è un indirizzo email valido.
- Il campo "src_latitude" mappato a "principal.location.region_latitude".
- Il campo "src_longitude" mappato a "principal.location.region_longitude".
- Il campo "ip_protocol" mappato a "network.ip_protocol".
- Il campo "client_bytes" mappato a "network.received_bytes".
- Il campo "server_bytes" mappato a "network.sent_bytes".
- Il campo "browser_session_id" mappato a "network.session_id".
- Il campo "network_session_id" mappato a "network.session_id".
- Il campo "appcategory" mappato a "security_result.category_details".
- Il campo "publisher_cn" è stato mappato a "additional.fields[n]".
- Il campo "publisher_name" mappato a "additional.fields[n]".
- Il campo "tunnel_id" mappato a "additional.fields[n]".
- Il campo "tunnel_type" è stato mappato a "additional.fields[n]".
- È stata modificata la mappatura per il campo "shared_with" da "intermediary.user.email_addresses" a "network.email.to".
- È stata modificata la mappatura per il campo "network.email.to" da "principal.user.email_addresses" a "network.email.from".
- Sono stati aggiunti controlli condizionali per i campi "_severity", "shared_with", "from_user", "protocol".
- Modifica di "metadata.event_type" per i seguenti casi:
- "GENERIC_EVENT" a "NETWORK_HTTP" se "principal.ip o principal.hostname" e "target.ip o target.hostname" non sono null.
- "GENERIC_EVENT" in "STATUS_UPDATE" dove "principal.ip o principal.hostname" non è nullo.
- "GENERIC_EVENT" in "USER_UNCATEGORIZED" dove "principal.user.userid" non è nullo.
2022-06-17
- Correzione di bug:
- È stato aggiunto il controllo condizionale per "md5" == "not available".