Usar junções na Pesquisa

Compatível com:

As junções ajudam a correlacionar dados de várias fontes para fornecer mais contexto a uma investigação. Ao vincular eventos, entidades e outros dados relacionados, é possível investigar cenários de ataques complexos.

Este documento explica como usar a operação de junção no Google Security Operations. Ele também aborda os tipos de junção compatíveis, casos de uso e práticas recomendadas.

Criar uma junção

Somente junções baseadas em estatísticas são aceitas. Você precisa defini-los na seção "match" de uma consulta com um período de correlação de até 48 horas. É possível criar uma junção conectando campos diretamente (por exemplo, $e1.hostname = $e2.hostname) ou usando variáveis de marcador de posição. Ao definir uma junção na seção match, use variáveis de marcador de posição.

O exemplo a seguir consulta dois campos com um sinal de igual (=) e uma variável de marcador de posição compartilhada:

Exemplo 1:


events:

  // Assign a value from the first event to the placeholder variable $user

  $user = $e1.principal.user.userid

  // The second assignment creates an implicit join, linking $e2 to $e1

  // where the user ID is the same.

  $user = $e2.principal.user.userid

match:

  $user over 1h

condition:

  $e1 and $e2

Exemplo 2:


$e1.principal.ip = $ip

$e1.metadata.event_type = "USER_LOGIN"

$e1.principal.hostname = $host

$e2.target.ip = $ip

$e2.principal.hostname = "altostrat"

$e2.target.hostname = $host

match:
  $ip, $host over 5m

Tipos de junção compatíveis

Esta seção descreve os diferentes tipos de junções que podem ser usadas.

Junção de evento a evento

Uma junção de evento a evento conecta dois eventos diferentes do Modelo de dados universal (UDM). A consulta de exemplo a seguir vincula um evento USER_LOGIN a outro para encontrar o nome do host (altostrat) com que o usuário interagiu, com base em um endereço IP comum:


$e1.principal.ip = $ip

$e1.metadata.event_type = "USER_LOGIN"

$e2.target.ip = $ip

$e2.principal.hostname = "altostrat"

match:

  $ip over 5m

Junção de evento e eletrocardiograma

Uma junção de evento e ECG conecta um evento da UDM a uma entidade do Entity Context Graph (ECG). A consulta de exemplo a seguir encontra um evento NETWORK_CONNECTION e um ASSET do gráfico de entidades que compartilham o mesmo nome de host em uma janela de uma hora:


events:

   $e1.metadata.event_type = "NETWORK_CONNECTION"

   $g1.graph.metadata.entity_type = "ASSET"

   $e1.principal.asset.hostname = $g1.graph.entity.asset.hostname

   $x = $g1.graph.entity.asset.hostname

match:

   $x over 1h

condition:

   $e1 and $g1

Junção de evento e tabela de dados

Uma junção de evento de tabela de dados conecta eventos da UDM a entradas em uma tabela de dados personalizada. Isso é útil para verificar dados de eventos ao vivo em relação a uma lista definida pelo usuário, como endereços IP maliciosos conhecidos ou agentes de ameaças. A consulta de exemplo a seguir une eventos NETWORK_CONNECTION com uma tabela de dados para encontrar conexões que envolvem endereços IP específicos dessa lista:


$ip = %DATATABLE_NAME.COLUMN_NAME

$ip = $e1.principal.ip

$e1.metadata.event_type = "NETWORK_CONNECTION"

match:

   $ip over 1h

Práticas recomendadas

As consultas de junção podem consumir muitos recursos porque combinam vários resultados. Filtros amplos e gerais podem fazer com que as consultas falhem, às vezes após um longo atraso. Por exemplo:

  • target.ip != null

  • metadata.event_type = "NETWORK_CONNECTION" (se esse tipo de evento for muito comum no seu ambiente)

Recomendamos combinar filtros gerais com outros mais específicos para reduzir o número total de eventos que a consulta precisa processar. Um filtro amplo como target.ip != null precisa ser combinado com filtros mais específicos para melhorar o desempenho da consulta. Por exemplo:

$e1.metadata.log_type = $log
$e1.metadata.event_type = "USER_LOGIN"
$e1.target.ip != ""

$e2.metadata.log_type = $log
$e2.principal.ip = "10.0.0.76"
$e2.target.hostname != "altostrat"

match:
$log over 5m

Se a consulta ainda estiver lenta, reduza o período geral dela (por exemplo, de 30 dias para uma semana).

Para mais informações, consulte Práticas recomendadas da YARA-L.

Limitações

As seguintes limitações se aplicam ao usar junções:

  • É possível usar no máximo dois eventos da UDM por consulta.

  • É possível usar no máximo um evento de ECG por consulta.

  • É possível usar no máximo duas tabelas de dados por consulta.

  • Não é possível combinar eventos de tabela de dados, UDM e ECG em uma única consulta.

  • O período máximo da consulta é de 90 dias.

  • O período máximo de match é de 48 horas.

  • As junções são compatíveis com a interface do usuário e a API EventService.UDMSearch, mas não com a API SearchService.UDMSearch.

Casos de uso comuns

Esta seção lista algumas maneiras comuns de usar junções.

Detectar roubo e uso de credenciais

Meta: encontrar instâncias em que um usuário faz login com êxito e depois exclui rapidamente um arquivo crítico do sistema. Isso pode sugerir uma invasão de conta ou atividade interna maliciosa.

Tipo de junção: junção de evento com evento

Descrição: esta consulta conecta dois eventos distintos que não são suspeitos por si só, mas se tornam altamente suspeitos quando ocorrem juntos. Primeiro, ele procura um evento USER_LOGIN e, depois, um evento FILE_DELETION. Eles são unidos pelo user.userid comum com uma janela de tempo curta.

Exemplo de consulta:


// Event 1: A user successfully logs in

$e1.metadata.event_type = "USER_LOGIN"

$e1.security_result.action = "ALLOW"

$e1.principal.user.userid = $user

// Event 2: The same user deletes a critical file

$e2.metadata.event_type = "FILE_DELETION"

$e2.target.file.full_path = /etc\/passwd|C:\\Windows\\System32\\/

$e2.principal.user.userid = $user

match:
  $user over 10m

condition:
  $e1 and $e2

Identificar conexões arriscadas de recursos essenciais

Objetivo: enriquecer os dados de rede em tempo real com informações de recursos para encontrar conexões de saída de servidores que não deveriam se comunicar com domínios externos de baixa prevalência (por exemplo, um servidor de banco de dados de produção).

Tipo de junção: junção de evento e eletrocardiograma

Descrição: uma única conexão de rede com um domínio raro pode não ser de alta prioridade. No entanto, essa consulta aumenta a importância do evento ao associá-lo ao gráfico de contexto de entidade (ECG, na sigla em inglês). Ele procura especificamente eventos NETWORK_CONNECTION que vêm de recursos rotulados como "Servidor de banco de dados crítico" no gráfico de entidades.

Exemplo de consulta:


events:
  $e.metadata.event_type = "NETWORK_CONNECTION"

  $e.target.domain.prevalence.day_count <= 5

  $asset.graph.metadata.entity_type = "ASSET"

  $asset.graph.entity.asset.labels.value = "Critical Database Server"

  $e.principal.asset.hostname = $asset.graph.entity.asset.hostname

  $host = $e.principal.asset.hostname

match:
  $host over 1h

condition:
  $e and $asset

Buscar IOCs de agentes de ameaças

Objetivo: pesquisar ativamente indicadores de comprometimento (IoCs) verificando todas as consultas DNS ativas em uma lista de domínios conhecidos por serem usados por um invasor específico.

Tipo de junção: junção de tabela de dados e evento

Descrição: sua equipe de inteligência de ameaças mantém uma tabela de dados chamada ThreatActor_Domains que lista domínios maliciosos. Essa consulta une todos os eventos NETWORK_DNS_QUERY em tempo real com essa tabela de dados. Ele mostra imediatamente qualquer instância em que um host na sua rede tenta resolver um domínio da sua lista de inteligência de ameaças.

Exemplo de consulta:


// Datatable: Get the list of malicious domains

$domain = $ip = %DATATABLE_NAME.COLUMN_NAME

// Event: A DNS query is made

$e.metadata.event_type = "NETWORK_DNS"

$e.network.dns.questions.name = $domain

match:
  $domain over 5m

condition:
  $e

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