Construir regras de detecção compostas

Compatível com:

Este documento é um guia técnico sobre como criar uma regra composta na plataforma Google Security Operations, um processo que envolve a conexão de várias regras YARA-L 2.0 para identificar padrões de ataque complexos. As detecções compostas são estruturadas como regras de múltiplos eventos, mantendo a mesma sintaxe fundamental das regras padrão de evento único. Para mais informações, consulte Visão geral das detecções compostas.

Entender a estrutura da regra

As regras de detecção compostas são sempre de múltiplos eventos e seguem a mesma estrutura e sintaxe de uma regra de evento único.

Uma regra composta tem os seguintes componentes essenciais:

  • Seção events: define suas entradas, ou seja, as detecções ou eventos específicos que a regra analisa.

  • Seção match: especifica como as entradas devem ser conectadas em um período definido.

  • Seção condition: contém a lógica final que determina se os eventos unidos atendem aos critérios para acionar um alerta.

Definir as entradas na seção events

A primeira etapa para criar uma regra de detecção composta é definir as entradas da regra na seção events. As entradas para regras compostas vêm de coleções, que armazenam as detecções geradas por outras consultas. O Google SecOps oferece os dois métodos a seguir para acessar dados de coleções.

Referenciar conteúdo de detecção com variáveis ou metarrótulos

Para acessar dados de uma detecção sem fazer referência aos eventos originais da UDM, use variáveis outcome, match ou rótulos meta. Recomendamos essa abordagem porque ela oferece mais flexibilidade e melhor compatibilidade entre diferentes tipos de regras.

Por exemplo, várias regras podem armazenar uma string (como um URL, nome de arquivo ou chave do registro) em uma variável outcome comum se você estiver procurando essa string em contextos diferentes. Para acessar essa string em uma regra combinada, comece com detection e localize as informações relevantes usando elementos do recurso de coleta.

Exemplo:suponha que uma regra de detecção produza as seguintes informações:

  • Variável de resultado: dest_domain = "cymbal.com"

  • Campo de UDM: target.hostname = "cymbal.com"

Na regra composta, é possível acessar esses dados usando os seguintes caminhos:

  • detection.detection.variables["dest_domain"].string_val para acessar a variável de resultado dest_domain.

  • detection.collection_elements.references.event.target.hostname para acessar o campo de UDM target.hostname.

  • detection.time_window.start_time.seconds para acessar o carimbo de data/hora de início da detecção.

A API Collection e a API SecurityResult dão acesso a:

  • Metadados de detecção e valores de resultado (detection.detection)
  • Eventos de UDM subjacentes de regras referenciadas (collection_elements)

Fazer referência a conteúdo de detecção com ID ou nome da regra

É possível fazer referência a uma regra pelo nome ou ID. Recomendamos essa abordagem quando a lógica de detecção depende de regras específicas e você quer reduzir a análise de dados apenas aos resultados dessas regras. Fazer referência a regras relevantes por nome ou ID melhora o desempenho e evita tempos limite, reduzindo os dados analisados. Por exemplo, é possível consultar diretamente campos como target.url ou principal.ip de uma detecção anterior conhecida.

  • Referenciar uma regra pelo ID (recomendado): use o campo detection.detection.rule_id para referenciar uma regra pelo ID. Você pode encontrar o ID da regra no URL dela no Google SecOps. As regras geradas pelo usuário têm IDs no formato ru_UUID, enquanto as detecções especializadas têm IDs no formato ur_UUID. Exemplo:

    detection.detection.rule_id = "ru_e0d3f371-6832-4d20-b0ad-1f4e234acb2b"

  • Referenciar uma regra pelo nome:use o campo detection.detection.rule_name para referenciar uma regra pelo nome. Você pode especificar o nome exato da regra ou usar uma expressão regular para corresponder a ela. Exemplo:

    • detection.detection.rule_name = "My Rule Name"
    • detection.detection.rule_name = "/PartOfName/"

Entradas de mesclagem na seção match

Para conectar detecções, eventos ou entidades relacionados em uma regra composta, defina a seção match usando variáveis definidas na seção events. Essas variáveis podem incluir rótulos de regras, variáveis de resultado, variáveis de correspondência, campos de detecção ou elementos de coleta.

Para mais informações sobre a sintaxe, consulte Sintaxe da seção de correspondência.

Regras compostas: intervalos de tempo e janelas de salto

As regras compostas correspondem a detecções e eventos em um intervalo de tempo, em vez de um único ponto no tempo. Eles correspondem a uma janela de salto composta se a janela de tempo de detecção de entrada se sobrepõe a essa janela de salto (por exemplo, a atividade estava ativa durante esse bloco de tempo).

Uma única detecção pode acionar vários alertas se ela abranger o limite entre janelas de salto adjacentes (devido a atrasos no pipeline, essas correspondências históricas aparecem mais tarde). Especificamente, uma janela de salto de regra composta aciona uma correspondência se a janela de tempo de detecção de entrada (WindowStart a WindowEnd) se sobrepõe à janela de salto.

Exemplo:

  1. Uma regra composta tem janelas de salto de 60 minutos: salto 1 (18h58 às 19h58) e salto 2 (19h58 às 20h58).
  2. Uma detecção de produtor upstream tem uma janela de 19:57:54 a 20:56:54 (duração de 59 minutos).
  3. Como a janela do produtor começou às 19:57:54 (6 segundos antes do fim do Hop 1) e terminou às 20:56:54 (durante o Hop 2), ela se sobrepõe às duas janelas de salto.
  4. Isso aciona duas detecções compostas (uma para o salto 1 e outra para o salto 2), ajudando a evitar falsos negativos. Se a regra do produtor não corresponder à sobreposição, a detecção parcialmente sobreposta não será considerada para o salto 1 ou 2, e a correlação entre a detecção e outros eventos será perdida.

Para mais informações e exemplos de como especificar janelas de salto, consulte Janelas de salto.

Definir seção condition

Defina a seção condition para avaliar os resultados da seção match. Se a condição for true, um alerta será gerado. Para informações sobre a sintaxe, consulte Sintaxe da seção de condição.

Aplicar técnicas avançadas a regras compostas

Esta seção explica como aplicar técnicas avançadas ao criar regras compostas.

Combinar eventos e detecções

As regras compostas podem combinar várias fontes de dados, incluindo eventos de UDM, dados de gráfico de entidade e campos de detecção. As seguintes diretrizes se aplicam:

  • Use variáveis distintas por fonte: atribua variáveis de evento exclusivas a cada fonte de dados (por exemplo, $e para eventos, $d para detecções), em que a fonte de dados inclui eventos, entidades e detecções.

  • Unir fontes em um contexto compartilhado: conecte fontes de dados usando valores comuns, como IDs do usuário, endereços IP ou nomes de domínio nas condições da regra.

  • Defina uma janela de correspondência: sempre inclua uma cláusula match com uma janela de tempo de até 48 horas.

Exemplo: combinação de eventos e detecções

rule CheckCuratedDetection_with_EDR_and_EG {
  meta:
    author = "noone@cymbal.com"
  events:
    $d.detection.detection.rule_name = /SCC: Custom Modules: Configurable Bad Domain/
    $d.detection.collection_elements.references.event.network.dns.questions.name = $domain
    $d.detection.collection_elements.references.event.principal.asset.hostname = $hostname

    $e.metadata.log_type = "LIMACHARLIE_EDR"
    $e.metadata.product_event_type = "NETWORK_CONNECTIONS"
    $domain = re.capture($e.principal.process.command_line, "\\s([a-zA-Z0-9.-]+\\.[a-zA-Z0-9.-]+)$")
    $hostname = re.capture($e.principal.hostname, "([^.]*)")

    $prevalence.graph.metadata.entity_type = "DOMAIN_NAME"
    $prevalence.graph.metadata.source_type = "DERIVED_CONTEXT"
    $prevalence.graph.entity.hostname = $domain
    $prevalence.graph.entity.domain.prevalence.day_count = 10
    $prevalence.graph.entity.domain.prevalence.rolling_max <= 5
    $prevalence.graph.entity.domain.prevalence.rolling_max > 0

  match:
    $hostname over 1h

  outcome:
    $risk_score = 80
    $CL_target = array($domain)

  condition:
    $e and $d and $prevalence
}

Criar detecções compostas sequenciais

As detecções compostas sequenciais identificam padrões de eventos relacionados em que a sequência de detecções é importante, como uma tentativa de login por força bruta seguida de um login bem-sucedido. Esses padrões podem combinar várias detecções de base, eventos brutos do UDM ou ambos.

Para criar uma detecção composta sequencial, é necessário impor essa ordem na regra. Para aplicar a sequência esperada, use um dos seguintes métodos:

  • Janelas deslizantes:defina a sequência de detecções usando janelas deslizantes nas condições match.

  • Comparações de carimbos de data/hora:compare os carimbos de data/hora das detecções na lógica da regra para verificar se elas ocorrem na ordem selecionada.

Exemplo: detecções compostas sequenciais

events:
    $d1.detection.detection.rule_name = "fileEvent_rule"
    $userid = $d1.detection.detection.variables["user"].string_val
    $hostname = $d1.detection.detection.variables["hostname"].string_val

    $d2.detection.detection.rule_name = "processExecution_rule"
    $userid = $d2.detection.detection.variables["user"].string_val
    $hostname = $d2.detection.detection.variables["hostname"].string_val

    $d3.detection.detection.rule_name = "networkEvent_rule"
    $userid = $d3.detection.detection.variables["user"].string_val
    $hostname = $d3.detection.detection.variables["hostname"].string_val

$d3.detection.collection_elements.references.event.metadata.event_timestamp.seconds > $d2.detection.collection_elements.references.event.metadata.event_timestamp.seconds

  match:
    $userid over 24h after $d1

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