Correlacionar dados com junções externas
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
matchprecisa 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 5mEvent-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.hostnameEntidade 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.hostnameEvent-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
matchprecisa 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
$hostrecebe o valor de$e2.principal.hostname. A junção externa à direita garante a presença do evento$e2, fazendo com que a variável$hostseja 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 5mEntidade-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 5mDatatable-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.hostnameEntidade-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.hostnameDatatable-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.