KQL

KQL – Guia Básico – Summarize

Nível: Iniciante | Tempo de leitura: 5 minutos

Continuando nossa série sobre KQL com foco em Cyber Security, vamos falar hoje como usar o operador Summarize. Outros capítulos podem ser vistos em nossa categoria de KQL do site.

Podemos pensar no Summarize como um agregador, pois ele produz uma tabela que agrupa (ou sumariza) o conteúdo da tabela de entrada. Em uma analogia com comandos de SQL ele pode ser comparado ao GROUP BY.

No exemplo a seguir, estou listando no Azure Sentinel a tabela SecurityEvent e listando com o Summarize usando a função count() e agrupando por atividade. Podemos ver que temos os eventos as atividades e uma coluna count_ que agrega o valor de cada uma delas.

Eu também poderia referenciar uma outra coluna para compor o resultado final, como no exemplo abaixo:

Perceba que nossa coluna não fica de uma forma muito interessante com o nome de count_.

Aqui a dica é renomear a coluna para ficar mais fácil de entender o resultado, usando o exemplo abaixo:

Eu também posso fazer uma chamada para uma função de agregação como count () mostrado acima mas também para outros agregadores como avg () e outros similares com nomes de colunas como argumentos, os exemplos de agregadores podem ser vistos no seguinte link:

summarize operator – Azure Data Explorer | Microsoft Docs

Um exemplo, eu posso buscar pelo timestamp de data / hora mínimo e máximo de todos os registros na tabela Atividades. Não há cláusula group-by, portanto, há apenas uma linha na saída:

Activities | summarize Min = min(Timestamp), Max = max(Timestamp)

Vamos pegar um outro exemplo do repositório do GitHub do Azure Sentinel:

SentinelKQL/NewBruteForceAttacks.txt at 2f03d2e7e3f3f612db98f6a4f0e8a49e47684239 · rod-trent/SentinelKQL · GitHub

Veja nesse exemplo o summarize sendo usando com o agregador make_set() no primeiro exemplo e na segunda parte a coluna sendo renomeada para FailureCount.

let ExcludedIP = dynamic ([
'172.24.1.4'
]);
let PreviousFailures = SecurityEvent
| where TimeGenerated between (ago(60m) .. ago(10m))
| where EventID == 4625
| where SubStatus != "0xc0000064"
| where AccountType != 'Machine'
| where IpAddress !in (ExcludedIP)
| summarize FailureCount=count() by TargetAccount, IpAddress, bin(TimeGenerated, 50m)
| where FailureCount >= 50
| summarize make_set(strcat(TargetAccount, ' ', IpAddress));
SecurityEvent
| where TimeGenerated > ago(10m)
| where EventID == 4625
| where SubStatus != "0xc0000064"
| where AccountType != 'Machine'
| where IpAddress !in (ExcludedIP)
| summarize FailureCount=count() by TargetAccount, IpAddress, bin(TimeGenerated, 10m)
| where FailureCount >= 10
| where strcat(TargetAccount, ' ', IpAddress) !in (PreviousFailures)

Por hoje é isso, espero que tenha ajudado!

Tiago Souza

Tiago Souza

Security Technical Specialist
Cyber Security Technical Specialist at Microsoft | Cloud Security & Threat Protection | Blog content creator at CyberGeeks.Cloud - https://linktr.ee/tiagovf