Estadísticas y agregaciones en la búsqueda de la AUA con YARA-L 2.0
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.
Estructura de la consulta de YARA-L 2.0 en la búsqueda
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:
Sentencia de filtro: La sentencia de filtro especifica las condiciones para filtrar los eventos.
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.
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.
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
odesc
), el valor predeterminado seráasc
.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
nioption
.
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
om
HOUR
oh
DAY
od
WEEK
ow
MONTH
omo
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:
Escribe una consulta YARA-L con secciones
match
youtcome
.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.
En la pestaña Visualizar, selecciona el tipo de gráfico en la lista Tipo de gráfico.
Para el tipo de gráfico seleccionado, cambia la configuración en Configuración de datos para personalizarlo.
En la pantalla Agregar al panel, agrega el nombre, la descripción y el período del gráfico.
Selecciona una opción adecuada para agregar el gráfico a paneles existentes o a uno nuevo.
Haz clic en Agregar al panel para agregar el gráfico al panel.