Statistiques et agrégations dans la recherche via YARA-L 2.0
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.
Structure des requêtes YARA-L 2.0 dans la recherche
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 oudesc
pour l'ordre décroissant). Si l'ordre (asc
oudesc
) n'est pas spécifié, la valeur par défaut estasc
.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
etoption
.
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
oum
HOUR
ouh
DAY
oud
WEEK
ouw
MONTH
oumo
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 :
Écrivez une requête YARA-L avec des sections
match
etoutcome
.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.
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.
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.
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.