Usar combinaciones en la Búsqueda

Disponible en:

Las combinaciones ayudan a correlacionar datos de varias fuentes para proporcionar más contexto a una investigación. Al vincular eventos, entidades y otros datos relacionados, puedes investigar escenarios de ataque complejos.

En este documento se explica cómo usar la operación de unión en Google Security Operations. También se explican los tipos de combinaciones admitidos, los casos prácticos y las prácticas recomendadas.

Crear una combinación

Solo se admiten las combinaciones basadas en estadísticas. Debes definirlos en la sección match de una consulta con una ventana temporal de correlación de hasta 48 horas. Puedes crear una combinación conectando campos directamente (por ejemplo, $e1.hostname = $e2.hostname) o usando variables de marcador de posición. Cuando definas una combinación en la sección match, debes usar variables de marcador de posición.

En el siguiente ejemplo, la consulta une dos campos con un signo igual (=) y una variable de marcador de posición compartida:

Ejemplo 1:


events:

  // Assign a value from the first event to the placeholder variable $user

  $user = $e1.principal.user.userid

  // The second assignment creates an implicit join, linking $e2 to $e1

  // where the user ID is the same.

  $user = $e2.principal.user.userid

match:

  $user over 1h

condition:

  $e1 and $e2

Ejemplo 2:


$e1.principal.ip = $ip

$e1.metadata.event_type = "USER_LOGIN"

$e1.principal.hostname = $host

$e2.target.ip = $ip

$e2.principal.hostname = "altostrat"

$e2.target.hostname = $host

match:
  $ip, $host over 5m

Tipos de combinación admitidos

En esta sección se describen los distintos tipos de uniones que puede usar.

Combinación de eventos

Una unión de eventos conecta dos eventos diferentes del modelo de datos unificado (UDM). La siguiente consulta de ejemplo vincula un evento USER_LOGIN con otro para buscar el nombre de host (altostrat) con el que ha interactuado el usuario, basándose en una dirección IP común:


$e1.principal.ip = $ip

$e1.metadata.event_type = "USER_LOGIN"

$e2.target.ip = $ip

$e2.principal.hostname = "altostrat"

match:

  $ip over 5m

Event-ECG join

Una unión de Event-ECG conecta un evento de UDM con una entidad del gráfico de contexto de entidad (ECG). La siguiente consulta de ejemplo busca un evento NETWORK_CONNECTION y un ASSET del gráfico de entidades que comparten el mismo nombre de host en un periodo de 1 hora:


events:

   $e1.metadata.event_type = "NETWORK_CONNECTION"

   $g1.graph.metadata.entity_type = "ASSET"

   $e1.principal.asset.hostname = $g1.graph.entity.asset.hostname

   $x = $g1.graph.entity.asset.hostname

match:

   $x over 1h

condition:

   $e1 and $g1

Unión de eventos de tabla de datos

Una unión de evento de tabla de datos conecta los eventos de UDM con las entradas de una tabla de datos personalizada. Esto resulta útil para comparar datos de eventos en directo con una lista definida por el usuario, como direcciones IP maliciosas o agentes de amenazas conocidos. La siguiente consulta de ejemplo combina eventos NETWORK_CONNECTION con una tabla de datos para buscar conexiones que incluyan direcciones IP específicas de esa lista:


$ip = %DATATABLE_NAME.COLUMN_NAME

$ip = $e1.principal.ip

$e1.metadata.event_type = "NETWORK_CONNECTION"

match:

   $ip over 1h

Prácticas recomendadas

Las consultas de unión pueden consumir muchos recursos porque combinan muchos resultados. Los filtros amplios y generales pueden provocar que las consultas fallen, a veces después de un largo retraso. Por ejemplo:

  • target.ip != null

  • metadata.event_type = "NETWORK_CONNECTION" (si este tipo de evento es muy habitual en tu entorno)

Te recomendamos que combines filtros generales con otros más específicos para reducir el número total de eventos que debe procesar la consulta. Un filtro amplio como target.ip != null debe combinarse con filtros más específicos para mejorar el rendimiento de la consulta. Por ejemplo:

$e1.metadata.log_type = $log
$e1.metadata.event_type = "USER_LOGIN"
$e1.target.ip != ""

$e2.metadata.log_type = $log
$e2.principal.ip = "10.0.0.76"
$e2.target.hostname != "altostrat"

match:
$log over 5m

Si la consulta sigue siendo lenta, también puedes reducir el periodo general de la consulta (por ejemplo, de 30 días a una semana).

Para obtener más información, consulta las prácticas recomendadas de YARA-L.

Limitaciones

Se aplican las siguientes limitaciones al usar combinaciones:

  • Puedes usar un máximo de dos eventos de datos de usuario por consulta.

  • Puedes usar un máximo de un evento de ECG por consulta.

  • Puedes usar un máximo de dos Datatables por consulta.

  • No puedes combinar eventos de tabla de datos, UDM y ECG en una sola consulta.

  • El intervalo de tiempo máximo de las consultas es de 90 días.

  • La ventana temporal máxima de match es de 48 horas.

  • Las combinaciones se admiten en la interfaz de usuario y en la API EventService.UDMSearch, pero no en la API SearchService.UDMSearch.

Casos prácticos habituales

En esta sección se indican algunas formas habituales de usar las combinaciones.

Detectar el robo y el uso de credenciales

Objetivo: encontrar instancias en las que un usuario inicia sesión correctamente y, a continuación, elimina rápidamente un archivo de sistema crítico. Esto podría indicar que se ha tomado el control de una cuenta o que se ha producido una actividad interna malintencionada.

Tipo de unión: unión de evento a evento

Descripción: esta consulta conecta dos eventos distintos que no son sospechosos por sí solos, pero que se vuelven muy sospechosos cuando ocurren juntos. Primero busca un evento USER_LOGIN y, después, un evento FILE_DELETION. A estos se une el user.userid común con una ventana de tiempo breve.

Consulta de ejemplo:


// Event 1: A user successfully logs in

$e1.metadata.event_type = "USER_LOGIN"

$e1.security_result.action = "ALLOW"

$e1.principal.user.userid = $user

// Event 2: The same user deletes a critical file

$e2.metadata.event_type = "FILE_DELETION"

$e2.target.file.full_path = /etc\/passwd|C:\\Windows\\System32\\/

$e2.principal.user.userid = $user

match:
  $user over 10m

condition:
  $e1 and $e2

Identificar conexiones arriesgadas desde recursos críticos

Objetivo: enriquecer los datos de la red en tiempo real con información de los recursos para encontrar conexiones salientes de servidores que no deberían comunicarse con dominios externos de baja prevalencia (por ejemplo, un servidor de base de datos de producción).

Tipo de unión: unión de evento y ECG

Descripción: Una sola conexión de red a un dominio poco común puede no ser de alta prioridad. Sin embargo, esta consulta aumenta la importancia de ese evento al combinarlo con el gráfico de contexto de entidad (ECG). Busca específicamente eventos NETWORK_CONNECTIONque procedan de recursos etiquetados como "Servidor de base de datos crítico" en el gráfico de entidades.

Consulta de ejemplo:


events:
  $e.metadata.event_type = "NETWORK_CONNECTION"

  $e.target.domain.prevalence.day_count <= 5

  $asset.graph.metadata.entity_type = "ASSET"

  $asset.graph.entity.asset.labels.value = "Critical Database Server"

  $e.principal.asset.hostname = $asset.graph.entity.asset.hostname

  $host = $e.principal.asset.hostname

match:
  $host over 1h

condition:
  $e and $asset

Buscar IOCs de atacantes

Objetivo: buscar activamente indicadores de vulneración (IoCs) comprobando todas las consultas de DNS activas en una lista de dominios que se sabe que utiliza un agente de amenazas específico.

Tipo de combinación: combinación de tabla de datos y evento

Descripción: tu equipo de inteligencia sobre amenazas mantiene una tabla de datos llamada ThreatActor_Domains que incluye una lista de dominios maliciosos. Esta consulta combina todos los eventos NETWORK_DNS_QUERY en tiempo real con esta tabla de datos. Muestra inmediatamente cualquier instancia en la que un host de tu red intente resolver un dominio de tu lista de inteligencia de amenazas.

Consulta de ejemplo:


// Datatable: Get the list of malicious domains

$domain = $ip = %DATATABLE_NAME.COLUMN_NAME

// Event: A DNS query is made

$e.metadata.event_type = "NETWORK_DNS"

$e.network.dns.questions.name = $domain

match:
  $domain over 5m

condition:
  $e

¿Necesitas más ayuda? Recibe respuestas de los miembros de la comunidad y de los profesionales de Google SecOps.