Repositório de Consultas KQL

Algumas consultas KQL que usamos para o Log Analytics e Resource Graph são simples mas nos fornecem todos os dados que precisamos para uma decisão ou servir de base para hunting.

Alem de algumas consultas "curiosas" que já precisei montar, tambem tenho as que uso em treinamento do Microsoft Defender for Cloud como exemplo de diferentes tipos de consultas.

Decidi juntar todas elas em um repositório no GitHub para ficar fácil a consulta e deixar disponivel para a comunidade.

msincic/scripts-KQL: Public KQL Scripts (github.com)

Nome do Script Tipo Proposito
Agents_Last_Comm Log Analytics List type of agent (MMA or AMA) and last communication of all computers monitored
Array-Text-Extract Log Analytics Examples of extract data in arrays or text columns
Attack-Examples Log Analytics Example of detect attacks in logs (SQL Injection)
Emails-Threat-Intel Log Analytics Detect malicious IPs and domains in email, URL or sender
Events_Chart_ByDay Log Analytics Example of chat to detect anomolous events registered
Graph_examples Log Analytics Examples of graph (bar, time, pie)
List_CWPP Resource Graph List workload protections in all subscriptions to map a coverage protection in your environment
List-Deployments-and-Details Log Analytics List all deploymentos to audit object creations and details about dependant objects in the same deploy
M365_Operations Log Analytics List operations in M365 and IP/DLP actions
More-Changed-Computers Log Analytics List top 10 computers and users with changed configs
PIM_Included Log Analytics List activities of include users in PIM
PoliciesAssigned-State Resource Graph List policies applied and compliance states. You can filter for compliance or non-compliance to addresses actions
Policies-List Resource Graph List policies and details to export and use for determine assigments in your enviromnent
Purview-IP-Events Log Analytics List all activities in Purview (IP, DLP, IRM, etc)
Secure-Controls Resource Graphs List Score, recommendations and assessments in details
Tables-Ingest-Day-by-Day Log Analytics List ingest data in all tables by day with indicator of billied or non-billed
ThreatIntel-Examples Log Analytics Samples to use Microsoft Defender Threat Intel table to detect malicious IP in sign-ins and consult tables
Usage_Tables Log Analytics Graph to identify and understand tables growing
VM_Process_Comm Log Analytics List of process communicated in all computers with IP and Port, source, destination, bytes send and received
VMs+Scale Set User Identity Resource Graph List VMs and Scale Sets using User Identity to mapped permissions

Criando conectores customizados no Sentinel

O workbook agora tornado publico (ate a data que escreve em public preview) eu testei quando esteve a dois meses em Private Preview.

Este workbook permite que você crie conectores para dados que não são padronizados e consequentemente não aparecem no painel de dados do Sentinel, apesar que é possível criar regras de anomalias e hunting a partir de DCRs (Data Collection Rules) do Azure Monitor.

Vantagens de Coletores Customizados

Alem da característica visual no Sentinel de ver o seu coletor e estatísticas, você terá uma integração com APIs externas.

Essa integração permitira que de forma simples você capture dados de fontes externas como produtos PaaS e SaaS de terceiros.

O Workbook

O workbook não é tão simples a ponto de ser utilizado por um profissional que não conheça bem o Azure Monitor e conceitos de log (JSON, CSV, Endpoint, API URL/Autenthication, etc). Mas para quem já utiliza hoje DCRs e captura dados no Log Analytics, ele será mais simples.

Após baixar o workbook pelo Content, verá que ele permite indicar a subscrição, log analytics, endpoint e definir visualmente as características do dado que deseja coletar:

Referencia

Create Codeless Connectors with the Codeless Connector Builder (Preview) - Microsoft Community Hub

Protegendo o log do WAF contra vazamentos e exfiltração de dados

Pode parecer uma proteção desnecessária, mas proteger o log do WAF é um item importante na preservação de dados pessoas (PII) ou mesmo corporativos de seus clientes e parceiros.

Cenário

Como seu site precisa receber dados de login (sejam clientes, parceiros ou fornecedores) nas chamadas POST ou JSON com nome de usuário e senha, você poderá ter um vazamento caso o log caia em mãos de um agente malicioso que pode ser um funcionário ou externo.

Um exemplo que tive a alguns anos atras foi em um sistema de consulta de crédito integrado a parceiros de cadastro como SERASA e Associações Comerciais. O log de erros do sistema guardava em formato plain text no banco de dados os chamados com erros para que os desenvolvedores e o SAC pudessem encontrar erros no retorno de consultas.
Porém, nesse log muitas vezes o problema era erro na senha e nome de usuário enviados e com isso bastaria usar a lógica para deduzir que o usuário escreveu uma letra ou digito a mais ou diferente para conseguir saber sua senha.
E pior ainda, no log completo do serviço de autenticação era possível ver no GET os dados enviados para o cliente. Ou seja, se um parceiro consultar o meu CPF ou de alguém que me interesse, eu poderia procurar no log o retorno que foi enviado a performance nos serviços de crédito desta pessoa sem que isso fosse logado em qualquer lugar já que acessei diretamente o log.

Agora no Azure podemos deixar isso no passado, uma vez que não precisamos mais guardar logs programáticos já que ele armazena tudo no Log Analytics. Mas ainda temos um log onde qualquer operador de segurança pode usar um KQL e ver os dados, até mesmo utilizar um usuário valido para consultar dados no sistema.

Solução

Na época que notamos este problema a solução teve que ser manual, remover programaticamente nas funções a gravação de log para usuário e senha, além de mascarar CPF e CNPJ. Mas obviamente este não era uma solução definitiva, já que o log do WAF e do IIS ainda guardariam os dados brutos.

Agora no Azure WAF é possível criar regras de mascaramento para o log, ou seja, poderei identificar os dados no JSON e no POST que preciso proteger e proibir que sejam usados em consultas KQL.

Configuração

Nas propriedades da política do WAF use o menu "Sensitive Data" para acessar o log scrubbing como a minha configuração abaixo:

Em meu exemplo utilizei os parâmetros e variáveis que são utilizadas pelos meus desenvolvedores para identificar usuário, senha, número de contrato e ID do cliente. Aqui poderia acrescentar CPF, CNPJ ou outros documentos que sejam argumentos recebidos e enviados.

Abaixo temos a lista de tipos de variáveis que podem ser mascaradas atualmente:

Com exceção do IP Address todos os outros tipos permitem a opção "Equal" e "Equal any" onde a primeira permite indicar uma informação nomeada e a segunda mascara qualquer que seja o conteudo no item selecionado. No caso do "Equal any" é importante lembrar que ele irá criptografar todas as variaveis daquele formato, o que pode ser ruim para debug futuro.

Referência

A Microsoft já liberou a documentação do recurso no Learn, para isso utilize o anuncio Azure WAF – Masking Sensitive Data - Microsoft Community Hub