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.
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.
Estructura de la consulta de YARA-L 2.0 en la búsqueda
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) odesc
(descendente). Si no se especifica el orden (asc
odesc
), 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
nioption
.
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
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 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:
Escribe una consulta YARA-L con secciones
match
youtcome
.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.
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.
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.
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.