Statistiques et agrégations dans la recherche UDM à l'aide de YARA-L 2.0
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.
Lorsque vous gérez 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 des requêtes statistiques
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 et des composants associés, tels que les hôtes communiquant avec des adresses IP malveillantes connues.
Détectez 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 ouvrées.
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 axes d'amélioration, par exemple en surveillant les fluctuations du nombre de failles au fil du temps.
Structure de requête YARA-L 2.0 dans la recherche
Vous pouvez regrouper et trier les résultats de requête 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 section 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 la section Syntaxe de la section "Match".
Résultat: spécifie les sorties de la requête. Pour en savoir plus, consultez la section Syntaxe de la section "Résultats".
Order (Ordre) : détermine l'ordre des résultats de la requête (
asc
, croissant oudesc
, décroissant). Si l'ordre (asc
oudesc
) n'est pas spécifié, la valeur par défaut estasc
.Limit (facultatif): définit 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:
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)
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 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_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 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)
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)
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)
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)
YARA-L 2.0: recherche par rapport à l'utilisation de l'UDM
Le mot clé
over
, utilisé pour les recherches dans la fenêtre d'événements, 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
en fonction d'une granularité temporelle spécifiée, comme pour regrouper une colonne 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
oum
HOUR
ouh
DAY
oud
WEEK
ouw
MONTH
oumo
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 code temporel unique.
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, le mot clé first
ne prend en compte que l'heure de début (<start_time>
).
Prenons l'exemple d'une entité dont la période temporelle est (1m, 5m
) avec une granularité 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
), et le reste de la période sera ignoré.
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)
Créer et enregistrer des visualisations dans la recherche
La recherche UDM (Unified Data Model) de Google SecOps offre de puissantes fonctionnalités de visualisation des données. Ces fonctionnalités permettent aux analystes du centre d'opérations de sécurité (SOC) de détecter, d'analyser 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 natif
Pour créer et enregistrer des visualisations à ajouter au tableau de bord natif, 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 de graphique, une description et une plage temporelle. b. Choisissez d'ajouter le graphique à un tableau de bord existant ou de créer un tableau de bord.
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.