Construir regras de detecção compostas

Compatível com:

Este documento fornece um guia técnico sobre como criar uma regra composta na plataforma Google Security Operations, um processo que envolve conectar várias regras YARA-L 2.0 para identificar padrões de ataque complexos. As detecções compostas são estruturadas como regras de vários 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 regras de vários eventos e seguem a mesma estrutura e sintaxe de uma regra de evento único.

Uma regra combinada tem os seguintes componentes essenciais:

  • Seção events: define as 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 na criação de 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 metaró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 de 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 combinada, é possível acessar esses dados usando os seguintes caminhos:

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

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

  • 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 oferecem acesso a:

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

Referenciar 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 os dados analisados apenas aos resultados dessas regras. Referenciar regras relevantes por nome ou ID melhora a performance 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 por ID (recomendado): use o campo detection.detection.rule_id para referenciar uma regra por 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 por nome:use o campo detection.detection.rule_name para referenciar uma regra por nome. É possível 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/"

Mesclar entradas na seção match

Para conectar detecções, eventos ou entidades relacionadas 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 informações sobre a sintaxe, consulte Sintaxe da seção de correspondência.

Regras compostas: intervalos de tempo e janelas de transmissão

As regras compostas correspondem a detecções e eventos em um intervalo de tempo, em vez de um único ponto no tempo. Elas 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 período).

Uma única detecção pode acionar vários alertas se 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 - 19h58) e salto 2 (19h58 - 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 hop.
  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 de sobreposição parcial 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 a 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 do UDM, dados do gráfico de entidades 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 de usuário, endereços IP ou nomes de domínio nas condições da sua 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 básicas, eventos UDM brutos ou ambos.

Para criar uma detecção composta sequencial, é necessário aplicar 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.outcomes["user"]
    $hostname = $d1.detection.detection.outcomes["hostname"]

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

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

$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.