Collecter les journaux d'alertes Netskope v1

Compatible avec:

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

  1. Connectez-vous au locataire Netskope à l'aide de vos identifiants d'administrateur.
  2. Accédez à Paramètres > Outils > API REST v1.
  3. Créez une clé API spécifiquement pour Google SecOps.
  4. Attribuez un nom descriptif (par exemple, Clé Google SecOps).
  5. 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

  1. Accédez à Paramètres du SIEM > Flux.
  2. Cliquez sur Ajouter.
  3. Dans le champ Nom du flux, saisissez un nom pour le flux (par exemple, Journaux d'alerte Netskope).
  4. Sélectionnez API tierce comme type de source.
  5. Sélectionnez Netskope comme Type de journal.
  6. Cliquez sur Suivant.
  7. 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.
  8. Cliquez sur Suivant.
  9. 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

  1. Accédez à Paramètres du SIEM > Flux.
  2. Cliquez sur Ajouter.
  3. Dans le champ Nom du flux, saisissez un nom pour le flux (par exemple, Journaux des événements Netskope).
  4. Sélectionnez API tierce comme type de source.
  5. Sélectionnez Netskope comme Type de journal.
  6. Cliquez sur Suivant.
  7. 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.
  8. Cliquez sur Suivant.
  9. 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".