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.
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.
Structure de requête YARA-L 2.0 dans la recherche
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:
Instruction de filtrage: l'instruction de filtrage spécifie les conditions à appliquer pour filtrer les événements.
Correspondance (facultatif): la section "Correspondance" spécifie les champs à regrouper. Pour en savoir plus, consultez la section Syntaxe de la section "Match".
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".
Order (Ordre) : la section "Order" spécifie l'ordre des résultats de la requête renvoyés. Si l'ordre (
asc
oudesc
) n'est pas spécifié, il est défini par défaut surasc
.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
etoption
.
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
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 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:
É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. Le résultat de la requête s'affiche dans deux onglets: Statistiques et Visualiser.
Dans l'onglet Visualiser, sélectionnez le type de graphique dans la liste Type de graphique.
Pour le type de graphique sélectionné, modifiez les paramètres sous Paramètres des données afin de personnaliser le graphique.
Sur l'écran Ajouter au tableau de bord, ajoutez le nom, la description et la période du graphique.
Sélectionnez l'option appropriée pour ajouter le graphique à des tableaux de bord existants ou à un nouveau tableau de bord.
Cliquez sur Ajouter au tableau de bord pour ajouter le graphique au tableau de bord.