Collecter les journaux d'alertes Netskope v1
Présentation
Cet analyseur extrait les journaux d'alerte Netskope à partir de messages au format JSON, et les transforme en UDM Google Security Operations. Il normalise les champs, analyse les codes temporels, gère les alertes et les niveaux de gravité, extrait des informations réseau (adresses IP, ports, protocoles), enrichit les données utilisateur et de fichier, et mappe les champs sur la structure UDM. L'analyseur gère également des activités Netskope spécifiques, telles que les connexions et les événements de protection contre la perte de données, et ajoute des libellés personnalisés pour améliorer le contexte.
Avant de commencer
- Assurez-vous de disposer d'une instance Google SecOps.
- Assurez-vous de disposer d'un accès privilégié à Netskope.
Activer l'accès à l'API REST Netskope
- Connectez-vous au locataire Netskope à l'aide de vos identifiants d'administrateur.
- Accédez à Paramètres > Outils > API REST v1.
- Créez une clé API spécifiquement pour Google SecOps.
- Attribuez un nom descriptif (par exemple, Clé Google SecOps).
- Copiez et enregistrez la clé et le secret générés.
Configurer un flux dans Google SecOps pour ingérer les journaux d'alerte Netskope
- Accédez à Paramètres du SIEM > Flux.
- Cliquez sur Ajouter.
- Dans le champ Nom du flux, saisissez un nom pour le flux (par exemple, Journaux d'alerte Netskope).
- Sélectionnez API tierce comme type de source.
- Sélectionnez Netskope comme Type de journal.
- Cliquez sur Suivant.
- Spécifiez les valeurs des paramètres d'entrée suivants :
- En-tête HTTP d'authentification:paire de clés générée précédemment au format
<key>:<secret>
, utilisée pour s'authentifier auprès de l'API Netskope. - Nom d'hôte de l'API:nom de domaine complet (FQDN) de votre point de terminaison de l'API REST Netskope (par exemple,
myinstance.goskope.com
). - Point de terminaison de l'API:saisissez alerts.
- Type de contenu:saisissez tout.
- Espace de noms des éléments: espace de noms des éléments.
- Libellés d'ingestion: libellé appliqué aux événements de ce flux.
- En-tête HTTP d'authentification:paire de clés générée précédemment au format
- Cliquez sur Suivant.
- Vérifiez la configuration du flux dans l'écran Finaliser, puis cliquez sur Envoyer.
Facultatif: Ajouter une configuration de flux pour ingérer les journaux des événements Netskope
- Accédez à Paramètres du SIEM > Flux.
- Cliquez sur Ajouter.
- Dans le champ Nom du flux, saisissez un nom pour le flux (par exemple, Journaux des événements Netskope).
- Sélectionnez API tierce comme type de source.
- Sélectionnez Netskope comme Type de journal.
- Cliquez sur Suivant.
- Spécifiez les valeurs des paramètres d'entrée suivants :
- En-tête HTTP d'authentification:paire de clés générée précédemment au format
<key>:<secret>
, utilisée pour s'authentifier auprès de l'API Netskope. - Nom d'hôte de l'API:nom de domaine complet (FQDN) de votre point de terminaison de l'API REST Netskope (par exemple,
myinstance.goskope.com
). - Point de terminaison de l'API:saisissez events.
- Type de contenu:saisissez page, application, audit, infrastructure ou réseau en fonction des événements que vous souhaitez analyser.
- Espace de noms des éléments: espace de noms des éléments.
- Libellés d'ingestion: libellé appliqué aux événements de ce flux.
- En-tête HTTP d'authentification:paire de clés générée précédemment au format
- Cliquez sur Suivant.
- Vérifiez la configuration du flux dans l'écran Finaliser, puis cliquez sur Envoyer.
Tableau de mappage UDM
Champ de journal | Mappage UDM | Logique |
---|---|---|
access_method |
extensions.auth.auth_details |
Mappé directement à partir du champ access_method . |
action |
security_result.action |
Mappé directement à partir du champ action ou défini sur QUARANTINE si action est "alert" ou "bypass". ALLOW si action est autorisé. BLOCK si action est bloqué. |
action |
security_result.action_details |
Mappé à partir du champ action s'il s'agit de "alert" ou de "bypass". |
activity |
security_result.description |
Mappé directement à partir du champ activity . |
alert |
is_alert |
Définissez cette valeur sur true si alert est défini sur "yes" (oui), ou sur false dans le cas contraire. |
alert_name |
- | Non mappé sur l'objet IDM. |
alert_type |
security_result.category_details |
Mappé directement à partir du champ alert_type . |
app |
target.application |
Mappé directement à partir du champ app . |
app_activity |
additional.fields {key:"app_activity", value:{string_value: |
Mappé directement à partir du champ app_activity en tant que paire clé-valeur dans additional.fields . |
app_session_id |
target.resource.attribute.labels {key:"App Session Id", value: |
Extrait du champ message à l'aide de grok et ajouté en tant qu'étiquette. |
appcategory |
security_result.category_details |
Mappé directement à partir du champ appcategory si category est vide. |
browser |
network.http.user_agent |
Mappé directement à partir du champ browser , sauf s'il est défini sur "inconnu". |
browser_version |
network.http.parsed_user_agent.browser_version |
Mappé directement à partir du champ browser_version . |
browser_version |
network.http.parsed_user_agent.family |
Défini sur "USER_DEFINED" si browser_version est présent. |
category |
security_result.category_details |
Mappé directement à partir du champ category . |
cci |
security_result.detection_fields {key:"cci", value: |
Mappé directement à partir du champ cci en tant que paire clé-valeur dans detection_fields . |
ccl |
security_result.confidence |
Défini en fonction de la valeur de ccl : "poor" (faible) ou "low" (faible) correspond à LOW_CONFIDENCE , "medium" (moyen) à MEDIUM_CONFIDENCE , "high" (élevé) ou "excellent" (excellent) à HIGH_CONFIDENCE . |
ccl |
security_result.confidence_details |
Mappé directement à partir du champ ccl . |
client_bytes |
network.sent_bytes |
Mappé directement à partir du champ client_bytes après conversion en entier non signé. |
count |
additional.fields {key:"count", value:{string_value: |
Mappé directement à partir du champ count en tant que paire clé-valeur dans additional.fields . |
device |
principal.resource.resource_subtype |
Mappé directement à partir du champ device . |
device |
principal.resource.type |
Définissez ce champ sur "DEVICE" si le champ device est présent. |
dlp_file |
target.file.full_path |
Mappé directement à partir du champ dlp_file , le cas échéant, ou à partir de file_path . |
dlp_profile |
security_result.rule_type |
Mappé directement à partir du champ dlp_profile . |
dlp_rule |
security_result.rule_name |
Mappé directement à partir du champ dlp_rule . |
dlp_rule_severity |
security_result.severity |
Mappé directement à partir du champ dlp_rule_severity si alert_type est DLP. |
dlp_rule_severity |
_severity |
Mappé à partir du champ dlp_rule_severity si severity est vide. |
domain |
target.asset.hostname |
Mappé directement à partir du champ domain . |
domain |
target.hostname |
Mappé directement à partir du champ domain . |
dsthost |
target.asset.hostname |
Mappé directement à partir du champ dsthost s'il ne s'agit pas d'une adresse IP et si dstip est vide, sinon mappé sur target.hostname . |
dsthost |
target.hostname |
Mappé directement à partir du champ dsthost s'il ne s'agit pas d'une adresse IP et si dstip n'est pas vide. |
dstip |
target.asset.ip |
Mappé directement à partir du champ dstip . |
dstip |
target.ip |
Mappé directement à partir du champ dstip . |
dstport |
target.port |
Mappé directement à partir du champ dstport après conversion en entier. |
dst_country |
target.location.country_or_region |
Mappé directement à partir du champ dst_country . |
dst_location |
target.location.city |
Mappé directement à partir du champ dst_location . |
dst_region |
target.location.name |
Mappé directement à partir du champ dst_region . |
file_path |
target.file.full_path |
Mappé directement à partir du champ file_path si dlp_file est vide. |
file_size |
target.file.size |
Mappé directement à partir du champ file_size après conversion en entier non signé. |
file_type |
target.file.mime_type |
Mappé directement à partir du champ file_type , sauf si la valeur est "Inconnu". |
from_user |
network.email.from |
Mappé directement à partir du champ from_user s'il s'agit d'une adresse e-mail. |
from_user_category |
principal.resource.attribute.labels {key:"From User Category", value: |
Mappé directement à partir du champ from_user_category en tant que paire clé-valeur dans principal.resource.attribute.labels . |
hostname |
principal.asset.hostname |
Mappé directement à partir du champ hostname s'il n'est pas vide, sinon à partir de instance_id . |
hostname |
principal.hostname |
Mappé directement à partir du champ hostname s'il n'est pas vide, sinon à partir de instance_id . |
id.time |
metadata.event_timestamp |
Analysé et mappé sur event_timestamp dans les métadonnées. |
instance_id |
principal.asset.hostname |
Mappé directement à partir du champ instance_id si hostname est vide. |
instance_id |
principal.hostname |
Mappé directement à partir du champ instance_id si hostname est vide. |
intermediary |
intermediary |
Mappé directement à partir du champ intermediary . |
ip_protocol |
network.ip_protocol |
Mappé à partir du champ ip_protocol après avoir été analysé par le fichier parse_ip_protocol.include . |
is_alert |
is_alert |
Champ généré par l'analyseur. Définissez sur "true" si le champ alert est défini sur "yes". |
is_significant |
is_significant |
Champ généré par l'analyseur. Définissez cette valeur sur "true" si _severity est défini sur "CRITICAL" ou "HIGH". |
ja3 |
network.tls.client.ja3 |
Mappé directement à partir du champ ja3 s'il correspond à un format hexadécimal. |
ja3s |
network.tls.server.ja3s |
Mappé directement à partir du champ ja3s s'il correspond à un format hexadécimal. |
malware_id |
security_result.threat_id |
Mappé directement à partir du champ malware_id . |
malware_name |
security_result.threat_name |
Mappé directement à partir du champ malware_name . |
malware_severity |
security_result.severity |
Mappé directement à partir du champ malware_severity après conversion en majuscules. |
malware_type |
security_result.detection_fields {key:"Malware Type", value: |
Mappé directement à partir du champ malware_type en tant que paire clé-valeur dans detection_fields . |
matched_username |
principal.user.email_addresses |
Mappé directement à partir du champ matched_username s'il s'agit d'une adresse e-mail. |
md5 |
target.file.md5 |
Mappé directement à partir du champ md5 s'il n'est pas vide ou ne contient pas la valeur "Non disponible". |
metadata.event_type |
metadata.event_type |
Initialement défini sur "GENERIC_EVENT", puis potentiellement remplacé en fonction d'autres champs. Définissez cette valeur sur NETWORK_HTTP si srcip ou hostname et dstip ou dsthost ou domain sont présents. Définissez-le sur STATUS_UPDATE si srcip ou hostname sont présents, mais pas dstip , dsthost ou domain . Définissez-le sur USER_UNCATEGORIZED si user est présent. Définissez cette valeur sur EMAIL_UNCATEGORIZED si activity est "Introspection Scan" (Analyse d'introspection) et que shared_with ou from_user sont présents. Définissez la valeur sur USER_LOGIN si activity est "Connexion échouée", "Connexion réussie" ou "Tentative de connexion". |
metadata.log_type |
metadata.log_type |
Définissez cette valeur sur "NETSKOPE_ALERT". |
metadata.product_log_id |
metadata.product_log_id |
Mappé directement à partir du champ _id . |
metadata.product_name |
metadata.product_name |
Définissez-le sur "Alerte Netskope". |
metadata.vendor_name |
metadata.vendor_name |
Définissez-le sur "Netskope". |
netskope_pop |
observer.hostname |
Mappé directement à partir du champ netskope_pop . |
object |
additional.fields {key:"Object", value:{string_value: |
Mappé directement à partir du champ object en tant que paire clé-valeur dans additional.fields . |
object_id |
additional.fields {key:"Object id", value:{string_value: |
Mappé directement à partir du champ object_id en tant que paire clé-valeur dans additional.fields . |
object_type |
additional.fields {key:"Object type", value:{string_value: |
Mappé directement à partir du champ object_type en tant que paire clé-valeur dans additional.fields . |
organization_unit |
principal.administrative_domain |
Mappé directement à partir du champ organization_unit . |
os |
principal.platform |
Mappé à partir du champ os : "Windows" est mappé sur WINDOWS , "MAC" sur MAC et "LINUX" sur LINUX . |
os_version |
principal.platform_version |
Mappé directement à partir du champ os_version . |
other_categories |
- | Non mappé sur l'objet IDM. |
page |
network.http.referral_url |
Mappé directement à partir du champ page si referer est vide. |
policy |
security_result.summary |
Mappé directement à partir du champ policy . |
principal.user.email_addresses |
principal.user.email_addresses |
Fusionné à partir du champ user s'il s'agit d'une adresse e-mail. |
protocol |
network.application_protocol |
Mappé directement à partir du champ protocol après suppression de tout ce qui se trouve après le premier "/". Converti en majuscules. |
publisher_cn |
additional.fields {key:"publisher_cn", value:{string_value: |
Mappé directement à partir du champ publisher_cn en tant que paire clé-valeur dans additional.fields . |
publisher_name |
additional.fields {key:"publisher_name", value:{string_value: |
Mappé directement à partir du champ publisher_name en tant que paire clé-valeur dans additional.fields . |
referer |
network.http.referral_url |
Mappé directement à partir du champ referer . |
security_result.alert_state |
security_result.alert_state |
Définissez la valeur sur "ALERTING" si alert est défini sur "yes", sur "NOT_ALERTING" si alert est défini sur "no", ou sur "UNSPECIFIED" dans le cas contraire. |
security_result.category_details |
security_result.category_details |
Fusionné à partir des champs category , appcategory ou alert_type . |
security_result.confidence |
security_result.confidence |
Dérivé du champ ccl . |
security_result.confidence_details |
security_result.confidence_details |
Mappé directement à partir du champ ccl . |
security_result.description |
security_result.description |
Mappé directement à partir du champ activity . |
security_result.rule_name |
security_result.rule_name |
Mappé directement à partir du champ dlp_rule . |
security_result.rule_type |
security_result.rule_type |
Mappé directement à partir du champ dlp_profile . |
security_result.severity |
security_result.severity |
Dérivé des champs _severity , malware_severity ou dlp_rule_severity . |
security_result.summary |
security_result.summary |
Mappé directement à partir du champ policy . |
security_result.threat_id |
security_result.threat_id |
Mappé directement à partir du champ malware_id . |
security_result.threat_name |
security_result.threat_name |
Mappé directement à partir du champ malware_name . |
server_bytes |
network.received_bytes |
Mappé directement à partir du champ server_bytes après conversion en entier non signé. |
severity |
_severity |
Mappé directement à partir du champ severity . |
sha256 |
target.file.sha256 |
Mappé directement à partir du champ sha256 . |
shared_with |
network.email.to |
Extrait du champ shared_with et ajouté au tableau network.email.to s'il s'agit d'une adresse e-mail. |
site |
additional.fields {key:"site", value:{string_value: |
Mappé directement à partir du champ site en tant que paire clé-valeur dans additional.fields . |
src_country |
principal.location.country_or_region |
Mappé directement à partir du champ src_country . |
src_latitude |
principal.location.region_latitude |
Mappé directement à partir du champ src_latitude . |
src_location |
principal.location.city |
Mappé directement à partir du champ src_location . |
src_longitude |
principal.location.region_longitude |
Mappé directement à partir du champ src_longitude . |
src_region |
principal.location.name |
Mappé directement à partir du champ src_region . |
srcip |
principal.asset.ip |
Extrait du champ srcip à l'aide de grok et fusionné dans les tableaux principal.asset.ip et principal.ip . |
srcip |
principal.ip |
Extrait du champ srcip à l'aide de grok et fusionné dans les tableaux principal.asset.ip et principal.ip . |
srcport |
principal.port |
Mappé directement à partir du champ srcport après conversion en entier. |
target.user.email_addresses |
target.user.email_addresses |
Fusionné à partir du champ to_user s'il s'agit d'une adresse e-mail. |
threat_match_field |
security_result.detection_fields {key:"Threat Match Field", value: |
Mappé directement à partir du champ threat_match_field en tant que paire clé-valeur dans detection_fields . |
timestamp |
metadata.event_timestamp |
Extrait des champs timestamp ou id.time . |
to_user |
target.user.email_addresses |
Extrait du champ to_user et ajouté au tableau target.user.email_addresses s'il s'agit d'une adresse e-mail. |
to_user_category |
target.resource.attribute.labels {key:"To User Category", value: |
Mappé directement à partir du champ to_user_category en tant que paire clé-valeur dans target.resource.attribute.labels . |
traffic_type |
security_result.detection_fields {key:"traffic_type", value: |
Mappé directement à partir du champ traffic_type en tant que paire clé-valeur dans detection_fields . |
tunnel_id |
additional.fields {key:"tunnel_id", value:{string_value: |
Mappé directement à partir du champ tunnel_id en tant que paire clé-valeur dans additional.fields . |
tunnel_type |
additional.fields {key:"tunnel_type", value:{string_value: |
Mappé directement à partir du champ tunnel_type en tant que paire clé-valeur dans additional.fields . |
type |
security_result.detection_fields {key:"type", value: |
Mappé directement à partir du champ type en tant que paire clé-valeur dans detection_fields . |
ur_normalized |
- | Non mappé sur l'objet IDM. |
url |
target.url |
Mappé directement à partir du champ url . |
user |
event.idm.read_only_udm.principal.user.userid |
Mappé directement à partir du champ user . |
user |
principal.user.email_addresses |
Mappé directement à partir du champ user s'il s'agit d'une adresse e-mail. |
useragent |
network.http.user_agent |
Mappé directement à partir du champ useragent . |
useragent |
network.http.parsed_user_agent |
Converti en parseduseragent et mappé sur network.http.parsed_user_agent . |
user_agent |
network.http.user_agent |
Mappé directement à partir du champ user_agent . |
user_agent |
network.http.parsed_user_agent |
Converti en parseduseragent et mappé sur network.http.parsed_user_agent . |
Modifications
2024-06-04
- Mappage de "matched_username" sur "principal.user.email_addresses".
- Lorsque "action" est "bypass" ou "alert", mappez "action" sur "security_result.action_details" et définissez "security_result.action" sur "QUARANTINE".
- Lorsque "alert_type" est défini sur "DLP", "dlp_rule_severity" est mappé sur "security_result.severity".
2024-02-19
- Modification de la mise en correspondance de "client_bytes" de "network.received_bytes" à "network.sent_bytes".
- Modification du mappage de "server_bytes" de "network.sent_bytes" à "network.received_bytes".
2024-02-08
- Mappage de "useragent" et "user_agent" sur "network.http.user_agent" et "network.http.parsed_user_agent".
2023-11-10
- Ajout d'un format Grok pour vérifier si "srcip" est un format d'adresse IP valide.
- "instance_id" a été mappé sur "principal.hostname".
- Mappage de "traffic_type" sur "security_result.detection_fields".
- "app_activity" a été mappé sur "additional.fields".
- Mappage de "count" sur "additional.fields".
- Mappage de "site" sur "additional.fields".
- Mappage de "device" sur "principal.resource.resource_sub_type".
- Mappage de "type" sur "security_result.detection_fields".
- Modification du mappage de "hostname" à l'aide de "replace" au lieu de "rename".
- Modification de la mise en correspondance de "cci" de "additional.fields" à "security_result.detection_fields".
- Modification de la mise en correspondance de "ccl" de "additional.fields" à "security_result.confidence_details".
- "security_result.confidence" renseigné en fonction de la valeur de "ccl".
2023-07-14
- Correction de bug :
- Valeur extraite pour "browser_session_id","app_session_id" à l'aide du modèle Grok avant le mappage.
- Ajout d'une vérification de condition pour valider l'adresse e-mail avant de mapper le champ "to_user".
2023-07-06
- Amélioration :
- Modèle Grok modifié pour déterminer si "dsthost" est une adresse IP ou non.
- Si "dsthost" est une adresse IP, elle est mappée sur "target.ip", sinon sur "target.hostname".
2023-06-06
- Amélioration :
- Mappage de "domain" sur "target.hostname".
- "app_session_id" a été mappé sur "target.resource.attribute.labels".
- Mappage de "malware_severity" sur "security_result.severity".
- Mappage de "malware_type" sur "security_result.detection_fields".
- Mappage de "threat_match_field" sur "security_result.detection_fields".
- "ja3" a été mappé sur "network.tls.client.ja3".
- "ja3s" a été mappé sur "network.tls.server.ja3s".
- Mappage de "cci" et "ccl" sur "additional.fields".
- Mappage de "access_method" sur "extensions.auth.auth_details".
- Mappage de "browser_version" sur "network.http.parsed_user_agent.browser_version".
- "dlp_profile" a été mappé sur "security_result.rule_type".
- "dlp_rule" a été mappé sur "security_result.rule_name".
- Mappage de "netskope_pop" sur "observer.hostname".
- Mappage de "page" sur "network.http.referral_url".
- Mappage de "to_user" sur "target.user.email_addresses".
- "to_user_category" a été mappé sur "target.resource.attribute.labels".
2023-03-23
- Amélioration :
- Mappage de "security_result.alert_state" sur "ALERTING" si "alert" est égal à "yes".
- Mappage de "security_result.alert_state" sur "NOT_ALERTING" si "alert" est égal à "no".
- Mappage de "security_result.alert_state" sur "UNSPECIFIED" si "alert" est nul.
2022-07-23
- Suppression du mappage inutile pour "metadata.description".
2022-07-01
- Le champ "os" a été mappé sur "principal.platform".
- Le champ "dsthost" est mappé sur "target.ip" si "dsthost" est une adresse IP, sinon il est mappé sur "target.hostname".
- Le champ "dstport" a été mappé sur "target.port".
- Le champ "srcport" a été mappé sur "principal.port".
- Le champ "user" mappé sur "principal.user.email_addresses", si "user" est une adresse e-mail valide.
- Le champ "src_latitude" a été mappé sur "principal.location.region_latitude".
- Le champ "src_longitude" a été mappé sur "principal.location.region_longitude".
- Le champ "ip_protocol" a été mappé sur "network.ip_protocol".
- Le champ "client_bytes" a été mappé sur "network.received_bytes".
- Le champ "server_bytes" a été mappé sur "network.sent_bytes".
- Le champ "browser_session_id" a été mappé sur "network.session_id".
- Le champ "network_session_id" a été mappé sur "network.session_id".
- Le champ "appcategory" a été mappé sur "security_result.category_details".
- Le champ "publisher_cn" a été mappé à "additional.fields[n]".
- Le champ "publisher_name" a été mappé sur "additional.fields[n]".
- Le champ "tunnel_id" a été mappé sur "additional.fields[n]".
- Le champ "tunnel_type" a été mappé sur "additional.fields[n]".
- Modification du mappage du champ "shared_with" de "intermediary.user.email_addresses" à "network.email.to".
- Modification de la mise en correspondance du champ "network.email.to" de "principal.user.email_addresses" à "network.email.from".
- Ajout de vérifications conditionnelles pour les champs "_severity", "shared_with", "from_user" et "protocol".
- Modification de "metadata.event_type" dans les cas suivants:
- "GENERIC_EVENT" à "NETWORK_HTTP", où "principal.ip ou principal.hostname" et "target.ip ou target.hostname" ne sont pas nuls.
- "GENERIC_EVENT" à "STATUS_UPDATE", où "principal.ip" ou "principal.hostname" ne sont pas nuls.
- "GENERIC_EVENT" à "USER_UNCATEGORIZED" lorsque "principal.user.userid" n'est pas nul.
2022-06-17
- Correction de bug:
- Ajout d'une vérification conditionnelle pour "md5" == "not available".