Estadísticas y agregaciones en la búsqueda a través de YARA-L 2.0

Compatible con:

En esta página, se describe cómo ejecutar consultas estadísticas en eventos del UDM y agrupar los resultados para su análisis con YARA-L 2.0.

Cuando se maneja un gran volumen de eventos del UDM generados en tu entorno, es importante comprender las tendencias en los datos de búsqueda del UDM. Puedes usar estadísticas y funciones de agregación para obtener estadísticas prácticas a partir de tus registros del UDM. La búsqueda en el UDM admite todas las funciones de agregación en YARA-L 2.0.

Casos de uso de las consultas estadísticas

Puedes usar consultas estadísticas para los siguientes casos de uso:

  • Hacer un seguimiento de las métricas críticas: Puedes medir la distribución y la frecuencia de los eventos del UDM y los recursos asociados, como los hosts que se comunican con direcciones IP maliciosas conocidas.

  • Detecta comportamientos anómalos: Puedes identificar picos de actividad que pueden indicar incidentes de seguridad, como aumentos inesperados en el tráfico de red o inicios de sesión fuera del horario laboral.

  • Analiza las tendencias a lo largo del tiempo: Puedes evaluar los cambios en la postura de seguridad para evaluar la eficacia de los controles o identificar áreas de mejora, como supervisar las fluctuaciones en los recuentos de vulnerabilidades a lo largo del tiempo.

Puedes agrupar y ordenar los resultados de la búsqueda del UDM con una sintaxis similar a la estructura de YARA-L que se usa en las reglas del motor de detección. Para obtener más información, consulta Sintaxis del lenguaje YARA-L 2.0.

La estructura de la consulta de YARA-L 2.0 es la siguiente:

  • Sentencia de filtrado: Especifica las condiciones para filtrar eventos.

  • Coincidencia (opcional): Define los campos por los que se agruparán los datos. Para obtener más información, consulta Sintaxis de la sección de coincidencias.

  • Outcome: Especifica los resultados de la búsqueda. Para obtener más información, consulta Sintaxis de la sección de resultados.

  • Order: Determina el orden de los resultados de la búsqueda como asc (ascendente) o desc (descendente). Si no se especifica el orden (asc o desc), el valor predeterminado será asc.

  • Límite (opcional): Establece la cantidad máxima de filas que devuelve la consulta.

Este es un ejemplo del uso de order y limit:

metadata.log_type = "OKTA"

match:
    principal.ip
Outcome:
    $user_count_by_ip = count(principal.user.userid)

order:
 $user_count_by_ip desc

limit:
    20

Agregaciones

La búsqueda en el UDM admite las siguientes funciones de agregación:

array

array(expression)

Descripción

La función array devuelve todos los valores en forma de lista. La lista se trunca hasta un máximo de 25 elementos aleatorios.

Tipos de datos de parámetros

STRING

Tipo de datos que se muestra

LIST

Muestras de código

Ejemplo

Devuelve un array que contiene tipos de eventos.

  $event_type = metadata.event_type
  outcome:
    $event_type_array = array($event_type)

array_distinct

array_distinct(expression)

Descripción

La función array_distinct devuelve todos los valores distintos en forma de lista. La lista se trunca hasta un máximo de 25 elementos aleatorios. La deduplicación para obtener una lista distinta se aplica antes del truncamiento.

Tipos de datos de parámetros

STRING

Tipo de datos que se muestra

LIST

Muestras de código

Ejemplo

Devuelve un array que contiene tipos de eventos distintos.

  $event_type = metadata.event_type
  outcome:
    $event_type_array = array_distinct($event_type)

prom.

avg(numericExpression)

Descripción

La función avg devuelve el promedio de los valores de una columna numérica. Ignora los valores de NULL durante el cálculo. A menudo, se usa con match para calcular los promedios dentro de grupos específicos en los datos.

Tipos de datos de parámetros

NUMBER

Tipo de datos que se muestra

NUMBER

Muestras de código

Ejemplo

Encuentra todos los eventos en los que target.ip no está vacío. Para todos los eventos que coincidan con principal.ip, almacena el promedio de metadata.event_timestamp.seconds en una variable llamada avg_seconds.

  target.ip != ""
  match:
    principal.ip
  outcome:
    $avg_seconds = avg(metadata.event_timestamp.seconds)

count

count(expression)

Descripción

La función count devuelve la cantidad de filas dentro de un grupo. Se suele usar con match para obtener recuentos de grupos específicos en los datos.

Tipos de datos de parámetros

STRING

Tipo de datos que se muestra

NUMBER

Muestras de código

Ejemplo

Devuelve el recuento de los accesos de usuarios exitosos a lo largo del tiempo.

  metadata.event_type = "USER_LOGIN"
  $security_result = security_result.action
  $security_result = "ALLOW"
  $date = timestamp.get_date(metadata.event_timestamp.seconds, "America/Los_Angeles")
  match:
      $security_result, $date
  outcome:
      $event_count = count(metadata.id)

count_distinct

count_distinct(expression)

Descripción

La función count_distinct devuelve la cantidad de filas que tienen valores distintos dentro de un grupo. A menudo, se usa con match para obtener recuentos de grupos específicos en los datos.

Tipos de datos de parámetros

STRING

Tipo de datos que se muestra

NUMBER

Muestras de código

Ejemplo

Devuelve el recuento de los accesos de usuarios exitosos distintos a lo largo del tiempo.

  metadata.event_type = "USER_LOGIN"
  $security_result = security_result.action
  $security_result = "ALLOW"
  $date = timestamp.get_date(metadata.event_timestamp.seconds, "America/Los_Angeles")
  match:
      $security_result, $date
  outcome:
      $event_count = count_distinct(metadata.id)

máx.

max(numericExpression)

Descripción

La función max devuelve el valor máximo de los valores dentro de una columna numérica. A menudo, se usa con match para obtener el valor máximo dentro de cada grupo de los datos.

Tipos de datos de parámetros

NUMBER

Tipo de datos que se muestra

NUMBER

Muestras de código

Ejemplo

Encuentra todos los eventos en los que target.ip no está vacío. Para todos los eventos que coincidan con principal.ip, almacena el valor máximo de metadata.event_timestamp.seconds en una variable llamada max_seconds.

  target.ip != ""
  match:
    principal.ip
  outcome:
    $max_seconds = max(metadata.event_timestamp.seconds)

min

min(numericExpression)

Descripción

La función min devuelve el valor mínimo de los valores dentro de una columna numérica. A menudo, se usa con match para obtener el valor mínimo dentro de cada grupo de los datos.

Tipos de datos de parámetros

NUMBER

Tipo de datos que se muestra

NUMBER

Muestras de código

Ejemplo

Encuentra todos los eventos en los que target.ip no está vacío. Para todos los eventos que coinciden en principal.ip, almacena el valor mínimo de metadata.event_timestamp.seconds en una variable llamada min_seconds.

  target.ip != ""
  match:
    principal.ip
  outcome:
    $min_seconds = min(metadata.event_timestamp.seconds)

ponderada

sum(numericExpression)

Descripción

La función sum devuelve la suma de los valores dentro de una columna numérica. Ignora los valores NULL durante el cálculo. A menudo, se usa con match para calcular las sumas dentro de diferentes grupos de los datos.

Tipos de datos de parámetros

NUMBER

Tipo de datos que se muestra

NUMBER

Muestras de código

Ejemplo

Encuentra todos los eventos en los que target.ip no está vacío. Para todos los eventos que coincidan con principal.ip, almacena la suma de network.sent_bytes en una variable llamada sent_bytes.

  target.ip != ""
  match:
    principal.ip
  outcome:
    $sent_bytes = sum(network.sent_bytes)

stddev

stddev(numericExpression)

Descripción

La función stddev devuelve la desviación estándar de todos los valores posibles.

Tipos de datos de parámetros

NUMBER

Tipo de datos que se muestra

NUMBER

Muestras de código

Ejemplo

Encuentra todos los eventos en los que target.ip no está vacío. Para todos los eventos que coincidan con principal.ip, almacena la desviación estándar de metadata.event_timestamp.seconds en una variable llamada stddev_seconds.

  target.ip != ""
  match:
    principal.ip
  outcome:
    $stddev_seconds = stddev(metadata.event_timestamp.seconds)

más antiguo

earliest(timestamp)

Descripción

La función earliest devuelve la marca de tiempo más antigua de un conjunto de registros con una resolución de microsegundos.

Tipos de datos de parámetros

TIMESTAMP

Tipo de datos que se muestra

TIMESTAMP

Muestras de código

Ejemplo

Para todos los eventos que coincidan en hostname, almacena el valor más antiguo de metadata.event_timestamp en la variable start.

  $hostname = principal.hostname
  match:
    $hostname
  outcome:
    $start = earliest(metadata.event_timestamp)

más reciente

latest(timestamp)

Descripción

La función latest devuelve la marca de tiempo más reciente de un conjunto de registros con una resolución de microsegundos.

Tipos de datos de parámetros

TIMESTAMP

Tipo de datos que se muestra

TIMESTAMP

Muestras de código

Ejemplo

Para todos los eventos que coincidan en hostname, almacena el valor más reciente de metadata.event_timestamp en la variable end.

  $hostname = principal.hostname
  match:
    $hostname
  outcome:
    $end = latest(metadata.event_timestamp)

YARA-L 2.0: Comparación entre la búsqueda y el uso del UDM

  • La palabra clave over, que se usa para las búsquedas de ventanas de eventos, no se admite en la búsqueda.

  • Las búsquedas de UDM no incluyen las secciones condition y option.

Agrupa por nivel de detalle de los datos temporales

Puedes agrupar los campos de eventos y los marcadores de posición en la sección match según una granularidad de tiempo especificada, de forma similar a cómo se agrupa una columna en SQL.

La sintaxis es la siguiente:

match:
  ... [BY|OVER EVERY] [FIRST] [TIME_GRANULARITY]

Para agrupar por granularidad temporal, puedes usar la palabra clave by o over every. Las granularidades de tiempo permitidas son las siguientes:

  • MINUTE o m
  • HOUR o h
  • DAY o d
  • WEEK o w
  • MONTH o mo

Las palabras clave by y over every son equivalentes en cuanto a su función. Puedes usar uno u otro.

Ejemplos

Agrupa la dirección IP y el nombre de host por hora.

$hostname = principal.hostname
match:
  $hostname, target.ip by hour

Agrupa el recuento de todos los eventos por nombre de host y por el día en que se produjo el evento.

$hostname = target.hostname
match:
  $hostname over every day
outcome:
  $events_count = count($hostname)

Algunas fuentes de datos, como el contexto de la entidad, son válidas durante un período (<start_time>, <end_time>) y no tienen marcas de tiempo únicas.

La palabra clave first es opcional y se aplica a una sola marca de tiempo. Esto significa que, para una fuente de datos válida durante un período, la palabra clave first solo considera la hora de inicio (<start_time>).

Por ejemplo, considera una entidad con un período (1m, 5m) y una granularidad temporal de 1m. Si los resultados se agrupan por hosts (h1,h2), las columnas devueltas serán (h1, 1m) y (h2, 1m), y se ignorará el resto del período.

La palabra clave first se puede agregar a by y over every, lo que genera el mismo comportamiento para ambas. El uso de by first equivale a over every first.

A continuación, se muestra un ejemplo de una búsqueda que usa el operador by con la fuente de datos de contexto de la entidad que es válida durante un período. En esta búsqueda, se considera todo el período porque se omite la palabra clave first.

graph.entity.hostname != ""
match:
  graph.entity.ip by hour
outcome:
  $min_seconds = min(graph.metadata.event_metadata.event_timestamp.seconds)

Cómo crear y guardar visualizaciones en la búsqueda

En esta sección, se describen las funciones de visualización de datos en la búsqueda del modelo de datos unificado (UDM) de Google SecOps. Esta función permite que los analistas del Centro de operaciones de seguridad (SOC) detecten, investiguen y respondan a las amenazas de manera eficiente, ya que pueden crear visualizaciones a partir de los resultados de la búsqueda y guardarlas en los paneles.

Crea y guarda visualizaciones en el panel

Para crear y guardar visualizaciones que se agregarán al panel, haz lo siguiente:

  1. Escribe una consulta en YARA-L con secciones match y outcome.

  2. Selecciona un período y, luego, haz clic en Ejecutar búsqueda para ejecutar la consulta. Consulta los resultados en las pestañas Estadísticas y Visualizar.

  3. En la pestaña Visualizar, haz lo siguiente: a. Selecciona un tipo de gráfico en la lista Tipo de gráfico. b. Ajusta la configuración en Configuración de datos para personalizar el gráfico.

  4. En la pantalla Agregar al panel, haz lo siguiente: a. Ingresa un nombre, una descripción y un período para el gráfico. b. Elige si deseas agregar el gráfico a un panel existente o crear uno nuevo.

  5. Haz clic en Agregar al panel para agregar el gráfico al panel.

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