Estadísticas y agregaciones en búsquedas con YARA-L 2.0
En esta página se describe cómo ejecutar consultas estadísticas en eventos de UDM y agrupar los resultados para analizarlos con YARA-L 2.0.
Cuando se gestiona un gran volumen de eventos de UDM generados en su entorno, es importante conocer las tendencias de los datos de búsqueda de UDM. Puedes usar estadísticas y funciones de agregación para obtener información valiosa a partir de tus registros de UDM. La búsqueda de UDM admite todas las funciones de agregación de YARA-L 2.0.
Casos prácticos de consultas estadísticas
Puedes usar consultas estadísticas en los siguientes casos prácticos:
Monitorizar métricas críticas: puede medir la distribución y la frecuencia de los eventos de UDM y los recursos asociados, como los hosts que se comunican con direcciones IP maliciosas conocidas.
Detectar comportamientos anómalos: puede identificar picos de actividad que pueden indicar incidentes de seguridad, como aumentos inesperados del tráfico de red o inicios de sesión fuera del horario habitual.
Analizar 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 monitorizar las fluctuaciones en el número de vulnerabilidades a lo largo del tiempo.
Estructura de las consultas de YARA-L 2.0 en la búsqueda
Puedes agrupar y ordenar los resultados de las consultas de búsqueda de 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 las consultas de YARA-L 2.0 es la siguiente:
Instrucción de filtrado: especifica las condiciones para filtrar eventos.
Match (opcional): define los campos por los que se agruparán los resultados. Para obtener más información, consulta la sintaxis de la sección Match.
Resultado: especifica la información de salida de la consulta. Para obtener más información, consulta la sección Sintaxis de la sección de resultados.
Eliminación de duplicados (opcional): reduce el volumen de resultados duplicados. Para obtener más información, consulta Anulación de duplicados.
Orden: determina el orden de los resultados de la consulta como
asc
(ascendente) odesc
(descendente). Si no se especifica el orden (asc
odesc
), se utilizaasc
de forma predeterminada.Límite (opcional): define el número máximo de filas que devuelve la consulta.
Aquí tienes un ejemplo de uso de los parámetros 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 de 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 a un máximo de 25 elementos aleatorios.
Tipos de datos de parámetros
STRING
Tipo de devolución
LIST
Códigos de ejemplo
Ejemplo
Devuelve una matriz 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
desduplicación para obtener una lista distinta se aplica antes del truncamiento.
Tipos de datos de parámetros
STRING
Tipo de devolución
LIST
Códigos de ejemplo
Ejemplo
Devuelve una matriz que contiene tipos de eventos distintos.
$event_type = metadata.event_type
outcome:
$event_type_array = array_distinct($event_type)
media
avg(numericExpression)
Descripción
La función avg
devuelve la media de los valores de una columna numérica. Ignora los valores NULL
durante el cálculo. Se suele usar con match
para calcular las medias de grupos específicos de los datos.
Tipos de datos de parámetros
NUMBER
Tipo de devolución
NUMBER
Códigos de ejemplo
Ejemplo
Busca todos los eventos en los que target.ip
no esté vacío. Para todos los eventos que coincidan con principal.ip
, almacena la media de metadata.event_timestamp.seconds
en una variable llamada avg_seconds
.
target.ip != ""
match:
principal.ip
outcome:
$avg_seconds = avg(metadata.event_timestamp.seconds)
recuento
count(expression)
Descripción
La función count
devuelve el número de filas de un grupo. Se suele usar con match
para obtener recuentos de grupos específicos de los datos.
Tipos de datos de parámetros
STRING
Tipo de devolución
NUMBER
Códigos de ejemplo
Ejemplo
Devuelve el número de inicios de sesión 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
devuelve el número de filas que tienen valores distintos en un grupo. Se suele usar con match
para obtener recuentos de grupos específicos de los datos.
Tipos de datos de parámetros
STRING
Tipo de devolución
NUMBER
Códigos de ejemplo
Ejemplo
Devuelve el recuento de inicios de sesión de usuarios únicos 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_distinct(metadata.id)
máx.
max(numericExpression)
Descripción
La función max
devuelve el valor máximo de los valores de una columna numérica.
Se suele usar con match
para obtener el valor máximo de cada grupo de los datos.
Tipos de datos de parámetros
NUMBER
Tipo de devolución
NUMBER
Códigos de ejemplo
Ejemplo
Busca todos los eventos en los que target.ip
no esté vacío. En todos los eventos que
coincidan con 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
devuelve el mínimo de los valores de una columna numérica. Se suele usar con match
para obtener el valor mínimo de cada grupo de los datos.
Tipos de datos de parámetros
NUMBER
Tipo de devolución
NUMBER
Códigos de ejemplo
Ejemplo
Busca todos los eventos en los que target.ip
no esté vacío. En el caso de todos los eventos que
coincidan con principal.ip
, almacena el 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)
suma
sum(numericExpression)
Descripción
La función sum
devuelve la suma de los valores de una columna numérica. Ignora los valores NULL
durante el cálculo. Se suele usar con match
para calcular las sumas de los distintos grupos de datos.
Tipos de datos de parámetros
NUMBER
Tipo de devolución
NUMBER
Códigos de ejemplo
Ejemplo
Busca todos los eventos en los que target.ip
no esté vacío. Para todos los eventos que coincidan con 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
devuelve la desviación estándar de todos los valores posibles.
Tipos de datos de parámetros
NUMBER
Tipo de devolución
NUMBER
Códigos de ejemplo
Ejemplo
Busca 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 devolución
TIMESTAMP
Códigos de ejemplo
Ejemplo
En el caso de todos los eventos que coincidan con 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 recientes
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 devolución
TIMESTAMP
Códigos de ejemplo
Ejemplo
En todos los eventos que coincidan con hostname
, almacena el último de metadata.event_timestamp
en la variable end
.
$hostname = principal.hostname
match:
$hostname
outcome:
$end = latest(metadata.event_timestamp)
YARA-L 2.0: búsqueda frente a uso de UDM
La palabra clave
over
, que se usa en las búsquedas de ventanas de eventos, no se admite en la búsqueda.Las consultas de búsqueda de UDM no incluyen las secciones
condition
yoption
.
Agrupar por granularidad de tiempo
Puedes agrupar campos de evento y marcadores de posición en la sección match
por una granularidad de tiempo específica, de forma similar a como se agrupa una columna en SQL.
La sintaxis es la siguiente:
match:
... [BY|OVER EVERY] [FIRST] [NUMBER] [TIME_GRANULARITY]
Para agrupar por granularidad temporal, puede 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 funcionalmente equivalentes. Puedes usar uno u otro.
Ejemplos
Agrupa las direcciones IP y los nombres de host cada 2 horas.
$hostname = principal.hostname
match:
$hostname, target.ip by 2h
Agrupar por nombre de host con una granularidad de tiempo completa.
$hostname = principal.hostname
match:
$hostname by minute
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 periodo (<start_time>
, <end_time>
) y no tienen marcas de tiempo singulares.
La palabra clave first
es opcional y se aplica a una sola marca de tiempo. Esto significa que, en el caso de una fuente de datos válida durante un periodo, la palabra clave first
solo tiene en cuenta la hora de inicio (<start_time>
).
Por ejemplo, supongamos que tiene una entidad con un intervalo de tiempo de (1m, 5m
) y una granularidad de tiempo 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 intervalo de tiempo.
La palabra clave first
se puede añadir tanto a by
como a over every
, lo que da como resultado el mismo comportamiento en ambos casos. El uso de by first
equivale a over every first
.
A continuación, se muestra un ejemplo de una consulta que usa el operador by
con la fuente de datos de contexto de entidad que es válida durante un periodo. En esta consulta, se tiene en cuenta todo el periodo porque se ha omitido la palabra clave first
.
graph.entity.hostname != ""
match:
graph.entity.ip by hour
outcome:
$min_seconds = min(graph.metadata.event_metadata.event_timestamp.seconds)
Crear y guardar visualizaciones en la búsqueda
En esta sección se describen las funciones de visualización de datos de la búsqueda del modelo de datos unificado (UDM) de Google SecOps. Esta función permite a los analistas del centro de operaciones de seguridad (SOC) detectar, investigar y responder a las amenazas de forma eficiente creando visualizaciones a partir de los resultados de búsqueda y guardándolas en paneles de control.
Crear y guardar visualizaciones en el panel de control
Para crear y guardar visualizaciones que se añadirán al panel de control, sigue estos pasos:
Escribe una consulta de YARA-L con las secciones
match
youtcome
.Seleccione un periodo y, a continuación, haga 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, haga lo siguiente: a. Selecciona un tipo de gráfico en la lista Tipo de gráfico. b. Ajusta la configuración de Datos para personalizar el gráfico.
En la pantalla Añadir al panel de control, haz lo siguiente: a. Introduce un nombre, una descripción y un periodo para el gráfico. b. Elige si quieres añadir el gráfico a un panel de control que ya tengas o crear uno nuevo.
Haz clic en Añadir al panel de control para añadir el gráfico al panel de control.
¿Necesitas más ayuda? Recibe respuestas de los miembros de la comunidad y de los profesionales de Google SecOps.