Estadísticas y agregaciones en búsquedas con YARA-L 2.0

Disponible en:

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

Cuando se gestiona un gran volumen de eventos de UDM generados en su entorno, es importante conocer las tendencias de los datos de búsqueda de UDM. Puedes usar estadísticas y funciones de agregación para obtener información valiosa a partir de tus registros de UDM. La búsqueda de UDM admite todas las funciones de agregación de YARA-L 2.0.

Casos prácticos de consultas estadísticas

Puedes usar consultas estadísticas en los siguientes casos prácticos:

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

  • Detectar comportamientos anómalos: puede identificar picos de actividad que pueden indicar incidentes de seguridad, como aumentos inesperados del tráfico de red o inicios de sesión fuera del horario habitual.

  • Analizar 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 monitorizar las fluctuaciones en el número de vulnerabilidades a lo largo del tiempo.

Puedes agrupar y ordenar los resultados de las consultas de búsqueda de 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 las consultas de YARA-L 2.0 es la siguiente:

  • Instrucción de filtrado: especifica las condiciones para filtrar eventos.

  • Match (opcional): define los campos por los que se agruparán los resultados. Para obtener más información, consulta la sintaxis de la sección Match.

  • Resultado: especifica la información de salida de la consulta. Para obtener más información, consulta la sección Sintaxis de la sección de resultados.

  • Eliminación de duplicados (opcional): reduce el volumen de resultados duplicados. Para obtener más información, consulta Anulación de duplicados.

  • Orden: determina el orden de los resultados de la consulta como asc (ascendente) o desc (descendente). Si no se especifica el orden (asc o desc), se utiliza asc de forma predeterminada.

  • Límite (opcional): define el número máximo de filas que devuelve la consulta.

Aquí tienes un ejemplo de uso de los parámetros 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 de 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 a un máximo de 25 elementos aleatorios.

Tipos de datos de parámetros

STRING

Tipo de devolución

LIST

Códigos de ejemplo

Ejemplo

Devuelve una matriz 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 desduplicación para obtener una lista distinta se aplica antes del truncamiento.

Tipos de datos de parámetros

STRING

Tipo de devolución

LIST

Códigos de ejemplo

Ejemplo

Devuelve una matriz que contiene tipos de eventos distintos.

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

media

avg(numericExpression)

Descripción

La función avg devuelve la media de los valores de una columna numérica. Ignora los valores NULL durante el cálculo. Se suele usar con match para calcular las medias de grupos específicos de los datos.

Tipos de datos de parámetros

NUMBER

Tipo de devolución

NUMBER

Códigos de ejemplo

Ejemplo

Busca todos los eventos en los que target.ip no esté vacío. Para todos los eventos que coincidan con principal.ip, almacena la media de metadata.event_timestamp.seconds en una variable llamada avg_seconds.

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

recuento

count(expression)

Descripción

La función count devuelve el número de filas de un grupo. Se suele usar con match para obtener recuentos de grupos específicos de los datos.

Tipos de datos de parámetros

STRING

Tipo de devolución

NUMBER

Códigos de ejemplo

Ejemplo

Devuelve el número de inicios de sesión de usuarios correctos 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 el número de filas que tienen valores distintos en un grupo. Se suele usar con match para obtener recuentos de grupos específicos de los datos.

Tipos de datos de parámetros

STRING

Tipo de devolución

NUMBER

Códigos de ejemplo

Ejemplo

Devuelve el recuento de inicios de sesión de usuarios únicos correctos 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 de una columna numérica. Se suele usar con match para obtener el valor máximo de cada grupo de los datos.

Tipos de datos de parámetros

NUMBER

Tipo de devolución

NUMBER

Códigos de ejemplo

Ejemplo

Busca todos los eventos en los que target.ip no esté vacío. En todos los eventos que coincidan con principal.ip, almacena el 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 mínimo de los valores de una columna numérica. Se suele usar con match para obtener el valor mínimo de cada grupo de los datos.

Tipos de datos de parámetros

NUMBER

Tipo de devolución

NUMBER

Códigos de ejemplo

Ejemplo

Busca todos los eventos en los que target.ip no esté vacío. En el caso de todos los eventos que coincidan con principal.ip, almacena el 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)

suma

sum(numericExpression)

Descripción

La función sum devuelve la suma de los valores de una columna numérica. Ignora los valores NULL durante el cálculo. Se suele usar con match para calcular las sumas de los distintos grupos de datos.

Tipos de datos de parámetros

NUMBER

Tipo de devolución

NUMBER

Códigos de ejemplo

Ejemplo

Busca todos los eventos en los que target.ip no esté vacío. Para todos los eventos que coincidan con principal.ip, almacena una 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 devolución

NUMBER

Códigos de ejemplo

Ejemplo

Busca 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 devolución

TIMESTAMP

Códigos de ejemplo

Ejemplo

En el caso de todos los eventos que coincidan con 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 recientes

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 devolución

TIMESTAMP

Códigos de ejemplo

Ejemplo

En todos los eventos que coincidan con hostname, almacena el último de metadata.event_timestamp en la variable end.

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

YARA-L 2.0: búsqueda frente a uso de UDM

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

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

Agrupar por granularidad de tiempo

Puedes agrupar campos de evento y marcadores de posición en la sección match por una granularidad de tiempo específica, de forma similar a como se agrupa una columna en SQL.

La sintaxis es la siguiente:

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

Para agrupar por granularidad temporal, puede 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 funcionalmente equivalentes. Puedes usar uno u otro.

Ejemplos

Agrupa las direcciones IP y los nombres de host cada 2 horas.

$hostname = principal.hostname
match:
  $hostname, target.ip by 2h

Agrupar por nombre de host con una granularidad de tiempo completa.

$hostname = principal.hostname
match:
  $hostname by minute

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 periodo (<start_time>, <end_time>) y no tienen marcas de tiempo singulares.

La palabra clave first es opcional y se aplica a una sola marca de tiempo. Esto significa que, en el caso de una fuente de datos válida durante un periodo, la palabra clave first solo tiene en cuenta la hora de inicio (<start_time>).

Por ejemplo, supongamos que tiene una entidad con un intervalo de tiempo de (1m, 5m) y una granularidad de tiempo 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 intervalo de tiempo.

La palabra clave first se puede añadir tanto a by como a over every, lo que da como resultado el mismo comportamiento en ambos casos. El uso de by first equivale a over every first.

A continuación, se muestra un ejemplo de una consulta que usa el operador by con la fuente de datos de contexto de entidad que es válida durante un periodo. En esta consulta, se tiene en cuenta todo el periodo porque se ha omitido la palabra clave first.

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

Crear y guardar visualizaciones en la búsqueda

En esta sección se describen las funciones de visualización de datos de la búsqueda del modelo de datos unificado (UDM) de Google SecOps. Esta función permite a los analistas del centro de operaciones de seguridad (SOC) detectar, investigar y responder a las amenazas de forma eficiente creando visualizaciones a partir de los resultados de búsqueda y guardándolas en paneles de control.

Crear y guardar visualizaciones en el panel de control

Para crear y guardar visualizaciones que se añadirán al panel de control, sigue estos pasos:

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

  2. Seleccione un periodo y, a continuación, haga 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, haga lo siguiente: a. Selecciona un tipo de gráfico en la lista Tipo de gráfico. b. Ajusta la configuración de Datos para personalizar el gráfico.

  4. En la pantalla Añadir al panel de control, haz lo siguiente: a. Introduce un nombre, una descripción y un periodo para el gráfico. b. Elige si quieres añadir el gráfico a un panel de control que ya tengas o crear uno nuevo.

  5. Haz clic en Añadir al panel de control para añadir el gráfico al panel de control.

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