Regras de detecção compostas

Compatível com:

A detecção combinada no Google SecOps envolve a conexão de várias regras YARA-L. Este documento explica como criar uma regra composta. 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 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 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 UDM originais, 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 ambos:

  • 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

Você pode 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 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 por ID. O ID da regra pode ser encontrado no URL dela no Google SecOps. As regras geradas pelo usuário têm IDs no formato ru_UUID, enquanto as detecções selecionadas 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/"

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

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

Nesta seção, explicamos 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 regra.

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

Exemplo: combinar 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 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.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.