Correlaciona datos con combinaciones externas
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
matchdebe 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 5mEvent-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.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
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
matchdebe 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
$hostse 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$hostsiempre 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 5mEntidad-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 5mDatatable-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.hostnameEntidad-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.hostnameDatatable-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.