Regras de detecção compostas
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 resultadodest_domain.detection.collection_elements.references.event.target.hostnamepara acessar o campotarget.hostnameda UDM.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 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_idpara 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 formatoru_UUID, enquanto as detecções selecionadas têm IDs no formatour_UUID. Exemplo:detection.detection.rule_id = "ru_e0d3f371-6832-4d20-b0ad-1f4e234acb2b"Referenciar uma regra por nome:use o campo
detection.detection.rule_namepara 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,
$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 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
matchcom 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.