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.

Descripción general

Cuando se trata de 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 de YARA-L 2.0.

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 involucrados, como los hosts que se comunican con direcciones IP maliciosas conocidas.

  • Detecta comportamientos anómalos: Puedes detectar patrones inusuales o aumentos repentinos en la actividad que podrían indicar un incidente de seguridad, como volúmenes de tráfico de red inusuales o actividad de acceso inesperada durante horas inusuales.

  • Analizar las tendencias a lo largo del tiempo: Puedes identificar cambios en la postura de seguridad para evaluar el impacto de los controles o encontrar áreas que necesitan mejoras, como hacer un seguimiento de los cambios en los recuentos de vulnerabilidades a lo largo del tiempo.

Puedes agrupar y ordenar los resultados de la búsqueda de la AUA con la sintaxis similar a la estructura de YARA-L 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 es la siguiente:

  1. Sentencia de filtro: La sentencia de filtro especifica las condiciones para filtrar los eventos.

  2. Coincidencia (opcional): En la sección de coincidencias, se especifican los campos por los que se debe agrupar. Para obtener más información, consulta Sintaxis de la sección de coincidencias.

  3. Resultado: La sección de resultados especifica los resultados de la consulta. Para obtener más información, consulta Sintaxis de la sección de resultados.

  4. Orden: La sección de orden especifica el orden de los resultados de la consulta que se muestran. Si no se especifica el orden (asc o desc), el valor predeterminado será asc.

  5. Limit (opcional): La sección de límite especifica 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:

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)

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)

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)

promedio

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)

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)

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)

Diferencias entre el uso de YARA-L 2.0 en la búsqueda y su uso en la AUA

  • La palabra clave over, que permite buscar eventos dentro de una ventana, no se aplica en la búsqueda.

  • La estructura de la búsqueda de la UDM no incluye las secciones condition ni option.

Agrupar por nivel de detalle del tiempo

Puedes agrupar todos los campos de eventos y marcadores de posición de la sección match por una granularidad de tiempo especificada, similar a una columna por la que podrías agrupar 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. Las siguientes son las granularidades de tiempo permitidas:

  • 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 una palabra clave opcional que trata una fuente de datos que es válida en un período como si fuera una fuente de datos que solo es válida en una marca de tiempo única. Esto significa que, para una fuente de datos válida en un período, la palabra clave first solo tiene en cuenta la hora de inicio (<start_time>), sin tener en cuenta la hora de finalización del período.

Por ejemplo, considera una entidad que tiene un período (1m, 5m) con un nivel de detalle de 1 m. Supongamos que los resultados se agrupan por hosts, que son (h1, h2). Las columnas que se muestran son (h1, 1m) y (h2, 1m), ya que se ignora el resto del intervalo de tiempo.

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)

Visualizaciones en la Búsqueda

En esta sección, se describen las capacidades de visualización de datos en la búsqueda del modelo de datos unificados (UDM) de Google SecOps. Esta función permite 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 de vista previa

Para guardar visualizaciones en el panel de vista previa, 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. El resultado de la consulta se muestra en dos pestañas: Estadísticas y Visualizar.

  3. En la pestaña Visualizar, selecciona el tipo de gráfico en la lista Tipo de gráfico.

  4. Para el tipo de gráfico seleccionado, cambia la configuración en Configuración de datos para personalizarlo.

  5. En la pantalla Agregar al panel, agrega el nombre, la descripción y el período del gráfico.

  6. Selecciona una opción adecuada para agregar el gráfico a paneles existentes o a uno nuevo.

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