Estatísticas e agregações na pesquisa através do YARA-L 2.0
Esta página descreve como executar consultas estatísticas em eventos da UDM e agrupar os resultados para análise através do YARA-L 2.0.
Quando processa um grande volume de eventos de UDM gerados no seu ambiente, é importante compreender as tendências nos seus dados de pesquisa de UDM. Pode usar estatísticas e funções de agregação para obter estatísticas acionáveis a partir dos registos do UDM. A pesquisa UDM suporta todas as funções de agregação no YARA-L 2.0.
Exemplos de utilização de consultas estatísticas
Pode usar consultas estatísticas para os seguintes exemplos de utilização:
Acompanhe as métricas críticas: pode medir a distribuição e a frequência dos eventos da UDM e dos recursos associados, como anfitriões que comunicam com endereços IP maliciosos conhecidos.
Detetar comportamento anómalo: pode identificar picos de atividade que podem indicar incidentes de segurança, como aumentos inesperados no tráfego de rede ou inícios de sessão fora do horário de expediente.
Analise as tendências ao longo do tempo: pode avaliar as alterações da postura de segurança para avaliar a eficácia dos controlos ou identificar áreas de melhoria, como monitorizar as flutuações nas contagens de vulnerabilidades ao longo do tempo.
Estrutura de consulta YARA-L 2.0 na pesquisa
Pode agrupar e ordenar os resultados da consulta de pesquisa da UDM através de uma sintaxe semelhante à sintaxe estruturada YARA-L usada nas regras do motor de deteção. Para mais informações, consulte a sintaxe da linguagem YARA-L 2.0.
A estrutura da consulta YARA-L 2.0 é a seguinte:
Declaração de filtragem: especifica as condições para filtrar eventos.
Match (opcional): define os campos pelos quais agrupar. Para mais informações, consulte a sintaxe da secção de correspondência.
Resultado: especifica as saídas da consulta. Para mais informações, consulte a sintaxe da secção de resultados.
Dedup (opcional): reduz o volume de resultados duplicados. Para mais informações, consulte Remoção de duplicados.
Order: determina a ordem dos resultados da consulta como
asc
(ascendente) oudesc
(descendente). Se a ordem (asc
oudesc
) não for especificada, a predefinição éasc
.Limite (opcional): define o número máximo de linhas devolvidas pela consulta.
Segue-se um exemplo de utilização de pedidos e limites:
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 suporta as seguintes funções de agregação:
matriz
array(expression)
Descrição
A função array
devolve todos os valores sob a forma de uma lista. A lista é truncada para um máximo de 25 elementos aleatórios.
Tipos de dados de parâmetros
STRING
Tipo devolvido
LIST
Exemplos de código
Exemplo
Devolve 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
devolve todos os valores distintos sob a forma de uma lista. A lista é truncada para um máximo de 25 elementos aleatórios. A anulação da duplicação para obter uma lista distinta é aplicada antes do corte.
Tipos de dados de parâmetros
STRING
Tipo devolvido
LIST
Exemplos de código
Exemplo
Devolve uma matriz que contém tipos de eventos distintos.
$event_type = metadata.event_type
outcome:
$event_type_array = array_distinct($event_type)
média
avg(numericExpression)
Descrição
A função avg
devolve a média dos valores numa coluna numérica. Ignora os valores NULL
durante o cálculo. É frequentemente usado
com match
para calcular as médias em grupos específicos nos dados.
Tipos de dados de parâmetros
NUMBER
Tipo devolvido
NUMBER
Exemplos de código
Exemplo
Encontrar todos os eventos em que target.ip
não está vazio. Para todos os eventos que correspondam a principal.ip
, armazene a média de metadata.event_timestamp.seconds
numa variável denominada avg_seconds
.
target.ip != ""
match:
principal.ip
outcome:
$avg_seconds = avg(metadata.event_timestamp.seconds)
contagem
count(expression)
Descrição
A função count
devolve o número de linhas num grupo. É frequentemente usado
com match
para obter contagens de grupos específicos nos dados.
Tipos de dados de parâmetros
STRING
Tipo devolvido
NUMBER
Exemplos de código
Exemplo
Devolve a contagem de inícios de sessão de utilizadores 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
devolve o número de linhas que têm valores distintos num grupo. É frequentemente usado com match
para obter contagens de grupos específicos nos dados.
Tipos de dados de parâmetros
STRING
Tipo devolvido
NUMBER
Exemplos de código
Exemplo
Devolve a contagem de inícios de sessão de utilizadores bem-sucedidos 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)
máx.
max(numericExpression)
Descrição
A função max
devolve o máximo dos valores numa coluna numérica.
É frequentemente usado com match
para obter o valor máximo em cada grupo nos dados.
Tipos de dados de parâmetros
NUMBER
Tipo devolvido
NUMBER
Exemplos de código
Exemplo
Encontrar 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
numa variável denominada max_seconds
.
target.ip != ""
match:
principal.ip
outcome:
$max_seconds = max(metadata.event_timestamp.seconds)
min
min(numericExpression)
Descrição
A função min
devolve o mínimo dos valores numa coluna numérica. É frequentemente usado com match
para obter o valor mínimo em cada grupo nos dados.
Tipos de dados de parâmetros
NUMBER
Tipo devolvido
NUMBER
Exemplos de código
Exemplo
Encontrar 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
numa variável denominada min_seconds
.
target.ip != ""
match:
principal.ip
outcome:
$min_seconds = min(metadata.event_timestamp.seconds)
soma
sum(numericExpression)
Descrição
A função sum
devolve a soma dos valores numa coluna numérica. Ignora os valores NULL
durante o cálculo. É frequentemente usado com match
para calcular as somas em diferentes grupos nos dados.
Tipos de dados de parâmetros
NUMBER
Tipo devolvido
NUMBER
Exemplos de código
Exemplo
Encontrar todos os eventos em que target.ip
não está vazio. Para todos os eventos que correspondam a principal.ip
, armazene uma soma de network.sent_bytes
numa variável denominada sent_bytes
.
target.ip != ""
match:
principal.ip
outcome:
$sent_bytes = sum(network.sent_bytes)
stddev
stddev(numericExpression)
Descrição
A função stddev
devolve o desvio padrão de todos os valores possíveis.
Tipos de dados de parâmetros
NUMBER
Tipo devolvido
NUMBER
Exemplos de código
Exemplo
Encontrar todos os eventos em que target.ip
não está vazio. Para todos os eventos que correspondam a principal.ip
, armazene o desvio padrão de metadata.event_timestamp.seconds
numa variável denominada stddev_seconds
.
target.ip != ""
match:
principal.ip
outcome:
$stddev_seconds = stddev(metadata.event_timestamp.seconds)
mais antigos
earliest(timestamp)
Descrição
A função earliest
devolve a data/hora mais antiga de um conjunto de registos com uma resolução de microssegundos.
Tipos de dados de parâmetros
TIMESTAMP
Tipo devolvido
TIMESTAMP
Exemplos de código
Exemplo
Para todos os eventos que correspondam a hostname
, armazene o mais antigo de
metadata.event_timestamp
na variável start
.
$hostname = principal.hostname
match:
$hostname
outcome:
$start = earliest(metadata.event_timestamp)
mais recentes
latest(timestamp)
Descrição
A função latest
devolve a data/hora mais recente de um conjunto de registos
com resolução de microssegundos.
Tipos de dados de parâmetros
TIMESTAMP
Tipo devolvido
TIMESTAMP
Exemplos de código
Exemplo
Para todos os eventos que correspondam a hostname
, armazene o mais recente de
metadata.event_timestamp
na variável end
.
$hostname = principal.hostname
match:
$hostname
outcome:
$end = latest(metadata.event_timestamp)
YARA-L 2.0: pesquisa vs. utilização da UDM
A palavra-chave
over
, usada para pesquisas de janelas de eventos, não é suportada na pesquisa.As consultas de pesquisa da UDM não incluem as secções
condition
eoption
.
Agrupar por nível de detalhe temporal
Pode agrupar campos de eventos e marcadores de posição na secção match
por uma granularidade de tempo especificada, semelhante ao agrupamento de uma coluna em SQL.
A sintaxe é a seguinte:
match:
... [BY|OVER EVERY] [FIRST] [TIME_GRANULARITY]
Para agrupar por granularidade de tempo, pode usar a palavra-chave by
ou over
every
. Os níveis de detalhe de tempo permitidos são os seguintes:
MINUTE
oum
HOUR
ouh
DAY
oud
WEEK
ouw
MONTH
oumo
As palavras-chave by
e over every
são funcionalmente equivalentes. Pode usar um em vez do outro.
Exemplos
Agrupe o endereço IP e o nome de anfitrião por hora.
$hostname = principal.hostname
match:
$hostname, target.ip by hour
Agrupe a contagem de todos os eventos por nome do anfitrião e pelo dia em que o evento ocorreu.
$hostname = target.hostname
match:
$hostname over every day
outcome:
$events_count = count($hostname)
Algumas origens de dados, como o contexto da entidade, são válidas num intervalo de tempo (<start_time>
, <end_time>
) e não têm datas/horas únicas.
A palavra-chave first
é opcional e aplica-se a uma única data/hora. Isto significa que, para uma origem de dados válida num intervalo de tempo, a palavra-chave first
considera apenas a hora de início (<start_time>
).
Por exemplo, considere uma entidade com um intervalo de tempo de (1m, 5m
) com uma granularidade de tempo de 1m
. Se os resultados estiverem agrupados por anfitriões (h1
,h2
), as colunas devolvidas serão (h1
, 1m
) e (h2
, 1m
), sendo ignorado o resto do intervalo de tempo.
A palavra-chave first
pode ser adicionada a by
e over every
, o que resulta no mesmo comportamento para ambas. A utilização de by first
é equivalente a
over every first
.
Segue-se um exemplo de uma consulta que usa o operador by
com a origem de dados de contexto da entidade que é válida num intervalo de tempo. Nesta consulta, é considerado o intervalo de tempo completo porque a palavra-chave first
foi omitida.
graph.entity.hostname != ""
match:
graph.entity.ip by hour
outcome:
$min_seconds = min(graph.metadata.event_metadata.event_timestamp.seconds)
Crie e guarde visualizações na pesquisa
Esta secção descreve as capacidades de visualização de dados na pesquisa do modelo de dados unificado (UDM) do Google SecOps. Esta funcionalidade permite que os analistas do Centro de Operações de Segurança (SOC) detetem, investiguem e respondam a ameaças de forma eficiente através da criação de visualizações a partir dos resultados da pesquisa e da respetiva poupança em painéis de controlo.
Crie e guarde visualizações no painel de controlo
Para criar e guardar visualizações para adicionar ao painel de controlo, faça o seguinte:
Escreva uma consulta YARA-L com secções
match
eoutcome
.Selecione um intervalo de datas e, de seguida, clique em Executar pesquisa para executar a consulta. Veja os resultados nos separadores Estatísticas e Visualizar.
No separador Visualizar, faça o seguinte: a. Selecione um tipo de gráfico na lista Tipo de gráfico. b. Ajuste as definições em Definições de dados para personalizar o gráfico.
No ecrã Adicionar ao painel de controlo, faça o seguinte: a. Introduza um nome do gráfico, uma descrição e um intervalo de tempo. b. Opte por adicionar o gráfico a um painel de controlo existente ou criar um novo painel de controlo.
Clique em Adicionar ao painel de controlo para adicionar o gráfico ao painel de controlo.
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais da Google SecOps.