Corréler des données avec des jointures externes
Ce document décrit les jointures externes (jointure gauche et jointure droite). Les opérations de jointure permettent de corréler et de combiner des données provenant de plusieurs sources en fonction de valeurs de champ communes. En combinant les événements et les entités de sécurité associés dans une vue unique et complète, vous pouvez détecter et examiner efficacement les menaces.
Contrairement aux jointures standards (internes), qui nécessitent des entrées correspondantes dans les deux sources de données, une jointure externe récupère tous les enregistrements d'un côté de la jointure, même s'il n'y a pas d'entrées correspondantes de l'autre côté. Les champs non correspondants de l'autre côté sont généralement remplis avec null. Cela vous évite de perdre des données sans correspondance.
Fonctionnement des jointures externes
Le concept de jointures externes dans YARA-L 2.0 est identique à celui des jointures externes SQL standard :
La jointure externe gauche conserve tous les enregistrements du côté gauche de la jointure.
La jointure externe droite conserve tous les enregistrements du côté droit de la jointure.
La syntaxe de jointure externe (jointure gauche et jointure droite) est acceptée pour toutes les requêtes, avec ou sans condition match.
Comprendre la jointure externe gauche
Une jointure externe gauche (ou jointure gauche) conserve tous les enregistrements de la source de données à gauche du mot clé left join.
Si un enregistrement du côté gauche ne trouve aucune correspondance dans l'événement de droite, les champs de l'événement de droite sont renvoyés sous la forme
null.Implication des espaces réservés : toute variable d'espace réservé utilisée dans la section
matchdoit faire référence à un champ de l'événement de gauche pour garantir une agrégation précise des données dans l'ensemble des résultats.
Exemple de jointure externe gauche d'événement à événement
L'exemple suivant illustre une jointure externe de gauche permettant de corréler les événements de connexion utilisateur avec les événements de connexion réseau ultérieurs se produisant sur le même hôte.
La jointure de gauche garantit que tous les événements USER_LOGIN sont conservés dans l'ensemble de résultats. Si un événement NETWORK_CONNECTION correspondant ($e2) est trouvé, ses données sont associées.
Si aucune correspondance n'est trouvée, les champs pour $e2 sont null.
$e1.metadata.event_type = "USER_LOGIN"
$e2.metadata.event_type = "NETWORK_CONNECTION"
left join $e1.principal.hostname = $e2.principal.hostname
Définir l'événement de gauche
L'exemple de requête suivant définit le côté gauche de la jointure ($e1), qui correspond à l'ensemble d'événements conservé dans le résultat final :
$e1.metadata.event_type = "USER_LOGIN"
Le tableau suivant représente le résultat de la requête, qui identifie l'ensemble initial d'événements de connexion utilisateur :
| Type d'événement | Nom d'hôte principal | Adresse IP |
|---|---|---|
USER_LOGIN
|
workstation-01
|
192.168.1.101
|
USER_LOGIN
|
laptop-hr-02
|
192.168.1.102
|
USER_LOGIN
|
server-db-03
|
10.0.0.50
|
USER_LOGIN
|
kiosk-4
|
192.168.1.104
|
Définir le bon événement
L'exemple de requête suivant définit le côté droit de la jointure ($e2), qui correspond à l'ensemble d'événements mis en correspondance avec les événements de gauche :
$e2.metadata.event_type = "NETWORK_CONNECTION"
Le tableau suivant représente l'ensemble des événements de connexion réseau disponibles pour la mise en correspondance :
| Type d'événement | Nom d'hôte principal | Adresse IP |
|---|---|---|
NETWORK_CONNECTION
|
workstation-01
|
192.168.1.101
|
NETWORK_CONNECTION
|
laptop-hr-02
|
192.168.1.101
|
NETWORK_CONNECTION
|
kiosk-4
|
203.0.113.3
|
Participer aux événements
avec une section "Correspondances"
L'exemple suivant illustre une requête de correspondance utilisant une jointure externe de gauche sur le champ principal.hostname :
$e1.metadata.event_type = "USER_LOGIN"
$e2.metadata.event_type = "NETWORK_CONNECTION"
left join $e1.principal.hostname = $e2.principal.hostname
$host = $e1.principal.hostname
match:
$host over 5m
La jointure externe gauche garantit que chaque événement
USER_LOGIN($e1) est inclus dans l'ensemble de résultats final.La valeur de
$e1.principal.hostnameest attribuée à l'espace réservé $host. La jointure externe de gauche garantit la présence de l'événement$e1, ce qui permet de s'assurer que la variable $host est toujours renseignée pour l'agrégation.La règle agrège les résultats par hôte pour une période de cinq minutes.
Résultat de la requête Join
Les données obtenues montrent la combinaison des deux événements. Tous les enregistrements de la table de gauche ($e1) sont conservés, et les champs de la table de droite ($e2) sont définis sur null lorsqu'aucun nom d'hôte correspondant n'est trouvé (par exemple, pour server-db-03).
Type d'événement ($e1)
|
Nom d'hôte principal ($host)
|
Adresse IP ($e1)
|
Type d'événement ($e2)
|
Adresse IP ($e2)
|
État de la mise en correspondance |
|---|---|---|---|---|---|
USER_LOGIN
|
workstation-01
|
192.168.1.101
|
NETWORK_CONNECTION
|
192.168.1.101
|
Correspondance trouvée |
USER_LOGIN
|
laptop-hr-02
|
192.168.1.102
|
NETWORK_CONNECTION
|
192.168.1.101
|
Correspondance trouvée |
USER_LOGIN
|
server-db-03
|
10.0.0.50
|
null
|
null
|
Aucune correspondance |
USER_LOGIN
|
kiosk-4
|
192.168.1.104
|
NETWORK_CONNECTION
|
203.0.113.3
|
Correspondance trouvée |
Exemples de requêtes de jointure externe gauche
Cette section fournit des exemples de requêtes de jointure à gauche.
Jointures avec une condition de correspondance
Event-entity
$e1.metadata.event_type = "NETWORK_CONNECTION" $g1.graph.metadata.entity_type = "ASSET" left join $e1.principal.asset.hostname = $g1.graph.entity.asset.hostname $host = $e1.principal.asset.hostname match: $host over 5mEvent-datatable
$host = $e1.principal.hostname left join $e1.principal.hostname = %all_dt_column_types.hostname match: $host by 5m
Jointures sans condition de correspondance
Événement-événement
$e1.metadata.event_type = "USER_LOGIN" $e1.principal.ip = "114.241.96.87" $e2.metadata.event_type = "NETWORK_CONNECTION" left join $e1.principal.hostname = $e2.principal.hostnameEvent-entity
$e1.metadata.event_type = "NETWORK_CONNECTION" $g1.graph.metadata.entity_type = "ASSET" left join $e1.principal.asset.hostname = $g1.graph.entity.asset.hostname $host = $e1.principal.asset.hostnameEvent-datatable
$host = $e1.principal.hostname left join $e1.principal.hostname = %all_dt_column_types.hostname
Jointure externe droite
Une jointure externe droite (ou jointure droite) conserve tous les enregistrements de la source de données située à droite du mot clé right join.
Si un enregistrement de l'événement de droite ne trouve aucune correspondance dans l'événement de gauche, les champs de l'événement de gauche sont renvoyés sous la forme
null.Implication des espaces réservés : toute variable d'espace réservé utilisée dans la section
matchdoit faire référence à un champ de l'événement de droite pour garantir une agrégation précise des données dans l'ensemble complet des résultats.
Exemple de jointure droite d'événement à événement
L'exemple suivant illustre un right outer join permettant de corréler les événements de connexion utilisateur avec les événements de connexion réseau ultérieurs se produisant sur le même hôte.
right join garantit que tous les événements NETWORK_CONNECTION sont conservés dans l'ensemble de résultats. Si un événement USER_LOGIN correspondant est trouvé, ses données sont jointes.
Si aucune correspondance n'est trouvée, les champs pour$e1 sont null.
$e1.metadata.event_type = "USER_LOGIN"
$e2.metadata.event_type = "NETWORK_CONNECTION"
right join $e1.principal.hostname = $e2.principal.hostname
Définir l'événement de sortie
La requête suivante définit le côté gauche de la jointure ($e1), qui correspond à l'ensemble d'événements facultatif dans le résultat final :
$e1.metadata.event_type = "USER_LOGIN"
Le tableau suivant représente le résultat de la requête, qui identifie l'ensemble initial d'événements de connexion utilisateur :
| Type d'événement | Nom d'hôte principal | Adresse IP |
|---|---|---|
USER_LOGIN
|
workstation-01
|
192.168.1.101
|
USER_LOGIN
|
laptop-hr-02
|
192.168.1.102
|
USER_LOGIN
|
server-db-03
|
10.0.0.50
|
Définir le bon événement
La requête suivante définit le côté droit de la jointure ($e2), qui correspond à l'ensemble d'événements conservé dans le résultat final.
$e2.metadata.event_type = "NETWORK_CONNECTION"
Le tableau suivant représente l'ensemble des événements de connexion réseau disponibles pour la mise en correspondance.
| Type d'événement | Nom d'hôte principal | Adresse IP |
|---|---|---|
NETWORK_CONNECTION
|
workstation-01
|
192.168.1.101
|
NETWORK_CONNECTION
|
laptop-hr-02
|
192.168.1.101
|
NETWORK_CONNECTION
|
vm-unauth-05
|
203.0.113.3
|
Participer aux événements
L'exemple suivant montre une requête de correspondance avec une jointure externe de droite sur le champ principal.hostname :
$e1.metadata.event_type = "USER_LOGIN"
$e2.metadata.event_type = "NETWORK_CONNECTION"
right join $e1.principal.hostname = $e2.principal.hostname
$host = $e1.principal.hostname
match:
$host over 5m
La jointure externe droite garantit que chaque événement
NETWORK_CONNECTION($e2) est inclus dans l'ensemble de résultats final.La valeur de
$e2.principal.hostnameest attribuée à l'espace réservé$host. La jointure externe droite garantit la présence de l'événement$e2, ce qui permet de s'assurer que la variable$hostest toujours renseignée pour l'agrégation.La règle agrège les résultats par hôte pour une période de cinq minutes.
Résultat de la requête Join
L'ensemble de données obtenu affiche la combinaison des deux événements. Tous les enregistrements de la table de droite ($e2) sont conservés, et les champs de la table de gauche ($e1) sont définis sur "null" lorsqu'aucun nom d'hôte correspondant n'est trouvé (par exemple, vm-unauth-05).
Type d'événement ($e1)
|
Nom d'hôte principal ($e1)
|
Adresse IP ($e1)
|
Type d'événement ($e2)
|
Nom d'hôte principal ($host) | Adresse IP ($e2)
|
État de la mise en correspondance |
|---|---|---|---|---|---|---|
USER_LOGIN
|
workstation-01
|
192.168.1.101
|
NETWORK_CONNECTION
|
workstation-01
|
192.168.1.101
|
Correspondance trouvée |
USER_LOGIN
|
laptop-hr-02
|
192.168.1.102
|
NETWORK_CONNECTION
|
laptop-hr-02
|
192.168.1.101
|
Correspondance trouvée |
null
|
null
|
null
|
NETWORK_CONNECTION
|
vm-unauth-05
|
203.0.113.4
|
Aucune correspondance |
Exemples de requêtes de jointure à droite
Cette section fournit des exemples de requêtes de jointure externe à droite.
Jointures avec une condition de correspondance
Événement-événement
$e1.metadata.event_type = "USER_LOGIN" $e2.metadata.event_type = "NETWORK_CONNECTION" right join $e1.principal.hostname = $e2.principal.hostname $host = $e2.principal.hostname match: $host over 5mEntité-événement
$e1.metadata.event_type = "NETWORK_CONNECTION" $g1.graph.metadata.entity_type = "ASSET" right join $g1.graph.entity.asset.hostname = $e1.principal.asset.hostname $host = $e1.principal.asset.hostname match: $host over 5mDatatable-event
$host = $e1.principal.hostname right join %all_dt_column_types.hostname = $e1.principal.hostname match: $host by 5m
Jointures sans condition de correspondance
Événement-événement
$e1.metadata.event_type = "USER_LOGIN" $e1.principal.ip = "114.241.96.87" $e2.metadata.event_type = "NETWORK_CONNECTION" right join $e1.principal.hostname = $e2.principal.hostnameEntité-événement
$e1.metadata.event_type = "NETWORK_CONNECTION" $g1.graph.metadata.entity_type = "ASSET" right join $g1.graph.entity.asset.hostname = $e1.principal.asset.hostname $host = $e1.principal.asset.hostnameDatatable-event
$host = $e1.principal.hostname right join %all_dt_column_types.hostname = $e1.principal.hostname
Limites
Tenez compte des limites suivantes lorsque vous créez des jointures externes :
Les jointures externes complètes (jointures gauches et droites combinées) ne sont pas acceptées.
La période de la requête pour les jointures sans correspondance est limitée à 14 jours maximum.
Vous ne pouvez pas joindre directement deux sources contextuelles (par exemple, une entité directement à une table de données).
L'événement principal du modèle de données unifié (UDM) doit être le côté conservé de la jointure externe. La requête n'est pas valide si l'événement principal se trouve du côté "nullable".
Une jointure événement-entité doit être une jointure gauche. L'événement est ainsi correctement conservé (
$e1).Une jointure entité-événement doit être une jointure à droite. L'événement est ainsi correctement conservé (
$e1).
L'exemple suivant n'est pas valide, car l'événement UDM (
$e1) se trouve à gauche, mais la jointure droite préserve le côté droit ($g1), ce qui ne respecte pas la règle selon laquelle l'événement UDM doit être conservé :// Invalid query $e1.metadata.event_type = "NETWORK_CONNECTION" $g1.graph.metadata.entity_type = "ASSET" right join $e1.principal.asset.hostname = $g1.graph.entity.asset.hostname
Bonnes pratiques
Pour éviter les ralentissements et les délais d'expiration des requêtes dans les requêtes de jointure externe, utilisez des filtres spécifiques et précis.
Par exemple, une requête large comme celle-ci :
$e1.metadata.event_type = "USER_LOGIN"
$e2.metadata.event_type = "NETWORK_CONNECTION"
right join $e1.principal.hostname = $e2.principal.hostname
Vous pouvez optimiser vos campagnes en ajoutant des critères spécifiques :
$e1.metadata.event_type = "USER_LOGIN"
$e1.principal.ip = "121.121.121.121"
$e1.principal.user.userid = "alex"
$e2.metadata.event_type = "NETWORK_CONNECTION"
$e2.src.hostname = "altostrat.com"
$e1.principal.hostname = $e2.principal.hostname
Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.