Use a sintaxe N OF com variáveis de eventos

Suportado em:

Este documento explica como usar a sintaxe N OF para escrever lógica flexível e condicional na secção condition da sua consulta.

A sintaxe N OF permite-lhe combinar várias condições, reduzindo a complexidade geral da sintaxe da consulta:

  • Oferece uma forma de especificar que um número mínimo de expressões booleanas de uma determinada lista tem de ser avaliado como verdadeiro.
  • Evita a necessidade de especificar todas as combinações possíveis, reduzindo os erros e o esforço.

Sintaxe N OF

A sintaxe de uma declaração N OF é uma lista separada por vírgulas de expressões booleanas expressas da seguinte forma:

[expr1, expr2, … , exprN] em que [expr1, expr2, … , exprN]

As secções seguintes mostram algumas variações da sintaxe N DE.

QUALQUER UM DE

O exemplo seguinte verifica se, pelo menos, uma expressão na lista é verdadeira. Isto é o mesmo que juntar todas as expressões com or.

condition:
  ANY OF [$e1, #e2 > 5, $outcome1 = "FAILED"]

TODOS OS

Se todas as expressões na lista seguinte forem verdadeiras, o exemplo é verdadeiro. Isto é o mesmo que juntar todas as expressões com and.

condition:
  ALL OF [$e1, $e2, $outcome1 = "SUCCESS"]

N de X

Esta condição é avaliada como verdadeira se, pelo menos, N expressões da lista forem verdadeiras.

condition:
  2 of [$e1, $e2 > 0, $e3, arrays.contains($outcome_ips, "1.2.3.4")]

Regra de exemplo: sinalizar acesso a ficheiros confidenciais

A regra seguinte marca um utilizador se este iniciar sessão com êxito ($e1). Em seguida, a regra verifica se a sessão também cumpre um de dois critérios: um ficheiro confidencial é acedido ($e2) ou o número total de ficheiros confidenciais únicos acedidos excede 3.

rule MultiEventNOf {
  meta:
    author = "google-secops"
    description = "Detects user login followed by sensitive file access or multiple sensitive files."
  events:
    $e1.principal.user.userid = $user
    $e1.metadata.event_type = "USER_LOGIN"

    $e2.principal.user.userid = $user
    $e2.metadata.event_type = "FILE_OPEN"
    re.regex($e2.target.file.full_path, `^/cns/sensitive/`)

  match:
    $user over 1h
  outcome:
    $sensitive_file_count = count_distinct($e2.target.file.full_path)
  condition:
    $e1 and ANY OF [$e2, $sensitive_file_count > 3]
  }

Exemplo de pesquisa: sinalizar acesso a ficheiros confidenciais

O exemplo seguinte mostra como pode reformatar a regra de exemplo como uma consulta de pesquisa.

$e1.principal.user.userid = $user
$e1.metadata.event_type = "USER_LOGIN"
$e2.principal.user.userid = $user
$e2.metadata.event_type = "FILE_OPEN"
re.regex($e2.target.file.full_path, `^/cns/sensitive/`)

match:
  $user over 1h
outcome:
  $sensitive_file_count = count_distinct($e2.target.file.full_path)
condition:
  $e1 and ANY OF [$e2, $sensitive_file_count > 3]

Limitações conhecidas

  • Existência de eventos obrigatória: as expressões da sintaxe N OF não podem ser ilimitadas. A existência do evento tem de ser um requisito para que a cláusula seja verdadeira (por exemplo, $e1 ou #e1 > 0).

  • Mistura de tipos de variáveis: não pode combinar variáveis não UDM com variáveis de eventos UDM na mesma lista N DE.

  • Restrição de janelas: não pode usar janelas de rolamento com a sintaxe N OF.

O que se segue?

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