Corréler des données avec des jointures externes

Compatible avec :

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 match doit 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.hostname est 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 5m
    
    
  • Event-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.hostname
    
    
  • 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
    
    
  • Event-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 match doit 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.hostname est 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 $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

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 5m
    
    
  • Entité-é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 5m
    
    
  • Datatable-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.hostname
    
    
  • Entité-é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
    
    
  • Datatable-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.