Correlacionar dados com junções externas

Compatível com:

Neste documento, descrevemos as junções externas (junção à esquerda e à direita). As operações de junção são usadas para correlacionar e combinar dados de várias fontes com base em valores de campo comuns. Ao combinar eventos e entidades de segurança relacionados em uma única visualização abrangente, você pode oferecer detecção e investigação de ameaças eficazes.

Ao contrário das junções padrão (internas), que exigem entradas correspondentes nas duas fontes de dados, uma junção externa recupera todos os registros de um lado da junção, mesmo que não haja entradas correspondentes no outro. Os campos não correspondentes do outro lado geralmente são preenchidos com null. Isso evita que você perca dados que não têm uma correspondência.

Como as junções externas funcionam

O conceito de junções externas no YARA-L 2.0 é idêntico às junções externas SQL padrão:

  • A left outer join preserva todos os registros do lado esquerdo da mesclagem.

  • A right outer join preserva todos os registros do lado direito da mesclagem.

A sintaxe de junção externa (left join e right join) é compatível com todas as consultas, com e sem uma condição match.

Entender a mesclagem externa à esquerda

Uma mesclagem externa à esquerda (ou mesclagem à esquerda) preserva todos os registros da fonte de dados no lado esquerdo da palavra-chave left join.

  • Se um registro do lado esquerdo não tiver correspondência no evento direito, os campos do evento à direita serão retornados como null.

  • Implicação do marcador de posição: qualquer variável de marcador de posição usada na seção match precisa fazer referência a um campo do evento à esquerda para garantir uma agregação de dados precisa em todo o conjunto de resultados.

Exemplo de junção à esquerda de evento para evento

O exemplo a seguir demonstra uma junção externa à esquerda para correlacionar eventos de login do usuário com eventos de conexão de rede subsequentes que ocorrem no mesmo host. A junção à esquerda garante que todos os eventos USER_LOGIN sejam preservados no conjunto de resultados. Se um evento NETWORK_CONNECTION correspondente ($e2) for encontrado, os dados dele serão combinados. Se nenhuma correspondência for encontrada, os campos de $e2 serão null.


$e1.metadata.event_type = "USER_LOGIN"
$e2.metadata.event_type = "NETWORK_CONNECTION"
left join $e1.principal.hostname = $e2.principal.hostname

Definir o evento à esquerda

O exemplo de consulta a seguir define o lado esquerdo da junção ($e1), que é o conjunto de eventos preservado no resultado final:

$e1.metadata.event_type = "USER_LOGIN"

A tabela a seguir representa o resultado da consulta, identificando o conjunto inicial de eventos de login do usuário:

Tipo de evento Nome do host principal Endereço IP
USER_LOGIN workstation-01 192.168.1.101
USER_LOGIN laptop-hr-02 192.168.1.102
USER_LOGIN server-db-03 10.0.0.50
USER_LOGIN kiosk-4 192.168.1.104

Definir o evento certo

O exemplo de consulta a seguir define o lado direito da junção ($e2), que é o conjunto de eventos correspondente aos eventos à esquerda:

$e2.metadata.event_type = "NETWORK_CONNECTION"

A tabela a seguir representa o conjunto de eventos de conexão de rede disponíveis para correspondência:

Tipo de evento Nome do host principal Endereço IP
NETWORK_CONNECTION workstation-01 192.168.1.101
NETWORK_CONNECTION laptop-hr-02 192.168.1.101
NETWORK_CONNECTION kiosk-4 203.0.113.3

Participe dos eventos

com uma seção de correspondência

O exemplo a seguir demonstra uma consulta de correspondência usando uma junção externa à esquerda no campo principal.hostname:


  $e1.metadata.event_type = "USER_LOGIN"

  $e2.metadata.event_type = "NETWORK_CONNECTION"

  left join $e1.principal.hostname = $e2.principal.hostname

  $host = $e1.principal.hostname

  match:
    $host over 5m

  • A junção externa à esquerda garante que todos os eventos USER_LOGIN ($e1) sejam incluídos no conjunto de resultados final.

  • O marcador $host recebe o valor de $e1.principal.hostname. A junção externa à esquerda garante a presença do evento $e1, garantindo que a variável $host seja sempre preenchida para agregação.

  • A regra agrega os resultados pelo host em uma janela de tempo de cinco minutos.

Resultado da junção

Os dados resultantes mostram a combinação dos dois eventos. Todos os registros da tabela à esquerda ($e1) são mantidos, e os campos da tabela à direita ($e2) são definidos como null quando nenhum nome de host correspondente é encontrado (por exemplo, para server-db-03).

Tipo de evento ($e1) Nome do host principal ($host) Endereço IP ($e1) Tipo de evento ($e2) Endereço IP ($e2) Status da correspondência
USER_LOGIN workstation-01 192.168.1.101 NETWORK_CONNECTION 192.168.1.101 Correspondência encontrada
USER_LOGIN laptop-hr-02 192.168.1.102 NETWORK_CONNECTION 192.168.1.101 Correspondência encontrada
USER_LOGIN server-db-03 10.0.0.50 null null Nenhuma correspondência
USER_LOGIN kiosk-4 192.168.1.104 NETWORK_CONNECTION 203.0.113.3 Correspondência encontrada

Exemplo de consultas de junção à esquerda

Nesta seção, apresentamos exemplos de consultas de junção à esquerda.

Faz junções com uma condição de correspondência

  • Entidade de evento

    
    $e1.metadata.event_type = "NETWORK_CONNECTION"
    $g1.graph.metadata.entity_type = "ASSET"
    left join $e1.principal.asset.hostname = $g1.graph.entity.asset.hostname
    $host = $e1.principal.asset.hostname
    
    match:
      $host over 5m
    
    
  • Event-datatable

    
    $host = $e1.principal.hostname
    left join $e1.principal.hostname = %all_dt_column_types.hostname
    
    match:
      $host by 5m
    

Junções sem uma condição de correspondência

  • Evento-evento

    
    $e1.metadata.event_type = "USER_LOGIN"
    $e1.principal.ip = "114.241.96.87"
    $e2.metadata.event_type = "NETWORK_CONNECTION"
    left join $e1.principal.hostname = $e2.principal.hostname
    
    
  • Entidade de evento

    
    $e1.metadata.event_type = "NETWORK_CONNECTION"
    $g1.graph.metadata.entity_type = "ASSET"
    left join $e1.principal.asset.hostname = $g1.graph.entity.asset.hostname
    $host = $e1.principal.asset.hostname
    
    
  • Event-datatable

    
    $host = $e1.principal.hostname
    left join $e1.principal.hostname = %all_dt_column_types.hostname
    
    

Mesclagem externa à direita

Uma mesclagem externa à direita (ou mesclagem à direita) preserva todos os registros da fonte de dados no lado direito da palavra-chave right join.

  • Se um registro do evento à direita não tiver correspondência no evento à esquerda, os campos do evento à esquerda serão retornados como null.

  • Implicação do marcador de posição:qualquer variável de marcador de posição usada na seção match precisa fazer referência a um campo do evento certo para garantir a agregação precisa de dados em todo o conjunto de resultados.

Exemplo de junção à direita de evento para evento

O exemplo a seguir demonstra um right outer join para correlacionar eventos de login do usuário com eventos de conexão de rede subsequentes que ocorrem no mesmo host. O right join garante que todos os eventos NETWORK_CONNECTION sejam preservados no conjunto de resultados. Se um evento USER_LOGIN correspondente for encontrado, os dados dele serão combinados. Se nenhuma correspondência for encontrada, os campos de $e1 serão null.


$e1.metadata.event_type = "USER_LOGIN"

$e2.metadata.event_type = "NETWORK_CONNECTION"

right join $e1.principal.hostname = $e2.principal.hostname

Definir evento à esquerda

A consulta a seguir define o lado esquerdo da junção ($e1), que é o conjunto de eventos opcional no resultado final:


$e1.metadata.event_type = "USER_LOGIN"

A tabela a seguir representa o resultado da consulta, identificando o conjunto inicial de eventos de login do usuário:

Tipo de evento Nome do host principal Endereço IP
USER_LOGIN workstation-01 192.168.1.101
USER_LOGIN laptop-hr-02 192.168.1.102
USER_LOGIN server-db-03 10.0.0.50

Definir o evento certo

A consulta a seguir define o lado direito da junção ($e2), que é o conjunto de eventos preservado no resultado final.


$e2.metadata.event_type = "NETWORK_CONNECTION"

A tabela a seguir representa o conjunto de eventos de conexão de rede disponíveis para correspondência.

Tipo de evento Nome do host principal Endereço IP
NETWORK_CONNECTION workstation-01 192.168.1.101
NETWORK_CONNECTION laptop-hr-02 192.168.1.101
NETWORK_CONNECTION vm-unauth-05 203.0.113.3

Participe dos eventos

O exemplo a seguir mostra uma consulta de correspondência com uma junção externa à direita no campo principal.hostname:


$e1.metadata.event_type = "USER_LOGIN"

$e2.metadata.event_type = "NETWORK_CONNECTION"

right join $e1.principal.hostname = $e2.principal.hostname

$host = $e1.principal.hostname

match:
  $host over 5m

  • A junção externa à direita garante que todos os eventos NETWORK_CONNECTION ($e2) sejam incluídos no conjunto de resultados final.

  • O marcador $host recebe o valor de $e2.principal.hostname. A junção externa à direita garante a presença do evento $e2, fazendo com que a variável $host seja sempre preenchida para agregação.

  • A regra agrega os resultados pelo host em uma janela de tempo de cinco minutos.

Resultado da junção

O conjunto de dados resultante mostra a combinação dos dois eventos. Todos os registros da tabela à direita ($e2) são mantidos, e os campos da tabela à esquerda ($e1) são definidos como nulos quando nenhum nome de host correspondente é encontrado (por exemplo, vm-unauth-05).

Tipo de evento ($e1) Nome do host principal ($e1) Endereço IP ($e1) Tipo de evento ($e2) Nome do host principal ($host) Endereço IP ($e2) Status da correspondência
USER_LOGIN workstation-01 192.168.1.101 NETWORK_CONNECTION workstation-01 192.168.1.101 Correspondência encontrada
USER_LOGIN laptop-hr-02 192.168.1.102 NETWORK_CONNECTION laptop-hr-02 192.168.1.101 Correspondência encontrada
null null null NETWORK_CONNECTION vm-unauth-05 203.0.113.4 Nenhuma correspondência

Exemplo de consultas de junção à direita

Nesta seção, fornecemos exemplos de consultas de junção à direita.

Faz junções com uma condição de correspondência

  • Evento-evento

    
    $e1.metadata.event_type = "USER_LOGIN"
    
    $e2.metadata.event_type = "NETWORK_CONNECTION"
    
    right join $e1.principal.hostname = $e2.principal.hostname
    
    $host = $e2.principal.hostname
    
    match:
      $host over 5m
    
    
  • Entidade-evento

    
    $e1.metadata.event_type = "NETWORK_CONNECTION"
    
    $g1.graph.metadata.entity_type = "ASSET"
    
    right join $g1.graph.entity.asset.hostname = $e1.principal.asset.hostname
    
    $host = $e1.principal.asset.hostname
    
    match:
      $host over 5m
    
    
  • Datatable-event

    
    $host = $e1.principal.hostname
    
    right join %all_dt_column_types.hostname = $e1.principal.hostname
    
    match:
      $host by 5m
    
    

Junções sem uma condição de correspondência

  • Evento-evento

    
    $e1.metadata.event_type = "USER_LOGIN"
    
    $e1.principal.ip = "114.241.96.87"
    
    $e2.metadata.event_type = "NETWORK_CONNECTION"
    
    right join $e1.principal.hostname = $e2.principal.hostname
    
    
  • Entidade-evento

    
    $e1.metadata.event_type = "NETWORK_CONNECTION"
    
    $g1.graph.metadata.entity_type = "ASSET"
    
    right join $g1.graph.entity.asset.hostname = $e1.principal.asset.hostname
    
    $host = $e1.principal.asset.hostname
    
    
  • Datatable-event

    
    $host = $e1.principal.hostname
    
    right join %all_dt_column_types.hostname = $e1.principal.hostname
    
    

Limitações

Considere as seguintes limitações ao criar junções externas:

  • Uma junção externa completa (junção à esquerda e à direita juntas) não é compatível.

  • O período da consulta para junções sem correspondência é limitado a no máximo 14 dias.

  • Não é possível unir diretamente duas fontes contextuais (por exemplo, uma entidade diretamente a uma tabela de dados).

  • O evento principal do Modelo de dados unificado (UDM) precisa ser o lado preservado da junção externa. A consulta será inválida se o evento principal estiver no lado "nullable".

    • Uma junção de evento e entidade precisa ser uma junção à esquerda. Isso preserva corretamente o evento ($e1).

    • Uma junção de entidade-evento precisa ser uma junção à direita. Isso preserva corretamente o evento ($e1).

    O exemplo a seguir é inválido porque o evento da UDM ($e1) está à esquerda, mas a junção à direita preserva o lado direito ($g1), o que viola a regra de que o evento da UDM precisa ser preservado:

    
    // Invalid query
    $e1.metadata.event_type = "NETWORK_CONNECTION"
    $g1.graph.metadata.entity_type = "ASSET"
    right join $e1.principal.asset.hostname = $g1.graph.entity.asset.hostname
    
    

Práticas recomendadas

Para evitar lentidão e tempos limite de consulta em consultas de junção externa, use filtros específicos e restritos.

Por exemplo, uma consulta ampla como esta:


$e1.metadata.event_type = "USER_LOGIN"
$e2.metadata.event_type = "NETWORK_CONNECTION"
right join $e1.principal.hostname = $e2.principal.hostname

Pode ser otimizado adicionando critérios específicos, como:


$e1.metadata.event_type = "USER_LOGIN"
$e1.principal.ip = "121.121.121.121"
$e1.principal.user.userid = "alex"
$e2.metadata.event_type = "NETWORK_CONNECTION"
$e2.src.hostname = "altostrat.com"
$e1.principal.hostname = $e2.principal.hostname

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