Construir regras de detecção compostas
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_valpara acessar a variável de resultadodest_domain.detection.collection_elements.references.event.target.hostnamepara acessar o campo de UDMtarget.hostname.detection.time_window.start_time.secondspara 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_idpara 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 formatoru_UUID, enquanto as detecções especializadas têm IDs no formatour_UUID. Exemplo:detection.detection.rule_id = "ru_e0d3f371-6832-4d20-b0ad-1f4e234acb2b"Referenciar uma regra pelo nome:use o campo
detection.detection.rule_namepara 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:
- Uma regra composta tem janelas de salto de 60 minutos: salto 1 (18h58 às 19h58) e salto 2 (19h58 às 20h58).
- Uma detecção de produtor upstream tem uma janela de 19:57:54 a 20:56:54 (duração de 59 minutos).
- 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.
- 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,
$epara eventos,$dpara 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
matchcom 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.