Estadísticas y agregaciones en la búsqueda a través de YARA-L 2.0
En esta página, se describe cómo ejecutar consultas estadísticas en eventos del UDM y agrupar los resultados para su análisis con YARA-L 2.0.
Cuando se maneja un gran volumen de eventos del UDM generados en tu entorno, es importante comprender las tendencias en los datos de búsqueda del UDM. Puedes usar estadísticas y funciones de agregación para obtener estadísticas prácticas a partir de tus registros del UDM. La búsqueda en el UDM admite todas las funciones de agregación en YARA-L 2.0.
Casos de uso de las consultas estadísticas
Puedes usar consultas estadísticas para los siguientes casos de uso:
Hacer un seguimiento de las métricas críticas: Puedes medir la distribución y la frecuencia de los eventos del UDM y los recursos asociados, como los hosts que se comunican con direcciones IP maliciosas conocidas.
Detecta comportamientos anómalos: Puedes identificar picos de actividad que pueden indicar incidentes de seguridad, como aumentos inesperados en el tráfico de red o inicios de sesión fuera del horario laboral.
Analiza 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 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 la búsqueda del 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 la consulta de YARA-L 2.0 es la siguiente:
Sentencia de filtrado: Especifica las condiciones para filtrar eventos.
Coincidencia (opcional): Define los campos por los que se agruparán los datos. Para obtener más información, consulta Sintaxis de la sección de coincidencias.
Outcome: Especifica los resultados de la búsqueda. Para obtener más información, consulta Sintaxis de la sección de resultados.
Order: Determina el orden de los resultados de la búsqueda como
asc
(ascendente) odesc
(descendente). Si no se especifica el orden (asc
odesc
), el valor predeterminado seráasc
.Límite (opcional): Establece la cantidad máxima de filas que devuelve la consulta.
Este es un ejemplo del uso de 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 en el 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 hasta un máximo de 25 elementos aleatorios.
Tipos de datos de parámetros
STRING
Tipo de datos que se muestra
LIST
Muestras de código
Ejemplo
Devuelve un array 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 deduplicación para obtener una lista distinta se aplica antes del truncamiento.
Tipos de datos de parámetros
STRING
Tipo de datos que se muestra
LIST
Muestras de código
Ejemplo
Devuelve 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
devuelve 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 parámetros
NUMBER
Tipo de datos que se muestra
NUMBER
Muestras de código
Ejemplo
Encuentra todos los eventos en los que target.ip
no está vacío. Para todos los eventos que coincidan con 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
devuelve la cantidad de filas dentro de un grupo. Se suele usar con match
para obtener recuentos de grupos específicos en los datos.
Tipos de datos de parámetros
STRING
Tipo de datos que se muestra
NUMBER
Muestras de código
Ejemplo
Devuelve el recuento de los accesos de usuarios exitosos 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 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 parámetros
STRING
Tipo de datos que se muestra
NUMBER
Muestras de código
Ejemplo
Devuelve el recuento de los accesos de usuarios exitosos 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
devuelve el valor 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 de los datos.
Tipos de datos de parámetros
NUMBER
Tipo de datos que se muestra
NUMBER
Muestras de código
Ejemplo
Encuentra todos los eventos en los que target.ip
no está vacío. Para todos los eventos que coincidan con principal.ip
, almacena el valor 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 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 parámetros
NUMBER
Tipo de datos que se muestra
NUMBER
Muestras de código
Ejemplo
Encuentra todos los eventos en los que target.ip
no está vacío. Para todos los eventos que coinciden 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
devuelve la suma de los valores dentro 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 los datos.
Tipos de datos de parámetros
NUMBER
Tipo de datos que se muestra
NUMBER
Muestras de código
Ejemplo
Encuentra todos los eventos en los que target.ip
no está vacío. Para todos los eventos que coincidan con principal.ip
, almacena la 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 datos que se muestra
NUMBER
Muestras de código
Ejemplo
Encuentra 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 datos que se muestra
TIMESTAMP
Muestras de código
Ejemplo
Para todos los eventos que coincidan en 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 reciente
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 datos que se muestra
TIMESTAMP
Muestras de código
Ejemplo
Para todos los eventos que coincidan en hostname
, almacena el valor más reciente de metadata.event_timestamp
en la variable end
.
$hostname = principal.hostname
match:
$hostname
outcome:
$end = latest(metadata.event_timestamp)
YARA-L 2.0: Comparación entre la búsqueda y el uso del UDM
La palabra clave
over
, que se usa para las búsquedas de ventanas de eventos, no se admite en la búsqueda.Las búsquedas de UDM no incluyen las secciones
condition
yoption
.
Agrupa por nivel de detalle de los datos temporales
Puedes agrupar los campos de eventos y los marcadores de posición en la sección match
según una granularidad de tiempo especificada, de forma similar a cómo se agrupa una columna en SQL.
La sintaxis es la siguiente:
match:
... [BY|OVER EVERY] [FIRST] [TIME_GRANULARITY]
Para agrupar por granularidad temporal, puedes usar la palabra clave by
o over
every
. Las granularidades de tiempo permitidas son las siguientes:
MINUTE
om
HOUR
oh
DAY
od
WEEK
ow
MONTH
omo
Las palabras clave by
y over every
son equivalentes en cuanto a su función. Puedes usar uno u otro.
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
) y una granularidad temporal 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 período.
La palabra clave first
se puede agregar a by
y over every
, lo que genera el mismo comportamiento para ambas. El uso de by first
equivale a over every first
.
A continuación, se muestra un ejemplo de una búsqueda que usa el operador by
con la fuente de datos de contexto de la entidad que es válida durante un período. En esta búsqueda, 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)
Cómo crear y guardar visualizaciones en la búsqueda
En esta sección, se describen las funciones de visualización de datos en la búsqueda del modelo de datos unificado (UDM) de Google SecOps. Esta función permite que los analistas del Centro de operaciones de seguridad (SOC) detecten, investiguen y respondan a las amenazas de manera eficiente, ya que pueden crear visualizaciones a partir de los resultados de la búsqueda y guardarlas en los paneles.
Crea y guarda visualizaciones en el panel
Para crear y guardar visualizaciones que se agregarán al panel, haz lo siguiente:
Escribe una consulta en YARA-L con secciones
match
youtcome
.Selecciona un período y, luego, haz clic en Ejecutar búsqueda 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 en la lista Tipo de gráfico. b. Ajusta la configuración en Configuración de datos para personalizar el gráfico.
En la pantalla Agregar al panel, haz lo siguiente: a. Ingresa un nombre, una descripción y un período para el gráfico. b. Elige si deseas 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.