Estatísticas e agregações na pesquisa da UDM usando a YARA-L 2.0
Esta página descreve como executar consultas estatísticas em eventos do UDM e agrupar os resultados para análise usando o YARA-L 2.0.
Visão geral
Ao lidar com um grande volume de eventos do UDM gerados no seu ambiente, é importante entender as tendências nos dados de pesquisa do UDM. Você pode usar estatísticas e funções de agregação para receber insights úteis dos seus registros do UDM. A pesquisa do UDM é compatível com todas as funções de agregação no YARA-L 2.0.
É possível usar consultas estatísticas para os seguintes casos de uso:
Acompanhar métricas críticas: é possível medir a distribuição e a frequência dos eventos de UDM e dos ativos envolvidos, como hosts que se comunicam com endereços IP maliciosos conhecidos.
Detectar comportamento anômalo: é possível detectar padrões ou picos incomuns na atividade que podem indicar um incidente de segurança, como volumes de tráfego de rede incomuns ou atividade de login inesperada em horários incomuns.
Analisar tendências ao longo do tempo: é possível identificar mudanças na postura de segurança para avaliar o impacto dos controles ou encontrar áreas que precisam de melhorias, como rastrear as mudanças na contagem de vulnerabilidades ao longo do tempo.
Estrutura de consulta YARA-L 2.0 na pesquisa
É possível agrupar e ordenar os resultados da consulta de pesquisa do UDM usando a sintaxe semelhante à estrutura YARA-L nas regras do mecanismo de detecção. Para mais informações, consulte Sintaxe da linguagem YARA-L 2.0.
A estrutura da consulta é a seguinte:
Instrução de filtragem: especifica as condições para filtrar eventos.
Correspondência (opcional): a seção de correspondência especifica os campos para agrupar. Para mais informações, consulte Sintaxe da seção de correspondência.
Resultado: a seção de resultado especifica as saídas da consulta. Para mais informações, consulte Sintaxe da seção de resultados.
Ordem: a seção de ordem especifica a ordem dos resultados da consulta retornados. Se a ordem (
asc
oudesc
) não for especificada, o padrão seráasc
.Limite (opcional): a seção de limite especifica o número máximo de linhas que a consulta retorna.
Confira um exemplo de ordem e limite de uso:
metadata.log_type = "OKTA"
match:
principal.ip
Outcome:
$user_count_by_ip = count(principal.user.userid)
order:
$user_count_by_ip desc
limit:
20
Agregações
A pesquisa da UDM oferece suporte às seguintes funções de agregação:
ponderada
sum(numericExpression)
Descrição
A função sum
retorna a soma dos valores em uma coluna numérica. Ele ignora
os valores de NULL
durante o cálculo. Ela é usada com frequência com match
para calcular as somas em diferentes grupos nos dados.
Tipos de dados de parâmetro
NUMBER
Tipo de retorno
NUMBER
Exemplos de código
Exemplo
Encontre todos os eventos em que target.ip
não está vazio. Para todos os eventos que
correspondem a principal.ip
, armazene uma soma de network.sent_bytes
em uma variável
chamada sent_bytes
.
target.ip != ""
match:
principal.ip
outcome:
$sent_bytes = sum(network.sent_bytes)
min
min(numericExpression)
Descrição
A função min
retorna o valor mínimo dos valores em uma coluna numérica. Ele
é usado com frequência com match
para receber o valor mínimo em cada
grupo nos dados.
Tipos de dados de parâmetro
NUMBER
Tipo de retorno
NUMBER
Exemplos de código
Exemplo
Encontre todos os eventos em que target.ip
não está vazio. Para todos os eventos que
correspondem a principal.ip
, armazene o mínimo de metadata.event_timestamp.seconds
em uma variável chamada min_seconds
.
target.ip != ""
match:
principal.ip
outcome:
$min_seconds = min(metadata.event_timestamp.seconds)
max
max(numericExpression)
Descrição
A função max
retorna o valor máximo dos valores em uma coluna numérica.
Ele é usado com frequência com match
para receber o valor máximo em cada grupo nos
dados.
Tipos de dados de parâmetro
NUMBER
Tipo de retorno
NUMBER
Exemplos de código
Exemplo
Encontre todos os eventos em que target.ip
não está vazio. Para todos os eventos que
correspondem a principal.ip
, armazene o máximo de metadata.event_timestamp.seconds
em uma variável chamada max_seconds
.
target.ip != ""
match:
principal.ip
outcome:
$max_seconds = max(metadata.event_timestamp.seconds)
média
avg(numericExpression)
Descrição
A função avg
retorna a média dos valores em uma coluna numérica. Ele
ignora os valores NULL
durante o cálculo. Ele é usado com frequência
com match
para calcular as médias em grupos específicos nos dados.
Tipos de dados de parâmetro
NUMBER
Tipo de retorno
NUMBER
Exemplos de código
Exemplo
Encontre todos os eventos em que target.ip
não está vazio. Para todos os eventos que
correspondem a principal.ip
, armazene a média de metadata.event_timestamp.seconds
em uma variável chamada avg_seconds
.
target.ip != ""
match:
principal.ip
outcome:
$avg_seconds = avg(metadata.event_timestamp.seconds)
contagem
count(expression)
Descrição
A função count
retorna o número de linhas em um grupo. Ele é usado com frequência
com match
para receber contagens de grupos específicos nos dados.
Tipos de dados de parâmetro
STRING
Tipo de retorno
NUMBER
Exemplos de código
Exemplo
Retorna a contagem de logins de usuários bem-sucedidos ao longo do tempo.
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)
Descrição
A função count_distinct
retorna o número de linhas que têm valores
diferentes em um grupo. Ela é usada com frequência com match
para receber contagens de
grupos específicos nos dados.
Tipos de dados de parâmetro
STRING
Tipo de retorno
NUMBER
Exemplos de código
Exemplo
Retorna a contagem de logins de usuários distintos ao longo do tempo.
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)
matriz
array(expression)
Descrição
A função array
retorna todos os valores no formato de uma lista. Ele trunca
a lista para um máximo de 25 elementos aleatórios.
Tipos de dados de parâmetro
STRING
Tipo de retorno
LIST
Exemplos de código
Exemplo
Retorna uma matriz que contém tipos de eventos.
$event_type = metadata.event_type
outcome:
$event_type_array = array($event_type)
array_distinct
array_distinct(expression)
Descrição
A função array_distinct
retorna todos os valores distintos na forma de uma
lista. Ele trunca a lista para um máximo de 25 elementos aleatórios. A
eliminação de duplicação para receber uma lista distinta é aplicada antes do truncamento.
Tipos de dados de parâmetro
STRING
Tipo de retorno
LIST
Exemplos de código
Exemplo
Retorna uma matriz com tipos de eventos distintos.
$event_type = metadata.event_type
outcome:
$event_type_array = array_distinct($event_type)
stddev
stddev(numericExpression)
Descrição
A função stddev
retorna o desvio padrão de todos os valores
possíveis.
Tipos de dados de parâmetro
NUMBER
Tipo de retorno
NUMBER
Exemplos de código
Exemplo
Encontre todos os eventos em que target.ip
não está vazio. Para todos os eventos que
correspondem a principal.ip
, armazene a variação padrão de
metadata.event_timestamp.seconds
em uma variável chamada stddev_seconds
.
target.ip != ""
match:
principal.ip
outcome:
$stddev_seconds = stddev(metadata.event_timestamp.seconds)
Diferenças entre o uso da YARA-L 2.0 na pesquisa e no UDM
A palavra-chave
over
, que permite pesquisar eventos em uma janela, não é aplicável na pesquisa.A estrutura de consulta de pesquisa do UDM não inclui as seções
condition
eoption
.
Agrupar por granularidade de tempo
É possível agrupar todos os campos de evento e marcadores de posição na seção match
por uma
granularidade de tempo especificada, semelhante a uma coluna que você pode agrupar no SQL.
A sintaxe é a seguinte:
match:
... [BY|OVER EVERY] [FIRST] [TIME_GRANULARITY]
Para agrupar por granularidade de tempo, use a palavra-chave by
ou over
every
. As granularidades de tempo permitidas são:
MINUTE
oum
HOUR
ouh
DAY
oud
WEEK
ouw
MONTH
oumo
As palavras-chave by
e over every
são funcionalmente equivalentes. Você pode
usar um em vez do outro.
Exemplos
Agrupar o endereço IP e o nome do host por hora.
$hostname = principal.hostname
match:
$hostname, target.ip by hour
Agrupe a contagem de todos os eventos por nome de host e pelo dia em que o evento ocorreu.
$hostname = target.hostname
match:
$hostname over every day
outcome:
$events_count = count($hostname)
Algumas fontes de dados, como o contexto da entidade, são válidas em um período
(<start_time>
, <end_time>
) e não têm carimbos de data/hora singulares.
A palavra-chave first
é opcional e trata uma origem de dados que é válida em um período como se fosse uma origem de dados válida apenas em um carimbo de data/hora. Isso significa que, para uma fonte de dados válida em um período,
a palavra-chave first
leva em conta apenas o horário de início (<start_time>
),
desconsiderando o horário de término do período.
Por exemplo, considere uma entidade com um intervalo de tempo de (1m, 5m
) com uma granularidade
de tempo de 1 minuto. Suponha que os resultados sejam agrupados por hosts, que são
[h1, h2
]. As colunas que são retornadas são (h1, 1m
) e (h2,
1m
), já que o restante do período é desconsiderado.
A palavra-chave first
pode ser adicionada a by
e over every
, o que resulta no mesmo comportamento para ambos. O uso de by first
é equivalente a
over every first
.
Confira a seguir um exemplo de consulta que usa o operador by
com a fonte de dados de contexto da entidade válida em um período. Nesta consulta, o intervalo de tempo inteiro é considerado porque a palavra-chave first
é omitida.
graph.entity.hostname != ""
match:
graph.entity.ip by hour
outcome:
$min_seconds = min(graph.metadata.event_metadata.event_timestamp.seconds)