Statistiques et agrégations dans la recherche UDM à l'aide de 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 à des fins d'analyse à l'aide de YARA-L 2.0.

Présentation

Lorsque vous devez gérer 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.

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

  • Suivre les métriques critiques: vous pouvez mesurer la distribution et la fréquence des événements UDM, ainsi que les composants concernés, tels que les hôtes communiquant avec des adresses IP malveillantes connues.

  • Détecter un comportement anormal: vous pouvez détecter des tendances inhabituelles ou des pics d'activité qui pourraient indiquer un incident de sécurité, comme des volumes de trafic réseau inhabituels ou une activité de connexion inattendue en dehors des heures habituelles.

  • Analyser les tendances au fil du temps: vous pouvez identifier les changements dans la stratégie de sécurité pour évaluer l'impact des contrôles ou trouver les domaines à améliorer, par exemple en suivant l'évolution du nombre de failles au fil du temps.

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

La structure de la requête est la suivante:

  1. Instruction de filtrage: l'instruction de filtrage spécifie les conditions à appliquer pour filtrer les événements.

  2. Correspondance (facultatif): la section "Correspondance" spécifie les champs à regrouper. Pour en savoir plus, consultez la section Syntaxe de la section "Match".

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

  4. Order (Ordre) : la section "Order" spécifie l'ordre des résultats de la requête renvoyés. Si l'ordre (asc ou desc) n'est pas spécifié, il est défini par défaut sur asc.

  5. Limit (facultatif): la section "Limit" spécifie le nombre maximal de lignes renvoyées par la requête.

Voici un exemple d'ordre et de limite d'utilisation:

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:

pondérée

sum(numericExpression)

Description

La fonction sum renvoie la somme des valeurs d'une colonne numérique. Il 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 Param

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 correspondant à principal.ip, stockez la somme de network.sent_bytes dans une variable appelée sent_bytes.

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

min

min(numericExpression)

Description

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

Types de données Param

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 correspondant à principal.ip, stockez la valeur minimale de metadata.event_timestamp.seconds dans une variable appelée min_seconds.

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

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 dans chaque groupe de données.

Types de données Param

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 correspondant à principal.ip, stockez la valeur maximale 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)

moy.

avg(numericExpression)

Description

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

Types de données Param

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 correspondant à 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. Il est souvent utilisé avec match pour obtenir des totaux pour des groupes spécifiques dans les données.

Types de données Param

STRING

Type renvoyé

NUMBER

Exemples de code

Exemple

Renvoie le nombre de connexions réussies des utilisateurs 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 ayant des valeurs distinctes dans un groupe. Il est souvent utilisé avec match pour obtenir des totaux pour des groupes spécifiques dans les données.

Types de données Param

STRING

Type renvoyé

NUMBER

Exemples de code

Exemple

Renvoie le nombre de connexions réussies distinctes d'utilisateurs 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)

tableau

array(expression)

Description

La fonction array renvoie toutes les valeurs sous la forme d'une liste. Il tronque la liste à un maximum de 25 éléments aléatoires.

Types de données Param

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 la forme d'une liste. Elle réduit la liste à un maximum de 25 éléments aléatoires. La déduplication pour obtenir une liste distincte est appliquée avant la troncation.

Types de données Param

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)

stddev

stddev(numericExpression)

Description

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

Types de données Param

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 correspondant à 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)

Différences entre l'utilisation de YARA-L 2.0 dans la recherche et son utilisation dans UDM

  • Le mot clé over, qui permet de rechercher des événements dans une période, n'est pas applicable dans la recherche.

  • La structure de la requête de recherche UDM n'inclut pas les sections condition et option.

Regrouper par précision temporelle

Vous pouvez regrouper tous les champs et espaces réservés d'événement de la section match en fonction d'une granularité temporelle spécifiée, comme une colonne que vous pourriez regrouper en SQL.

La syntaxe est la suivante:

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

Pour regrouper par granularité temporelle, vous pouvez utiliser le mot clé by ou over every. Les précisions temporelles autorisées sont les suivantes:

  • 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 utiliser l'une plutôt que l'autre.

Exemples

Adresse IP et 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 de l'événement.

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

Certaines sources de données, comme le contexte de l'entité, sont valides sur une période (<start_time>, <end_time>) et ne comportent pas de codes temporels uniques.

Le mot clé first est un mot clé facultatif qui traite une source de données valide sur une période comme s'il s'agissait d'une source de données valide sur un code temporel unique. Cela signifie que pour une source de données valide sur une période donnée, le mot clé first ne tient compte que de l'heure de début (<start_time>), en ignorant l'heure de fin de la période.

Prenons l'exemple d'une entité dont la plage temporelle est (1m, 5m) avec une granularité temporelle de 1 m. Supposons que les résultats soient regroupés par hôtes, qui sont (h1, h2). Les colonnes qui sont ensuite renvoyées sont (h1, 1m) et (h2, 1m), car le reste de la période n'est pas pris en compte.

Le mot clé first peut être ajouté à la fois à by et à over every, ce qui entraîne le même comportement pour les deux. L'utilisation de by first est équivalente à 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. Dans cette requête, toute la période 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)

Visualisations dans la recherche

Cette section décrit les fonctionnalités de visualisation des données dans la recherche Google SecOps basée sur le modèle de données unifié (UDM). Cette fonctionnalité permet aux analystes du centre des opérations de sécurité (SOC) de détecter, d'examiner et de répondre efficacement aux 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 Preview

Pour enregistrer des visualisations dans le tableau de bord d'aperçu, 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. Le résultat de la requête s'affiche dans deux onglets: Statistiques et Visualiser.

  3. Dans l'onglet Visualiser, sélectionnez le type de graphique dans la liste Type de graphique.

  4. Pour le type de graphique sélectionné, modifiez les paramètres sous Paramètres des données afin de personnaliser le graphique.

  5. Sur l'écran Ajouter au tableau de bord, ajoutez le nom, la description et la période du graphique.

  6. Sélectionnez l'option appropriée pour ajouter le graphique à des tableaux de bord existants ou à un nouveau tableau de bord.

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