Estatísticas e agregações na pesquisa da UDM usando a YARA-L 2.0

Compatível com:

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.

Ao processar um grande volume de eventos da UDM gerados no seu ambiente, é importante entender as tendências nos dados de pesquisa da 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.

Casos de uso para consultas estatísticas

É possível usar consultas estatísticas para os seguintes casos de uso:

  • Rastrear métricas críticas: é possível medir a distribuição e a frequência de eventos de UDM e ativos associados, como hosts que se comunicam com endereços IP maliciosos conhecidos.

  • Detectar comportamento anômalo: é possível identificar picos de atividade que podem indicar incidentes de segurança, como picos de tráfego de rede inesperados ou logins fora do horário de trabalho.

  • Analisar tendências ao longo do tempo: é possível avaliar as mudanças na postura de segurança para avaliar a eficácia do controle ou identificar áreas de melhoria, como monitorar as flutuações na contagem de vulnerabilidades ao longo do tempo.

É possível agrupar e ordenar os resultados da consulta de pesquisa da UDM usando uma sintaxe semelhante à estrutura YARA-L usada nas regras do mecanismo de detecção. Para mais informações, consulte Sintaxe da linguagem YARA-L 2.0.

A estrutura de consulta do YARA-L 2.0 é a seguinte:

  • Instrução de filtragem: especifica as condições para filtrar eventos.

  • Correspondência (opcional): define os campos para agrupar. Para mais informações, consulte Sintaxe da seção de correspondência.

  • Resultado: especifica as saídas da consulta. Para mais informações, consulte Sintaxe da seção de resultados.

  • Ordem: determina a ordem dos resultados da consulta como asc (ascendente) ou desc (descendente). Se a ordem (asc ou desc) não for especificada, o padrão será asc.

  • Limite (opcional): define o número máximo de linhas que a consulta retorna.

Confira um exemplo de ordem e uso do limite:

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 é compatível com as seguintes funções de agregação:

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)

méd.

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)

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)

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)

ponderada

sum(numericExpression)

Descrição

A função sum retorna a soma dos valores em uma coluna numérica. Ele ignora os valores 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)

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)

YARA-L 2.0: pesquisa versus uso da UDM

  • A palavra-chave over, usada para pesquisas de janela de eventos, não é compatível com a pesquisa.

  • As consultas de pesquisa da UDM não incluem as seções condition e option.

Agrupar por granularidade de tempo

É possível agrupar campos de evento e marcadores de posição na seção match por uma granularidade de tempo especificada, semelhante ao agrupamento de uma coluna 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 as seguintes:

  • MINUTE ou m
  • HOUR ou h
  • DAY ou d
  • WEEK ou w
  • MONTH ou mo

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 se aplica a um único carimbo de data/hora. Isso significa que, para uma fonte de dados válida em um período, a palavra-chave first considera apenas o horário 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 forem agrupados por hosts (h1,h2), as colunas retornadas serão (h1, 1m) e (h2, 1m), com o restante do intervalo de tempo ignorado.

A palavra-chave first pode ser adicionada a by e over every, resultando 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)

Criar e salvar visualizações na pesquisa

A pesquisa do Unified Data Model (UDM) do Google SecOps oferece recursos poderosos de visualização de dados. Esses recursos permitem que os analistas da central de operações de segurança (SOC) detectem, investiguem e respondam às ameaças de maneira eficiente, criando visualizações com base nos resultados da pesquisa e salvando-as em painéis.

Criar e salvar visualizações no painel nativo

Para criar e salvar visualizações e adicioná-las ao Painel nativo, faça o seguinte:

  1. Crie uma consulta YARA-L com seções match e outcome.

  2. Selecione um período e clique em Executar pesquisa para executar a consulta. Confira os resultados nas guias Estatísticas e Visualizar.

  3. Na guia Visualizar, faça o seguinte: Selecione um tipo de gráfico na lista Tipo de gráfico. Ajuste as configurações em Configurações de dados para personalizar o gráfico.

  4. Na tela Adicionar ao painel, faça o seguinte: Insira um nome, uma descrição e um intervalo de tempo. Adicione o gráfico a um painel existente ou crie um novo.

  5. Clique em Adicionar ao painel para incluir o gráfico no painel.

Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.