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:
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!