Statistiques et agrégations dans la recherche via YARA-L 2.0

Compatible avec :

Cette page explique comment exécuter des requêtes statistiques sur les événements UDM et regrouper les résultats pour les analyser à l'aide de YARA-L 2.0.

Lorsque vous traitez un grand volume d'événements UDM générés dans votre environnement, il est important de comprendre les tendances de vos données de recherche UDM. Vous pouvez utiliser des statistiques et des fonctions d'agrégation pour obtenir des insights exploitables à partir de vos journaux UDM. La recherche UDM est compatible avec toutes les fonctions d'agrégation de YARA-L 2.0.

Cas d'utilisation pour les requêtes statistiques

Vous pouvez utiliser des requêtes statistiques dans les cas d'utilisation suivants :

  • Suivez les métriques critiques : vous pouvez mesurer la distribution et la fréquence des événements UDM et des ressources associées, comme les hôtes communiquant avec des adresses IP malveillantes connues.

  • Détecter les comportements anormaux : vous pouvez identifier les pics d'activité qui peuvent indiquer des incidents de sécurité, tels que des pics de trafic réseau inattendus ou des connexions en dehors des heures de bureau.

  • Analyser les tendances au fil du temps : vous pouvez évaluer les changements de posture de sécurité pour évaluer l'efficacité des contrôles ou identifier les points à améliorer, par exemple en surveillant les fluctuations du nombre de failles au fil du temps.

Vous pouvez regrouper et trier les résultats des requêtes de recherche UDM à l'aide d'une syntaxe semblable à celle de la structure YARA-L utilisée dans les règles du moteur de détection. Pour en savoir plus, consultez la syntaxe du langage YARA-L 2.0.

La structure de requête YARA-L 2.0 est la suivante :

  • Instruction de filtrage : spécifie les conditions de filtrage des événements.

  • Correspondance (facultatif) : définit les champs à regrouper. Pour en savoir plus, consultez Syntaxe de la section "Correspondance".

  • Résultat : spécifie les résultats de la requête. Pour en savoir plus, consultez la section Syntaxe de la section "Résultat".

  • Order (Ordre) : détermine l'ordre des résultats de la requête (asc pour l'ordre croissant ou desc pour l'ordre décroissant). Si l'ordre (asc ou desc) n'est pas spécifié, la valeur par défaut est asc.

  • Limite (facultatif) : définit le nombre maximal de lignes renvoyées par la requête.

Voici un exemple d'utilisation des ordres et des limites :

metadata.log_type = "OKTA"

match:
    principal.ip
Outcome:
    $user_count_by_ip = count(principal.user.userid)

order:
 $user_count_by_ip desc

limit:
    20

Agrégations

La recherche UDM est compatible avec les fonctions d'agrégation suivantes :

tableau

array(expression)

Description

La fonction array renvoie toutes les valeurs sous forme de liste. Elle tronque la liste pour afficher un maximum de 25 éléments aléatoires.

Types de données des paramètres

STRING

Type renvoyé

LIST

Exemples de code

Exemple

Renvoie un tableau contenant les types d'événements.

  $event_type = metadata.event_type
  outcome:
    $event_type_array = array($event_type)

array_distinct

array_distinct(expression)

Description

La fonction array_distinct renvoie toutes les valeurs distinctes sous forme de liste. La liste est tronquée à un maximum de 25 éléments aléatoires. La déduplication permettant d'obtenir une liste distincte est appliquée avant la troncature.

Types de données des paramètres

STRING

Type renvoyé

LIST

Exemples de code

Exemple

Renvoie un tableau contenant des types d'événements distincts.

  $event_type = metadata.event_type
  outcome:
    $event_type_array = array_distinct($event_type)

moy.

avg(numericExpression)

Description

La fonction avg renvoie la moyenne des valeurs d'une colonne numérique. Elle ignore les valeurs NULL lors du calcul. Elle est souvent utilisée avec match pour calculer les moyennes de groupes spécifiques dans les données.

Types de données des paramètres

NUMBER

Type renvoyé

NUMBER

Exemples de code

Exemple

Recherchez tous les événements où target.ip n'est pas vide. Pour tous les événements qui correspondent à principal.ip, stockez la moyenne de metadata.event_timestamp.seconds dans une variable appelée avg_seconds.

  target.ip != ""
  match:
    principal.ip
  outcome:
    $avg_seconds = avg(metadata.event_timestamp.seconds)

nombre

count(expression)

Description

La fonction count renvoie le nombre de lignes d'un groupe. Elle est souvent utilisée avec match pour obtenir le nombre d'éléments de groupes spécifiques dans les données.

Types de données des paramètres

STRING

Type renvoyé

NUMBER

Exemples de code

Exemple

Renvoie le nombre de connexions utilisateur réussies au fil du temps.

  metadata.event_type = "USER_LOGIN"
  $security_result = security_result.action
  $security_result = "ALLOW"
  $date = timestamp.get_date(metadata.event_timestamp.seconds, "America/Los_Angeles")
  match:
      $security_result, $date
  outcome:
      $event_count = count(metadata.id)

count_distinct

count_distinct(expression)

Description

La fonction count_distinct renvoie le nombre de lignes qui comportent des valeurs distinctes dans un groupe. Il est souvent utilisé avec match pour obtenir le nombre d'éléments de groupes spécifiques dans les données.

Types de données des paramètres

STRING

Type renvoyé

NUMBER

Exemples de code

Exemple

Renvoie le nombre de connexions utilisateur réussies distinctes au fil du temps.

  metadata.event_type = "USER_LOGIN"
  $security_result = security_result.action
  $security_result = "ALLOW"
  $date = timestamp.get_date(metadata.event_timestamp.seconds, "America/Los_Angeles")
  match:
      $security_result, $date
  outcome:
      $event_count = count_distinct(metadata.id)

max

max(numericExpression)

Description

La fonction max renvoie la valeur maximale des valeurs d'une colonne numérique. Il est souvent utilisé avec match pour obtenir la valeur maximale de chaque groupe de données.

Types de données des paramètres

NUMBER

Type renvoyé

NUMBER

Exemples de code

Exemple

Recherchez tous les événements où target.ip n'est pas vide. Pour tous les événements qui correspondent à principal.ip, stockez le maximum de metadata.event_timestamp.seconds dans une variable appelée max_seconds.

  target.ip != ""
  match:
    principal.ip
  outcome:
    $max_seconds = max(metadata.event_timestamp.seconds)

min

min(numericExpression)

Description

La fonction min renvoie la valeur minimale des valeurs d'une colonne numérique. Elle est souvent utilisée avec match pour obtenir la valeur minimale de chaque groupe de données.

Types de données des paramètres

NUMBER

Type renvoyé

NUMBER

Exemples de code

Exemple

Recherchez tous les événements où target.ip n'est pas vide. Pour tous les événements qui correspondent à principal.ip, stockez le minimum de metadata.event_timestamp.seconds dans une variable nommée min_seconds.

  target.ip != ""
  match:
    principal.ip
  outcome:
    $min_seconds = min(metadata.event_timestamp.seconds)

pondérée

sum(numericExpression)

Description

La fonction sum renvoie la somme des valeurs d'une colonne numérique. Elle ignore les valeurs NULL lors du calcul. Il est souvent utilisé avec match pour calculer les sommes dans différents groupes de données.

Types de données des paramètres

NUMBER

Type renvoyé

NUMBER

Exemples de code

Exemple

Recherchez tous les événements où target.ip n'est pas vide. Pour tous les événements qui correspondent à principal.ip, stockez une somme de network.sent_bytes dans une variable appelée sent_bytes.

  target.ip != ""
  match:
    principal.ip
  outcome:
    $sent_bytes = sum(network.sent_bytes)

stddev

stddev(numericExpression)

Description

La fonction stddev renvoie l'écart-type de toutes les valeurs possibles.

Types de données des paramètres

NUMBER

Type renvoyé

NUMBER

Exemples de code

Exemple

Recherchez tous les événements où target.ip n'est pas vide. Pour tous les événements qui correspondent à principal.ip, stockez l'écart-type de metadata.event_timestamp.seconds dans une variable appelée stddev_seconds.

  target.ip != ""
  match:
    principal.ip
  outcome:
    $stddev_seconds = stddev(metadata.event_timestamp.seconds)

le plus tôt possible

earliest(timestamp)

Description

La fonction earliest renvoie le code temporel le plus ancien d'un ensemble d'enregistrements avec une résolution en microsecondes.

Types de données des paramètres

TIMESTAMP

Type renvoyé

TIMESTAMP

Exemples de code

Exemple

Pour tous les événements qui correspondent à hostname, stockez la valeur la plus ancienne de metadata.event_timestamp dans la variable start.

  $hostname = principal.hostname
  match:
    $hostname
  outcome:
    $start = earliest(metadata.event_timestamp)

dernière

latest(timestamp)

Description

La fonction latest renvoie le dernier code temporel d'un ensemble d'enregistrements avec une résolution en microsecondes.

Types de données des paramètres

TIMESTAMP

Type renvoyé

TIMESTAMP

Exemples de code

Exemple

Pour tous les événements qui correspondent à hostname, stockez la dernière valeur de metadata.event_timestamp dans la variable end.

  $hostname = principal.hostname
  match:
    $hostname
  outcome:
    $end = latest(metadata.event_timestamp)

YARA-L 2.0 : recherche et utilisation de l'UDM

  • Le mot clé over, utilisé pour les recherches de fenêtres d'événement, n'est pas compatible avec la recherche.

  • Les requêtes de recherche UDM n'incluent pas les sections condition et option.

Regrouper par précision temporelle

Vous pouvez regrouper les champs d'événement et les espaces réservés dans la section match selon une précision temporelle spécifique, de la même manière que vous regroupez une colonne en SQL.

La syntaxe est la suivante :

match:
  ... [BY|OVER EVERY] [FIRST] [TIME_GRANULARITY]

Pour regrouper les données par précision temporelle, vous pouvez utiliser le mot clé by ou over every. Les niveaux de précision temporelle autorisés sont les suivants :

  • MINUTE ou m
  • HOUR ou h
  • DAY ou d
  • WEEK ou w
  • MONTH ou mo

Les mots clés by et over every sont fonctionnellement équivalents. Vous pouvez en choisir une plutôt qu'une autre.

Exemples

Regroupez l'adresse IP et le nom d'hôte du groupe par heure.

$hostname = principal.hostname
match:
  $hostname, target.ip by hour

Regroupez le nombre de tous les événements par nom d'hôte et par jour où l'événement s'est produit.

$hostname = target.hostname
match:
  $hostname over every day
outcome:
  $events_count = count($hostname)

Certaines sources de données, comme le contexte d'entité, sont valides sur une période (<start_time>, <end_time>) et n'ont pas d'horodatages uniques.

Le mot clé first est facultatif et s'applique à un seul code temporel. Cela signifie que pour une source de données valide sur une période donnée, le mot clé first ne prend en compte que l'heure de début (<start_time>).

Prenons l'exemple d'une entité avec une plage de dates (1m, 5m) et une précision temporelle de 1m. Si les résultats sont regroupés par hôtes (h1,h2), les colonnes renvoyées seront (h1, 1m) et (h2, 1m), le reste de la plage de dates étant ignoré.

Le mot clé first peut être ajouté à by et over every, ce qui entraîne le même comportement pour les deux. L'utilisation de by first équivaut à over every first.

Voici un exemple de requête qui utilise l'opérateur by avec la source de données de contexte d'entité valide sur une période donnée. Dans cette requête, l'intégralité de la plage de dates est prise en compte, car le mot clé first est omis.

graph.entity.hostname != ""
match:
  graph.entity.ip by hour
outcome:
  $min_seconds = min(graph.metadata.event_metadata.event_timestamp.seconds)

Créer et enregistrer des visualisations dans la recherche

Cette section décrit les fonctionnalités de visualisation des données dans la recherche Google SecOps Unified Data Model (UDM). Cette fonctionnalité permet aux analystes du centre des opérations de sécurité (SOC) de détecter, d'analyser et de contrer efficacement les menaces en créant des visualisations à partir des résultats de recherche et en les enregistrant dans des tableaux de bord.

Créer et enregistrer des visualisations dans le tableau de bord

Pour créer et enregistrer des visualisations à ajouter au tableau de bord, procédez comme suit :

  1. Écrivez une requête YARA-L avec des sections match et outcome.

  2. Sélectionnez une plage de dates, puis cliquez sur Exécuter la recherche pour exécuter la requête. Affichez les résultats dans les onglets Statistiques et Visualiser.

  3. Dans l'onglet Visualiser, procédez comme suit : a. Sélectionnez un type de graphique dans la liste Type de graphique. b. Ajustez les paramètres sous Paramètres des données pour personnaliser le graphique.

  4. Sur l'écran Ajouter au tableau de bord, procédez comme suit : a. Saisissez un nom, une description et une période pour le graphique. b. Choisissez d'ajouter le graphique à un tableau de bord existant ou d'en créer un.

  5. Cliquez sur Ajouter au tableau de bord pour ajouter le graphique au tableau de bord.

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