Aplicar junções em pesquisas e painéis
As junções ajudam a correlacionar dados de várias fontes para fornecer mais contexto para uma investigação. Ao vincular eventos, entidades e outros dados relacionados, é possível investigar cenários de ataques complexos e visualizar tendências.
Este documento explica como usar a operação de junção no campo Pesquisa e nos painéis do painel do Google SecOps. Ele aborda os tipos de junção compatíveis, os casos de uso e as práticas recomendadas.
Principais conceitos de junções
Para criar uma junção, conecte fontes de dados usando variáveis de marcador de posição compartilhadas ou instruções de igualdade explícitas (por exemplo, $e1.hostname = $e2.hostname). Ao definir uma junção na seção match de uma consulta baseada em estatísticas, use variáveis de marcador de posição.
Os exemplos a seguir mostram como vincular fontes de dados usando dois campos com um sinal de igual (=) e uma variável de marcador de posição compartilhada.
Exemplo 1: junção implícita usando variáveis de marcador
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 $e2Exemplo 2: junção explícita usando igualdade e marcadores de posição
$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
Junções na pesquisa
Os exemplos nesta seção demonstram a sintaxe usada na Pesquisa.
Por padrão, as consultas na Pesquisa não diferenciam maiúsculas de minúsculas.
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_LOGINa 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 ECG
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_CONNECTIONe umASSETdo 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 e tabela de dados conecta eventos do 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 ou agentes de ameaças conhecidos. A consulta de exemplo a seguir une eventos
NETWORK_CONNECTIONcom 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
Usar a cláusula IN com tabelas de dados
Também é possível usar a cláusula in para verificar se um valor de campo existe em uma coluna da tabela de dados. Essa sintaxe é compatível com todas as fontes de dados (por exemplo, ioc.type in %abc.type) e oferece uma maneira conveniente de filtrar eventos com base em listas de referência sem definir variáveis de marcador de posição explícitas para a junção.
Casos de uso comuns
Esta seção lista algumas maneiras comuns de usar junções.
Detectar roubo e uso de credenciais
Objetivo: encontrar instâncias em que um usuário faz login com sucesso e depois exclui rapidamente um arquivo crítico do sistema. Isso pode sugerir um sequestro de conta ou atividade interna maliciosa.
Tipo de junção: junção de evento com evento
Descrição: essa 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.
Consulta de detecção de roubo de credenciais
// 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 da 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 ECG
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.
Consulta de conexões arriscadas
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 agente de ameaças específico.
Tipo de junção: junção de tabela de dados e evento
Descrição: sua equipe de inteligência contra 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. Ela mostra imediatamente qualquer instância em que um host na sua rede tenta resolver um domínio da sua lista de inteligência contra ameaças.
Consulta de busca de IOCs de agentes de ameaças
// Datatable: Get the list of malicious domains $domain = %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
Junções em painéis
Os painéis oferecem suporte a uma variedade maior de fontes de dados e janelas de correlação mais longas do que na Pesquisa. Ao contrário das consultas SQL padrão, a YARA-L 2.0 não usa instruções JOIN explícitas. Em vez disso, ela conecta fontes de dados correlacionando variáveis de marcador de posição compartilhadas ou usando consultas de várias etapas.
Diferenciação entre maiúsculas e minúsculas
As consultas do painel diferenciam maiúsculas de minúsculas. Para fazer uma junção ou pesquisa sem diferenciação de maiúsculas e minúsculas em um painel, use o modificador nocase.
Fontes de dados compatíveis
Nos painéis, é possível unir dados de combinações compatíveis de fontes de dados. Nem todas as combinações de fontes de dados podem ser unidas em uma única consulta.
Toda referência de dados em uma consulta de painel de vários origens precisa incluir o qualificador de prefixo YARA-L (por exemplo, $u1), não apenas os campos unidos. Isso permite que o sistema identifique corretamente a propriedade do campo em fontes de dados sobrepostas.
Combinações de junção compatíveis
As junções permitem correlacionar eventos da UDM, contexto de entidade e tabelas de dados em dashboards integrados. Para manter a performance do sistema, revise as combinações compatíveis e os limites técnicos nesta seção antes de criar suas consultas.
- Evento do UDM para evento do UDM (vários eventos)
- Evento da UDM para contexto da entidade
- Evento do UDM para tabela de dados
Histórico de caso a caso: essa combinação é estritamente limitada a exatamente uma fonte
casee uma fontecase_history. Não é possível incluir outras fontes de dados nessa junção.
Para informações sobre limites e proteções, consulte Limitações e restrições técnicas.
Exemplo: junção de caso e case_history
É possível correlacionar os metadados do caso com a atividade histórica usando o ID exclusivo do caso.
O exemplo a seguir une as fontes de dados
caseecase_historypara contar o número total de ações históricas de cada caso de alta prioridade.// 1. Establish the Join using a shared placeholder variable ($case_id) $h.case_history.case_response_platform_info.case_id = $case_id $c.case.response_platform_info.response_platform_id = $case_id // 2. Apply Filters $c.case.priority = "PRIORITY_HIGH" // 3. Group the correlated data by the Case ID match: $case_id // 4. Calculate the selected metrics to display on the dashboard outcome: $case_name = array_distinct($c.case.display_name) $total_historical_actions = count($h.case_history.case_activity)
Caso de uso avançado: cálculo do MTTR
Para métricas mais complexas, como tempo médio para resolução (MTTR) ou tempo médio para fechamento (MTTC), use uma consulta de várias etapas. Isso permite calcular a duração de cada caso individual na primeira etapa e, em seguida, calcular a média dessas durações globalmente no bloco de resultados finais.
A consulta a seguir calcula o tempo médio para fechar casos (em minutos) em todos os casos no "Ambiente padrão".
stage stage1 { // 1. Establish the Join $h.case_history.case_response_platform_info.case_id = $case_id $c.case.response_platform_info.response_platform_id = $case_id // 2. Filter by specific environment $c.case.environment = "Default Environment" // 3. Group by Case ID to process per case match: $case_id // 4. Calculate the Time to Close (TTC) for each case individually outcome: $case_close_time = max(if($h.case_history.case_activity = "CLOSE_CASE", $h.case_history.event_time.seconds, 0)) $status = array_distinct($h.case_history.case_activity) // Subtract the very first event time (creation) from the close time $TTC = $case_close_time - min($h.case_history.event_time.seconds) // 5. Filter to ensure the case has a complete lifecycle condition: arrays.contains($status, "CREATE_CASE") and arrays.contains($status, "CLOSE_CASE") } // 6. Global Aggregation: Calculate the Mean (Average) across all processed cases outcome: $case_count = count($stage1.case_id) $MTTC = (math.round(avg($stage1.TTC) / 60))
Práticas recomendadas
Para otimizar a performance das suas consultas de junção e garantir que elas sejam processadas de maneira eficiente, siga estas práticas recomendadas para filtrar eventos e gerenciar o escopo da pesquisa.
Use filtros específicos para reduzir o número de eventos
As consultas de junção podem consumir muitos recursos porque combinam vários resultados.
Filtros amplos e gerais podem causar falhas nas consultas, às vezes após um longo atraso. Por exemplo:
target.ip != ""metadata.event_type = "NETWORK_CONNECTION"(se esse tipo de evento for muito comum no seu ambiente)
Recomendamos combinar filtros gerais com mais específicos para reduzir o número total de eventos que a consulta precisa processar. Um filtro amplo como
target.ip != ""deve 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 e restrições técnicas
As limitações e os limites a seguir se aplicam ao usar junções na Pesquisa e nos painéis.
Janela de correspondência e limites de consulta
A janela de correspondência define o período específico em que os eventos são correlacionados. Isso é diferente do período da pesquisa selecionado na interface do usuário.
Limites na pesquisa
A pesquisa é otimizada para investigações rápidas ou em tempo real em períodos mais curtos.
| Limite de consulta | Uso |
|---|---|
| Até 48 horas (algumas consultas podem oferecer suporte a períodos mais longos). | Correlacionar eventos em investigações rápidas. |
Limites nos painéis
Os painéis oferecem suporte a análises históricas de longo prazo.
| Tipo de mesclagem | Limite de consulta | Uso |
|---|---|---|
| UDM para UDM e UDM para entidade | 31 dias | Consultas de telemetria de alto volume. |
| Case-to-CaseHistory | 90 dias | Consultas de rastreamento do ciclo de vida. |
| Outras configurações compatíveis | Até 365 dias | Substituição para fontes não UDM ou baseadas em métricas (por exemplo, métricas de ingestão). |
Limites de fontes de dados e tabelas
O número máximo de fontes de dados e tabelas que podem ser combinadas em uma única consulta depende de você estar usando a Pesquisa ou painéis.
Restrições de pesquisa
- É possível usar no máximo dois eventos de 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 unir uma tabela de dados diretamente a uma tabela de contexto de entidade. É necessário usar um evento da UDM como uma ponte intermediária (por exemplo, correlacionar
$event.target.hostnamecom$datatable.hostnamee$asset.graph.entity.asset.hostname).
Restrições do painel
| Tipo de mesclagem | Número máximo de tabelas de eventos (UDM ou tabela de dados) | Número máximo de tabelas de entidades |
|---|---|---|
| Vários eventos (UDM para UDM) | 2 | N/A |
| UDM para entidade | 2 | 1 |
| UDM para tabela de dados | 2 | N/A |
| Consultas de várias etapas | 2 | 1 |
Performance e proteções
O sistema monitora consultas de junção complexas para consumo excessivo de recursos. Para proteger o desempenho geral do ambiente, o sistema pode pausar ou isolar automaticamente consultas que excedam os limites de segurança de recursos.
Se uma consulta falhar ou retornar erros indicando que excedeu os limites de recursos, tente as seguintes otimizações:
- Diminua a janela de tempo da consulta.
- Adicione filtros mais específicos para reduzir o tamanho do conjunto de dados antes da junção.
- Simplifique suas agregações.
Restrições de tipo de consulta e API
- As junções são compatíveis com a interface do usuário e a API
EventService.UDMSearch, mas não com a APISearchService.UDMSearch.
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.