Sintaxe da seção de correspondência
A seção match fornece os parâmetros necessários para correlacionar vários eventos relacionados em uma única detecção. Ele é obrigatório apenas para regras que vinculam dois ou mais eventos distintos. Use-o para definir os critérios dessa correlação especificando o seguinte:
Campos de agrupamento (chaves): os campos específicos dos eventos (definidos na seção
events) que precisam compartilhar o mesmo valor para que os eventos sejam vinculados logicamente.Restrição de tempo: o período contínuo em que os eventos relacionados precisam ocorrer para constituir uma única correspondência completa. Isso é necessário apenas para regras e não para pesquisa e painéis.
Definir seção de correspondência
As regras exigem que as variáveis de correspondência sejam marcadores definidos na seção event. Também é possível especificar campos event em "Pesquisa e painéis".
Use as variáveis de marcador de posição definidas na seção events para especificar o período em que os eventos precisam ocorrer. Os eventos correspondentes que ocorrem fora do período especificado são ignorados para esse grupo de detecção específico.
Use a palavra-chave over e a sintaxe <number><m/h/d> (em que m/h/d é minutos, horas e dias) para especificar a janela de tempo. É possível especificar um mínimo de um minuto e um máximo de 48 horas.
Esta regra de exemplo detecta falhas de login que ocorrem em uma janela de 10 minutos. A correlação de vários logins com falha em um curto período geralmente indica uma tentativa de acesso não autorizado ou de força bruta.
rule failed_logins
{
meta:
author = "Security Team"
description = "Detects multiple failed user logins within 10-minute windows."
severity = "HIGH"
events:
$e.metadata.event_type = "USER_LOGIN"
$e.security_result.action = "FAIL"
$user = $e.target.user.userid
match:
$user over 10m
condition:
#e >= 5
}
A seção match encontra usuários com falha no login em um novo local em um intervalo de 10 minutos:
match:
$user over 10m
Valores zero na seção de correspondência
O Google SecOps filtra implicitamente os valores zero para todos os marcadores de posição usados na seção match ("" para string, 0 para números, false para booleanos e o valor na posição 0 para tipos enumerados).
Exemplo: filtrar valores zero
O exemplo a seguir ilustra consultas que filtram os valores zero.
rule ZeroValuePlaceholderExample {
meta:
events:
// Because $host is used in the match section, the query behaves
// as if the following predicate was added to the events section:
// $host != ""
$host = $e.principal.hostname
// Because $otherPlaceholder was not used in the match,
// there is no implicit filtering of zero values for $otherPlaceholder.
$otherPlaceholder = $e.principal.ip
match:
$host over 5m
condition:
$e
}No entanto, se um marcador de posição for atribuído a uma função, as consultas não filtrarão implicitamente os valores zero dos marcadores de posição usados na seção match.
Para desativar a filtragem implícita de valores zero, use a opção allow_zero_values na seção de opções. A opção allow_zero_values está disponível apenas em "Regras".
Exemplo: permitir valores zero
O exemplo a seguir ilustra consultas que não filtram implicitamente os valores zero de marcadores usados na seção match:
rule ZeroValueFunctionPlaceholder {
meta:
events:
// Even though $ph is used in the match section, there is no
// implicit filtering of zero values for $ph, because $ph is assigned to a function.
$ph = re.capture($e.principal.hostname, "some-regex")
match:
$ph over 5m
condition:
$e
}Janelas de tempo compatíveis
É possível agrupar campos de eventos e marcadores de posição na seção match por uma granularidade de tempo especificada usando uma das seguintes janelas compatíveis.
- Janelas de salto (janelas sobrepostas)
- Janelas em cascata (janelas não sobrepostas)
- Janelas deslizantes (geradas por pivôs)
Janelas de salto
Uma janela de salto é um tipo de consulta de vários eventos que agrupa eventos correspondentes aos critérios de uma consulta em um período especificado, independente da ordem em que ocorrem. Por padrão, as consultas da YARA-L com uma seção match usam janelas de salto para correlacionar vários eventos ao longo do tempo. O período de execução da consulta é dividido em um conjunto de janelas de salto sobrepostas, cada uma com a duração especificada na seção match. Em seguida, os eventos são correlacionados em cada janela de transmissão.
Por exemplo, para uma consulta executada no intervalo de tempo [1:00, 2:00], com uma seção match em 30m, um possível conjunto de janelas de salto sobrepostas que podem ser geradas é [1:00, 1:30], [1:03, 1:33] e [1:06, 1:36].
Essas janelas são usadas para correlacionar vários eventos.
Janelas em cascata
Uma janela em cascata segmenta um fluxo de dados em intervalos de tempo de tamanho fixo, contínuos e sem sobreposição. Cada evento de dados é atribuído a apenas uma janela. Isso é diferente de uma janela deslizante ou de salto, que pode ter intervalos de tempo sobrepostos.
Por exemplo, com uma janela rotativa de 30 minutos, os eventos que ocorrem entre 1:00:00 e 1:29:59 são processados juntos. Em seguida, o próximo conjunto de eventos, de 1:30:00 a 1:59:59, é processado separadamente.
Janelas deslizantes
Quando você precisa pesquisar eventos que ocorrem em uma ordem específica e relativa (por exemplo, e1 ocorre até dois minutos depois de e2), as janelas deslizantes são muito eficazes. As janelas deslizantes são geradas quando uma restrição de tempo começa ou termina com uma variável de evento de pivô especificada. Isso rastreia dinamicamente a sequência e o tempo do evento em relação a essa variável de evento de pivô específica.
Em seguida, os eventos são correlacionados em cada janela deslizante. Isso permite pesquisar eventos que acontecem em uma ordem específica (por exemplo, e1 acontece em até 2 minutos após e2). Uma ocorrência do evento e1 e uma ocorrência do evento e2 são correlacionadas se o evento e1 ocorrer dentro da duração da janela deslizante após o evento e2.
- As janelas deslizantes são baseadas na variável de evento de pivô (
pivot-event-var). - Use a palavra-chave
beforepara gerar janelas deslizantes que terminam com cada ocorrência do evento de pivô. - Use a palavra-chave
afterpara gerar janelas deslizantes que começam com cada ocorrência do evento de pivô.
Especifique janelas deslizantes na seção match de uma consulta da seguinte maneira:
<match-var-1>, <match-var-2>, ... over <duration> before|after <pivot-event-var>
Confira a seguir exemplos de janelas deslizantes válidas:
$var1, $var2 over 5m after $e1
$user over 1h before $e2
Observações:
- Outro exemplo de janela deslizante.
O uso de janelas deslizantes em vez de janelas de salto pode resultar em uma performance mais lenta. Recomendamos o uso de janelas deslizantes apenas para casos específicos, como quando a ordem dos eventos é absolutamente necessária ou quando se procura a não existência de eventos.
Como as janelas deslizantes são projetadas para detectar vários eventos, recomendamos que você não as use em consultas de evento único. Em vez disso, use uma das seguintes soluções alternativas:
- Converta a consulta para usar várias variáveis de evento e atualize a seção de condição se a consulta exigir mais de uma ocorrência do evento.
- Se quiser, adicione filtros de carimbo de data/hora em vez de usar uma janela deslizante. Por exemplo:
$permission_change.metadata.event_timestamp.seconds < $file_creation.metadata.event_timestamp.seconds - Remova a janela deslizante.
A seguir
Informações adicionais
- Expressões, operadores e construções usados na YARA-L 2.0
- Funções na YARA-L 2.0
- Criar regras de detecção compostas
- Exemplos: consultas da YARA-L 2.0
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.