Estadísticas y agregaciones en la búsqueda de la AUA con YARA-L 2.0

Compatible con:

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

Cuando administras un gran volumen de eventos de la AUA generados en tu ambiente, es importante comprender las tendencias de tus datos de búsqueda de la AUA. Puedes usar estadísticas y funciones de agregación para obtener estadísticas prácticas de tus registros de la AUA. La búsqueda de la UDM admite todas las funciones de agregación en YARA-L 2.0.

Casos de uso de consultas estadísticas

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

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

  • Detecta comportamientos anómalos: Puedes identificar aumentos repentinos de actividad que pueden indicar incidentes de seguridad, como aumentos inesperados del tráfico de red o accesos durante horas no laborales.

  • Analiza las tendencias a lo largo del tiempo: Puedes evaluar los cambios en la postura de seguridad para determinar la eficacia del control 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 las búsquedas de la AUA 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 filtro: Especifica las condiciones para filtrar eventos.

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

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

  • 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), el valor predeterminado será asc.

  • Limit (opcional): Establece la cantidad máxima de filas que muestra la consulta.

Este es un ejemplo de uso de orden y límite:

metadata.log_type = "OKTA"

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

order:
 $user_count_by_ip desc

limit:
    20

Datos recopilados

La búsqueda de la AUA admite las siguientes funciones de agregación:

array

array(expression)

Descripción

La función array muestra todos los valores en forma de lista. Recorta la lista a un máximo de 25 elementos aleatorios.

Tipos de datos de param

STRING

Tipo de datos que se muestra

LIST

Muestras de código

Ejemplo

Muestra un array que contiene los 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 muestra todos los valores distintos en forma de una lista. Recorta la lista a un máximo de 25 elementos aleatorios. La eliminación de duplicados para obtener una lista distinta se aplica antes de la truncación.

Tipos de datos de param

STRING

Tipo de datos que se muestra

LIST

Muestras de código

Ejemplo

Muestra 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 muestra 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 param

NUMBER

Tipo de datos que se muestra

NUMBER

Muestras de código

Ejemplo

Busca todos los eventos en los que target.ip no esté vacío. Para todos los eventos que coincidan en 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 muestra la cantidad de filas dentro de un grupo. A menudo, se usa con match para obtener recuentos de grupos específicos en los datos.

Tipos de datos de param

STRING

Tipo de datos que se muestra

NUMBER

Muestras de código

Ejemplo

Muestra el recuento de accesos 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 muestra 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 param

STRING

Tipo de datos que se muestra

NUMBER

Muestras de código

Ejemplo

Muestra el recuento de accesos exitosos de usuarios 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 muestra el 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 en los datos.

Tipos de datos de param

NUMBER

Tipo de datos que se muestra

NUMBER

Muestras de código

Ejemplo

Busca todos los eventos en los que target.ip no esté vacío. Para todos los eventos que coincidan en 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 muestra 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 param

NUMBER

Tipo de datos que se muestra

NUMBER

Muestras de código

Ejemplo

Busca todos los eventos en los que target.ip no esté vacío. Para todos los eventos que coincidan 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 muestra la suma de los valores 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 datos.

Tipos de datos de param

NUMBER

Tipo de datos que se muestra

NUMBER

Muestras de código

Ejemplo

Busca todos los eventos en los que target.ip no esté vacío. Para todos los eventos que coincidan en 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 muestra la desviación estándar de todos los valores posibles.

Tipos de datos de param

NUMBER

Tipo de datos que se muestra

NUMBER

Muestras de código

Ejemplo

Busca todos los eventos en los que target.ip no esté vacío. Para todos los eventos que coincidan en 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)

YARA-L 2.0: Búsqueda en comparación con el uso de UDM

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

  • Las búsquedas de la AUA no incluyen las secciones condition ni option.

Agrupar por nivel de detalle del tiempo

Puedes agrupar campos de eventos y marcadores de posición en la sección match por una granularidad de tiempo especificada, de manera similar a como se agrupa una columna en SQL.

La sintaxis es la siguiente:

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

Para agrupar por nivel de detalle de tiempo, puedes usar la palabra clave by o over every. Los niveles de detalle de tiempo permitidos son los 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 una de ellas.

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) con un nivel de detalle de tiempo de 1m. Si los resultados se agrupan por host (h1,h2), las columnas que se muestran 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 ambos. El uso de by first equivale a over every first.

El siguiente es un ejemplo de una consulta que usa el operador by con la fuente de datos del contexto de la entidad que es válida en un período. En esta consulta, 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)

Crea y guarda visualizaciones en la Búsqueda

La búsqueda del modelo de datos unificados (UDM) de Google SecOps ofrece potentes capacidades de visualización de datos. Estas funciones permiten a los analistas del Centro de operaciones de seguridad (SOC) detectar, investigar y responder a amenazas de manera eficiente mediante la creación de visualizaciones a partir de los resultados de la búsqueda y su guardado en paneles.

Crea y guarda visualizaciones en el panel nativo

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

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

  2. Selecciona un período y, luego, haz clic en Run Search 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 de la lista Tipo de gráfico. b. Para personalizar el gráfico, ajusta la configuración en Configuración de datos.

  4. En la pantalla Add to dashboard, haz lo siguiente: a. Ingresa un nombre de gráfico, una descripción y un período. b. Elige 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.