Correlaciona datos con combinaciones externas

Compatible con:

En este documento, se describen las combinaciones externas (combinación izquierda y combinación derecha). Las operaciones de unión se usan para correlacionar y combinar datos de varias fuentes en función de valores de campos comunes. Al combinar eventos y entidades de seguridad relacionados en una sola vista integral, puedes proporcionar una detección e investigación de amenazas eficaces.

A diferencia de las combinaciones estándar (internas), que requieren entradas coincidentes en ambas fuentes de datos, una combinación externa recupera todos los registros de un lado de la combinación, incluso si no hay entradas coincidentes en el otro. Por lo general, los campos no coincidentes del otro lado se completan con null. Esto evita que pierdas datos que no tienen coincidencias.

Cómo funcionan las combinaciones externas

El concepto de uniones externas en YARA-L 2.0 es idéntico al de las uniones externas de SQL estándar:

  • La unión externa izquierda conserva todos los registros del lado izquierdo de la unión.

  • La combinación externa derecha conserva todos los registros del lado derecho de la combinación.

La sintaxis de combinación externa (combinación izquierda y combinación derecha) se admite para todas las consultas, tanto con una condición match como sin ella.

Comprende la unión externa izquierda

Una combinación externa izquierda (o combinación izquierda) conserva todos los registros de la fuente de datos en el lado izquierdo de la palabra clave left join.

  • Si un registro del lado izquierdo no coincide con ningún registro del evento de la derecha, los campos del evento de la derecha se devuelven como null.

  • Implicación de marcador de posición: Cualquier variable de marcador de posición que se use en la sección match debe hacer referencia a un campo del evento de la izquierda para garantizar una agregación de datos precisa en todo el conjunto de resultados.

Ejemplo de unión izquierda de evento a evento

En el siguiente ejemplo, se muestra una combinación externa izquierda para correlacionar los eventos de acceso del usuario con los eventos de conexión de red posteriores que ocurren en el mismo host. La combinación izquierda garantiza que todos los eventos USER_LOGIN se conserven en el conjunto de resultados. Si se encuentra un evento NETWORK_CONNECTION coincidente ($e2), se unen sus datos. Si no se encuentra ninguna coincidencia, los campos de $e2 son null.


$e1.metadata.event_type = "USER_LOGIN"
$e2.metadata.event_type = "NETWORK_CONNECTION"
left join $e1.principal.hostname = $e2.principal.hostname

Define el evento a la izquierda

En el siguiente ejemplo de consulta, se define el lado izquierdo de la unión ($e1), que es el conjunto de eventos que se conserva en el resultado final:

$e1.metadata.event_type = "USER_LOGIN"

En la siguiente tabla, se representa el resultado de la consulta, en el que se identifica el conjunto inicial de eventos de acceso del usuario:

Tipo de evento Nombre de host principal Dirección 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

Define el evento correcto

En el siguiente ejemplo de consulta, se define el lado derecho de la unión ($e2), que es el conjunto de eventos que se compara con los eventos de la izquierda:

$e2.metadata.event_type = "NETWORK_CONNECTION"

En la siguiente tabla, se muestra el conjunto de eventos de conexión de red disponibles para la correlación:

Tipo de evento Nombre de host principal Dirección 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

Únete a los eventos

con una sección de partidos

En el siguiente ejemplo, se muestra una consulta de coincidencia que usa una combinación externa izquierda en el campo 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 combinación externa izquierda garantiza que cada evento USER_LOGIN ($e1) se incluya en el conjunto de resultados final.

  • Al marcador de posición $host se le asigna el valor de $e1.principal.hostname. La unión externa izquierda garantiza la presencia del evento $e1, lo que asegura que la variable $host siempre se complete para la agregación.

  • La regla agrega los resultados por host para un período de 5 minutos.

Resultado de la unión

Los datos resultantes muestran la combinación de los dos eventos. Se conservan todos los registros de la tabla izquierda ($e1), y los campos de la tabla derecha ($e2) se establecen en null cuando no se encuentra ningún nombre de host coincidente (por ejemplo, para server-db-03).

Tipo de evento ($e1) Nombre de host principal ($host) Dirección IP ($e1) Tipo de evento ($e2) Dirección IP ($e2) Estado de coincidencia
USER_LOGIN workstation-01 192.168.1.101 NETWORK_CONNECTION 192.168.1.101 Se encontró una coincidencia
USER_LOGIN laptop-hr-02 192.168.1.102 NETWORK_CONNECTION 192.168.1.101 Se encontró una coincidencia
USER_LOGIN server-db-03 10.0.0.50 null null No hay coincidencias
USER_LOGIN kiosk-4 192.168.1.104 NETWORK_CONNECTION 203.0.113.3 Se encontró una coincidencia

Ejemplos de consultas de unión izquierda

En esta sección, se proporcionan ejemplos de consultas de unión izquierda.

Se une con una condición de coincidencia

  • 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
    

Uniones sin una condición de coincidencia

  • Event-event

    
    $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
    
    

Combinación externa derecha

Una combinación externa derecha (o combinación derecha) conserva todos los registros de la fuente de datos en el lado derecho de la palabra clave right join.

  • Si un registro del evento de la derecha no coincide con el evento de la izquierda, los campos del evento de la izquierda se devuelven como null.

  • Implicación del marcador de posición: Cualquier variable de marcador de posición que se use en la sección match debe hacer referencia a un campo del evento correcto para garantizar una agregación de datos precisa en todo el conjunto de resultados.

Ejemplo de combinación externa a la derecha de evento a evento

En el siguiente ejemplo, se muestra un right outer join para correlacionar los eventos de acceso del usuario con los eventos de conexión de red posteriores que ocurren en el mismo host. El right joingarantiza que todos los eventos NETWORK_CONNECTION se conserven en el conjunto de resultados. Si se encuentra un evento USER_LOGIN coincidente, se unen sus datos. Si no se encuentra ninguna coincidencia, los campos de$e1 son null.


$e1.metadata.event_type = "USER_LOGIN"

$e2.metadata.event_type = "NETWORK_CONNECTION"

right join $e1.principal.hostname = $e2.principal.hostname

Define el evento de la izquierda

La siguiente consulta define el lado izquierdo de la unión ($e1), que es el conjunto de eventos opcional en el resultado final:


$e1.metadata.event_type = "USER_LOGIN"

En la siguiente tabla, se representa el resultado de la consulta, en el que se identifica el conjunto inicial de eventos de acceso del usuario:

Tipo de evento Nombre de host principal Dirección 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

Define el evento correcto

La siguiente consulta define el lado derecho de la unión ($e2), que es el conjunto de eventos que se conserva en el resultado final.


$e2.metadata.event_type = "NETWORK_CONNECTION"

En la siguiente tabla, se representa el conjunto de eventos de conexión de red disponibles para la correlación.

Tipo de evento Nombre de host principal Dirección 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

Únete a los eventos

En el siguiente ejemplo, se muestra una consulta de coincidencia con una combinación externa derecha en el campo 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 combinación externa derecha garantiza que cada evento NETWORK_CONNECTION ($e2) se incluya en el conjunto de resultados final.

  • Al marcador de posición $host se le asigna el valor de $e2.principal.hostname. La combinación externa derecha garantiza la presencia del evento $e2, lo que asegura que la variable $host siempre se complete para la agregación.

  • La regla agrega los resultados por host para un período de 5 minutos.

Resultado de la unión

El conjunto de datos resultante muestra la combinación de los dos eventos. Se conservan todos los registros de la tabla derecha ($e2), y los campos de la tabla izquierda ($e1) se establecen como nulos cuando no se encuentra ningún nombre de host coincidente (por ejemplo, vm-unauth-05).

Tipo de evento ($e1) Nombre de host principal ($e1) Dirección IP ($e1) Tipo de evento ($e2) Nombre de host principal ($host) Dirección IP ($e2) Estado de coincidencia
USER_LOGIN workstation-01 192.168.1.101 NETWORK_CONNECTION workstation-01 192.168.1.101 Se encontró una coincidencia
USER_LOGIN laptop-hr-02 192.168.1.102 NETWORK_CONNECTION laptop-hr-02 192.168.1.101 Se encontró una coincidencia
null null null NETWORK_CONNECTION vm-unauth-05 203.0.113.4 No hay coincidencias

Ejemplo de consultas de unión a la derecha

En esta sección, se proporcionan ejemplos de consultas de unión a la derecha.

Se une con una condición de coincidencia

  • Event-event

    
    $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
    
    
  • Entidad-evento

    
    $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
    
    

Uniones sin una condición de coincidencia

  • Event-event

    
    $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
    
    
  • Entidad-evento

    
    $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
    
    

Limitaciones

Ten en cuenta las siguientes limitaciones cuando crees combinaciones externas:

  • No se admite una combinación externa completa (combinación izquierda y combinación derecha juntas).

  • El período de la consulta para las uniones sin coincidencias se limita a un máximo de 14 días.

  • No puedes unir directamente dos fuentes contextuales (por ejemplo, una entidad directamente a una tabla de datos).

  • El evento principal del modelo de datos unificado (UDM) debe ser el lado conservado de la unión externa. La consulta no es válida si el evento principal se encuentra en el lado "anulable".

    • Una unión de entidad de evento debe ser una unión izquierda. Esto conserva correctamente el evento ($e1).

    • Una unión de entidad y evento debe ser una unión a la derecha. Esto conserva correctamente el evento ($e1).

    El siguiente ejemplo no es válido porque el evento UDM ($e1) está a la izquierda, pero la unión a la derecha conserva el lado derecho ($g1), lo que incumple la regla de que se debe conservar el evento UDM:

    
    // 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
    
    

Prácticas recomendadas

Para evitar el rendimiento lento y los tiempos de espera de las consultas en las consultas de unión externa, usa filtros específicos y estrechos.

Por ejemplo, una búsqueda amplia como la siguiente:


$e1.metadata.event_type = "USER_LOGIN"
$e2.metadata.event_type = "NETWORK_CONNECTION"
right join $e1.principal.hostname = $e2.principal.hostname

Se puede optimizar agregando los siguientes criterios específicos:


$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

¿Necesitas más ayuda? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.