Rechercher des données de contexte d'entité

Compatible avec :

La fonctionnalité "Contexte des entités dans la recherche" améliore les investigations de sécurité et la réponse aux incidents en permettant aux utilisateurs de rechercher et d'afficher les événements contextuels liés aux entités dans leur compte Google Security Operations. Contrairement aux recherches limitées au schéma d'événement UDM (Unified Data Model) standard, cette fonctionnalité permet de rechercher au-delà des données d'événement UDM, y compris le contexte des entités UDM, et d'obtenir des insights plus approfondis sur les incidents de sécurité.

Principaux avantages

  • Les analystes de sécurité et les chasseurs de menaces peuvent interroger des informations contextuelles sur les entités.
  • Aidez à l'analyse des causes premières, à la chasse aux menaces et à l'analyse forensique.
  • Les utilisateurs peuvent effectuer des recherches statistiques sur le contexte de l'entité pour comprendre les modèles de télémétrie et les entités concernées grâce à l'analyse de la télémétrie.

Vous pouvez utiliser le contexte d'entité pour obtenir des insights à partir de vos résultats de recherche de différentes manières :

  • Rechercher à l'aide des noms de champs d'entité UDM : créez vos requêtes de recherche à l'aide des noms de champs d'entité UDM. Par exemple, pour trouver tous les événements de contexte associés à un nom d'hôte spécifique, créez une recherche à l'aide de graph.entity.hostname.
  • Accéder à l'onglet "Aperçu" : l'onglet Aperçu fournit un résumé général des entités trouvées dans votre recherche, en s'appuyant sur les informations de la requête saisie par un utilisateur pour afficher des informations. La page Vue d'ensemble affiche des informations sur les types d'entités, comme DOMAIN_NAME, IP_ADDRESS, ASSET, USER, FILE, GROUP et RESOURCE.
  • Utiliser l'onglet "Entité" : l'onglet Entité liste tous les événements de contexte d'entité reçus, y compris les sous-composants tels que "Tendance au fil du temps", "Filtre d'instantané", "Agrégations" et "Événements". Les entités sont classées dans les catégories avec durée et sans durée, affichées dans des onglets distincts.
  • Afficher les agrégats : les agrégats s'affichent pour les champs, comme dans la recherche d'événements UDM. Les agrégations sont ensuite classées par type de contexte : contexte d'entité, contexte dérivé et contexte global.

Cas d'utilisation : examiner un compte utilisateur piraté

Prenons l'exemple suivant : un analyste de la sécurité doit examiner un compte utilisateur potentiellement piraté (email@company.com). Pour examiner le problème, procédez comme suit :

  1. Identifier l'utilisateur piraté : une alerte indique que l'utilisateur email@company.com a été identifié comme un compte suspect.

  2. Recueillez des informations sur le contexte de l'entité : obtenez des données contextuelles sur l'utilisateur pour comprendre l'étendue et l'impact.

  3. Exécuter des requêtes : utilisez Contexte de l'entité dans la recherche pour exécuter les requêtes suivantes :

    • graph.entity.user.email_addresses = "email@company.com" pour récupérer des informations sur l'utilisateur.
    • graph.entity.user.email_addresses = "email@company.com" AND graph.metadata.product_name = "Google Cloud Compute Context" pour vérifier le nom du produit et d'autres métadonnées.
  4. Analyser l'onglet "Aperçu" : l'onglet Aperçu affiche le récapitulatif des entités pour l'utilisateur, y compris :

    • Vérifiez les codes temporels First Seen Hour et Last Seen Hour.
  • Examinez les noms d'hôte, les adresses IP et les adresses MAC (si disponibles).
  • Inspectez le modèle matériel, la plate-forme OS et la version de la plate-forme.
  1. Examiner l'onglet "Événements" : affichez les événements associés à cet utilisateur, y compris les tentatives de connexion et les anomalies.

  2. Agrégats d'avis : identifiez les modèles et les anomalies dans les données contextuelles des entités, réparties dans les contextes d'entité, dérivés et globaux.

Pour rechercher des données de contexte d'entité, utilisez les noms de champs d'entité UDM dans vos requêtes de recherche :

  • graph.entity.hostname
  • graph.entity.ip = "8.8.8.8" and graph.metadata.entity_type = "ASSET"

Les résultats de recherche affichent des informations clés sur les entités, y compris :

  • Métadonnées d'entité
  • Métriques (First Seen Hour, Last Seen Hour)
  • Relations (Entity, Direction, Entity_label, Entity_type, Relationship)
  • En fonction du type d'entité, des champs spécifiques, tels que Principal_ip pour les composants, Mail_id pour les utilisateurs, File_name pour les hachages/fichiers, et Domain_name et IP_address pour les domaines.

Exemples de contexte d'entité dans la recherche

Cette section fournit des exemples pratiques pour s'appuyer sur la fonctionnalité de contexte d'entité UDM afin d'analyser les statistiques des entités.

Pour afficher les types et sources de contexte disponibles, exécutez la recherche "Statistiques sur les entités UDM" dans la recherche UDM :

graph.metadata.source_type = $sourceType
graph.metadata.entity_type = $entityType
match:
  $sourceType, $entityType
outcome:
  $total = count(graph.metadata.product_entity_id)
order:
  $sourceType, $total desc
limit:
  100

Le sélecteur de date et heure affiche les données actives dans le graphique des entités, et non la date et l'heure d'ingestion des données contextuelles.

Comme la recherche d'entités UDM utilise l'interface de recherche UDM standard, vous pouvez utiliser des fonctionnalités telles que le panneau Aggregations (pour afficher les valeurs les plus élevées ou les plus faibles), le tableau des résultats et les résultats développés des statistiques UDM.

Exemple : Afficher les ENTITY_TYPE distincts

Pour développer la recherche d'entités UDM, vous pouvez inclure la source du journal, l'espace de noms et un tableau de résultats pour afficher les ENTITY_TYPE distincts observés, comme suit :

graph.metadata.source_type = "ENTITY_CONTEXT"
$logType = strings.to_upper(graph.metadata.event_metadata.base_labels.log_types)
$namespace = strings.to_upper(graph.metadata.event_metadata.base_labels.namespaces)
match:
  $logType, $namespace
outcome:
  $total = count(graph.metadata.product_entity_id)
  $entityTypes = array_distinct(graph.metadata.entity_type)
order:
  $logType, $total desc
limit:
  100

Exemple : Affiner votre ensemble d'entités

Vous pouvez affiner un ensemble spécifique d'entités à l'aide de la fonctionnalité de tableau croisé dynamique de recherche UDM. Cette précision génère ensuite une requête YARA-L semblable à celle-ci :

graph.metadata.source_type = "ENTITY_CONTEXT"
$logType = strings.to_upper( graph.metadata.event_metadata.base_labels.log_types )
$namespace = strings.to_upper( graph.metadata.event_metadata.base_labels.namespaces )
AND strings.to_upper( graph.metadata.event_metadata.base_labels.log_types ) = "WINDOWS_AD"
AND strings.to_upper( graph.metadata.event_metadata.base_labels.namespaces ) = "ACME"

Contexte dérivé

Google SecOps fournit les types de contexte dérivés suivants :

  • Codes temporels first_seen et last_seen pour chaque ENTITY_TYPE
  • Prevalence : nombre de composants ayant accédé à un ENTITY_TYPE donné

Codes temporels First Seen Hour et Last Seen Hour

Google SecOps effectue une analyse statistique des données entrantes et enrichit les enregistrements du contexte des entités avec des codes temporels first_seen et last_seen :

  • Le champ first_seen_hour indique l'heure à laquelle une entité a été vue pour la première fois dans l'environnement client.
  • Le champ last_seen_hour enregistre l'heure de la dernière observation de cette entité.

Utilisateurs dont la première heure de connexion remonte aux sept derniers jours :

graph.metadata.entity_type = "USER"
graph.entity.user.userid != ""
graph.entity.user.first_seen_time.hours >= timestamp.current_hours()-(86400 * 7)

Domaines vus pour la première fois au cours des sept derniers jours :

graph.metadata.source_type = "DERIVED_CONTEXT"
graph.metadata.entity_type = "DOMAIN_NAME"
//optional, filter to only return FQDN
graph.entity.domain.name = /^([a-zA-Z0–9]([a-zA-Z0–9-]{0,61}[a-zA-Z0–9])?\.)+[a-zA-Z]{2,}$/
graph.entity.domain.first_seen_time.hours >= timestamp.current_hours()-(86400 * 7)

Fichiers (hachages) observés au cours des sept derniers jours :

graph.metadata.source_type = "DERIVED_CONTEXT"
graph.metadata.entity_type = "FILE"
//graph.entity.file.md5 != ""
//graph.entity.file.sha1 != ""
graph.entity.file.sha256 != ""
graph.entity.file.first_seen_time.hours >= timestamp.current_hours() - (86400 * 7)

ENTITY_TYPE représente un hachage FILE, par exemple entity.file.hash. Dans l'objet hash, le type peut être l'un des suivants :

  • md5
  • sha1
  • sha256

Pour rechercher un hachage spécifique, vous pouvez exécuter une recherche d'entité UDM pour le type de hachage donné :

// This will search ENTITY, DERIVED, and GLOBAL Source Types
graph.metadata.entity_type = "FILE"
graph.entity.file.sha256 = "eb5db1feadda5351c3b8fc0770e9f4c173484df5dc4a785bd1bdce7806a9e498"

Adresses IP

Les ENTITY_TYPES dérivés de IP_ADDRESS peuvent représenter des entités internes ou externes.

La recherche UDM Entity Stats suivante identifie les IP_ADDRESSES observés récemment et utilise des fonctions d'agrégation (dans la section "Résultat") pour les comptabiliser par bloc CIDR :

graph.metadata.source_type = "DERIVED_CONTEXT"
graph.metadata.entity_type = "IP_ADDRESS"
//note, for IP addresses the first seen is under artifact, not ip
graph.entity.artifact.first_seen_time.hours >= timestamp.current_hours()-(86400 * 7)
outcome:
  $total = count(graph.metadata.product_entity_id)
  $classA = sum(if(net.ip_in_range_cidr(graph.entity.ip, "10.0.0.0/8"),1,0))
  $classB = sum(if(net.ip_in_range_cidr(graph.entity.ip, "172.16.0.0/12"),1,0))
  $classC = sum(if(net.ip_in_range_cidr(graph.entity.ip, "192.168.0.0/16"),1,0))
  $classD = sum(if(net.ip_in_range_cidr(graph.entity.ip, "224.0.0.0/4"),1,0))
  // we shouldn't see results here…
  $classE = sum(if(net.ip_in_range_cidr(graph.entity.ip, "240.0.0.0/4"),1,0))
  $thisNetwork = sum(if(net.ip_in_range_cidr(graph.entity.ip, "0.0.0.0/8"),1,0))
  $loopback = sum(if(net.ip_in_range_cidr(graph.entity.ip, "127.0.0.0/8"),1,0))
  $linklocal = sum(if(net.ip_in_range_cidr(graph.entity.ip, "169.254.0.0/16"),1,0))
  $benchmark = sum(if(net.ip_in_range_cidr(graph.entity.ip, "198.18.0.0/15"),1,0))
  $cgnat = sum(if(net.ip_in_range_cidr(graph.entity.ip, "10.64.0.0/10"),1,0))

Pour examiner plus en détail une plage inhabituelle ou inattendue, vous pouvez exécuter une recherche d'entité UDM :

graph.metadata.source_type = "DERIVED_CONTEXT"
graph.metadata.entity_type = "IP_ADDRESS"
net.ip_in_range_cidr(graph.entity.ip, "198.18.0.0/15")

Prévalence

La prévalence est toujours de type DERIVED_CONTEXT.

La recherche d'entités UDM suivante identifie les noms de domaine rarement observés. Ces domaines sont spécifiquement associés à au maximum un composant distinct par jour, pendant la période de la requête (day_max = 1), et au maximum un composant distinct au cours des 10 jours précédents (rolling_max = 1).

Ce modèle est utile pour détecter les domaines avec une interaction limitée dans votre environnement :

graph.metadata.source_type = "DERIVED_CONTEXT"
graph.metadata.entity_type = "DOMAIN_NAME"
//optional, filter to only return specific TLDs where the FQDN is more than X characters
//graph.entity.domain.name = /^.{40,}\.(?:sx|cc|st|ac|lc|wd|vg|tv|cm|gd)$/
graph.entity.domain.prevalence.rolling_max = 1
graph.entity.domain.prevalence.day_max = 1

Vous pouvez également transformer cette recherche en recherche agrégée sur les statistiques des entités UDM et agréger les résultats :

graph.metadata.source_type = "DERIVED_CONTEXT"
graph.metadata.entity_type = "DOMAIN_NAME"
//optional, filter to only return FQDN
graph.entity.domain.name = /^.{40,}\.(?:sx|cc|st|ac|lc|wd|vg|tv|cm|gd)$/
$domain = graph.entity.domain.name
$length = strings.length(graph.entity.domain.name)
$tld = strings.extract_domain(graph.entity.domain.name)
graph.entity.domain.prevalence.day_max = 1
graph.entity.domain.prevalence.rolling_max = 1
match:
  $domain, $tld, $length
limit:
  10

Recherches de champ d'entité UDM de base

Voici d'autres exemples d'utilisation de la fonctionnalité "Contexte de l'entité dans la recherche" dans Google SecOps, basés sur les sources disponibles :

  • graph.entity.hostname
  • graph.entity.ip = "8.8.8.8" and graph.metadata.entity_type = "ASSET"
  • principal.ip
  • principal.hostname="baz"
  • principal.ip="1.2.3.4"
  • network.dns.questions.name="youtube.com"

Créer un tableau croisé dynamique à partir des champs d'entité

Utilisez les champs d'entité pour créer des tableaux croisés dynamiques et explorer les données associées. Voici quelques exemples de champs croisés :

  • network.email.to
  • network.email.cc
  • principal.process.file.fileMetadata.pe.importHash
  • principal.process.file.sha256
  • network.dns.questions.name

Comprendre les champs dynamiques

Les sources font référence à des champs structurés dynamiques avec des préfixes, tels que additional. Vous pouvez rechercher ces champs dans les événements UDM.

Points à prendre en compte concernant le contrôle des accès

Une limite de 50 événements est imposée aux données de contexte global, et les références aux contrôles d'accès sont supprimées.

Les sources suivantes sont compatibles avec le contexte global :

  • Navigation sécurisée
  • Relations VirusTotal
  • WHOIS
  • Majuscule
  • IOC Open Source Intel (OPEN_SOURCE_INTEL_IOC)
  • IoC Mandiant Active Breach (MANDIANT_ACTIVE_BREACH_IOC)
  • IoC Mandiant Fusion (MANDIANT_FUSION_IOC)

Limites

  • Limites de volume : limite de 1 million de résultats cumulés pour les données temporelles et intemporelles.
  • Données de contexte global : les données de contexte global sensibles telles que UPPERCASE_VT_PROTECTED, MANDIANT_ACTIVE_BREACH_IOC, MANDIANT_FUSION_IOC et VIRUS_TOTAL_CONNECTIONS sont limitées à 50 lignes. Elles sont affichées pour les utilisateurs disposant du champ d'application "Accès aux données globales".
  • Cohérence des données : les données "Dernière connexion" peuvent être différées de deux heures maximum. Il est possible que les entités associées n'affichent qu'un sous-ensemble des entités listées dans un événement.
  • Fonctionnalités non compatibles :

    • Recherches inversées sur les champs d'entité, recherches de champs groupés, faible prévalence et carte thermique.
    • Vous ne pouvez pas effectuer de jointure entre le contexte d'entité et les requêtes d'événements.

Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.