CommunityEscrita e Ediçãogithub.com

microsoft/azure-kusto-irql

Componha consultas IRQL (Incident Response Query Language) para investigações de segurança cibernética no Kusto. Traduz perguntas de caça em pipelines IRQL compostáveis usando funções Get_*, Extract_* e Enrich_*.

O que é azure-kusto-irql?

Esta skill capacita agentes de IA, como o Claude Code e Cursor, a compor pipelines de funções IRQL para investigações de segurança cibernética no Azure Data Explorer (Kusto). IRQL é uma camada de abstração sobre o KQL que fornece um esquema unificado e funções componíveis (Get_*, Extract_*, Enrich_*) para analistas e LLMs expressarem consultas de caça sem precisar memorizar esquemas de tabelas, localizações de clusters ou chaves de junção. A skill é ativada quando o usuário menciona explicitamente IRQL, funções específicas ou solicita a composição de um pipeline de caça. Ela gera consultas KQL completas usando uma cadeia composta por seletor, extrator, filtro, enriquecedor e sumarização, e as exibe no chat. A skill também oferece suporte opcional para abrir consultas no Kusto Explorer no Windows, mas o fluxo padrão é sempre exibir o KQL gerado na resposta, com etapas claras de conexão e consulta.

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/microsoft/agent-skills/tree/main/.github/plugins/azure-kusto-graph-skills/skills/azure-kusto-irql

Installed? Explore more Escrita e Edição skills: steipete/notion, langchain-ai/langchain, bytedance/podcast-generation · View all 6 →

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

IRQL -- Incident Response Query Language

Componha pipelines de funções IRQL a partir de blocos de construção: seletores, extratores e enriquecedores. O IRQL encapsula tabelas brutas de segurança do KQL por trás de funções componíveis que revelam a intenção, permitindo que analistas (e LLMs) expressem caças sem memorizar esquemas, localizações de clusters ou chaves de junção.

Gatilhos de Ativação

Use esta skill quando o usuário:

  • Mencionar explicitamente IRQL, funções Get_*, Extract_* ou Enrich_*
  • Disse "use IRQL" ou "escreva uma consulta IRQL"
  • Solicitar um pipeline de caça componível usando seletores IRQL conhecidos

Não ative para consultas de segurança genéricas (ex.: "encontre logins com falha") a menos que o usuário explicitamente peça IRQL. Encaminhe essas para azure-kusto.

Não é um conversor de linguagem natural para IRQL. Esta skill compõe pipelines de funções IRQL e pode lidar com solicitações básicas em linguagem natural que mapeiam diretamente para seletores conhecidos e filtros simples. Para conversão geral de NL para KQL ou NL para IRQL, use uma skill dedicada de geração de consultas (disponível separadamente).

Pré-verificação de Funções IRQL

Antes de gerar um pipeline, verifique se o IRQL está disponível no banco de dados de destino:

.show functions
| where Name startswith "Get_" or Name startswith "Extract_" or Name startswith "Enrich_"
| project Name

Se nenhuma função IRQL for encontrada, informe ao usuário que o IRQL não está implantado no banco de dados de destino e sugira usar azure-kusto para consultas KQL brutas. As funções IRQL são um pré-requisito -- esta skill não implanta seletores IRQL base.

O que é IRQL

IRQL é um dialeto baseado em funções sobre o KQL. Ele fornece:

  1. Esquema unificado -- tabelas de segurança díspares projetam colunas consistentes independentemente da fonte de dados subjacente
  2. Componibilidade -- funções pequenas encadeiam via | invoke para construir caças complexas a partir de etapas simples
  3. Portabilidade -- o mesmo pipeline IRQL funciona em diferentes clusters/bancos de dados; apenas os primitivos Get_* precisam ser redirecionados

IRQL não é uma linguagem separada. São funções KQL que você invoca. Qualquer KQL válido funciona junto com funções IRQL.

Implantando IRQL

As funções IRQL são funções KQL armazenadas (.create-or-alter function). Elas já devem estar implantadas no banco de dados de destino antes que esta skill possa gerar pipelines.

Cluster de exemplo público (funções pré-implantadas):

  • Cluster: https://kc7001.eastus.kusto.windows.net
  • Bancos de dados: ValdyTimes, JoJosHospital

Para portar IRQL para um novo cluster/banco de dados, crie seletores Get_* que projetem suas tabelas de origem no esquema unificado (nomes de colunas abaixo) e, em seguida, implante extratores e enriquecedores. Os extratores e enriquecedores funcionam sem alteração, desde que o esquema de entrada corresponda.

Catálogo de Funções

1. Seletores -- Get_*

Retornam visualizações projetadas e com esquema unificado das tabelas de origem. Use o formulário mínimo por padrão; use _All quando colunas extras forem necessárias.

FunçãoColunas
Get_Event_AuthenticationEnvTime, Hostname, ClientIp, Username, Result
Get_Event_Authentication_All+ Description, UserAgent, PasswordHash
Get_EmailEnvTime, EmailSender, EmailRecipient, Subject, Url
Get_Email_All+ ReplyTo, Verdict
Get_EmployeesName, ClientIp, Email, Username, Hostname, Role
Get_Employees_All+ HireDate, UserAgent, Domain
Get_Event_FileCreationEnvTime, Hostname, Filename, Path
Get_Event_FileCreation_All+ Username, Sha256, ProcessName
Get_Event_NetworkInboundEnvTime, ClientIp, Url
Get_Event_NetworkInbound_All+ Method, UserAgent, StatusCode
Get_Event_NetworkOutboundEnvTime, ClientIp, Url
Get_Event_NetworkOutbound_All+ Method, UserAgent
Get_Dns_AllEnvTime, Domain, ClientIp
Get_Event_ProcessEnvTime, ProcessCommandLine, ProcessName, Hostname, Username
Get_Event_Process_All+ ParentProcessName, ParentProcessHash, ProcessHash
Get_SecurityAlerts_AllEnvTime, AlertType, Severity, Description, Indicators
Get_Network_Connection_AllEnvTime, SourceIp, SourcePort, DestinationIp, DestinationPort, Protocol, Bytes

2. Extratores -- Extract_*

Derivam uma nova coluna de uma existente. Invocar após um seletor.

FunçãoColuna de EntradaAdiciona
Extract_Email_Sender_Domain(T)EmailSenderDomain
Extract_Employee_Firstname(T)NameFirstname
Extract_Event_Network_Domain(T)UrlDomainName

3. Enriquecedores -- Enrich_*

Auxiliares de left-join que anexam contexto de uma tabela relacionada.

FunçãoColuna ChaveEnriquece com
Enrich_Event_Authentication_Username(T)UsernameEventos de autenticação para o usuário
Enrich_Ip_Employee(T)ClientIpIdentidade do funcionário a partir do IP
Enrich_Username_Employee(T)UsernameIdentidade do funcionário a partir do nome de usuário
Enrich_Ip_Domain(T)ClientIpDomínios DNS resolvidos para IP
Enrich_Ip_Event_NetworkOutbound(T)ClientIpRede de saída a partir do IP
Enrich_Ip_Network_Connection(T)ClientIpFluxos de rede a partir do IP

4. Enriquecimento Externo

FunçãoFonteRequisito
Enrich_Sha256_VirusTotal(T)Relatório de arquivo VirusTotalChave de API + política de callout
Get_CISA_KEV() / Enrich_CISA_KEV(T)Catálogo CISA KEVPolítica de callout

Regras de Composição

Seletor -> Extrator -> Filtro -> Enriquecedor -> Sumarização/Project
  1. Comece com um Seletor: Get_Event_Authentication, Get_Email, etc.
  2. Extraia campos derivados: | invoke Extract_Email_Sender_Domain()
  3. Filtre para o sinal: | where Result == "Failed Login"
  4. Enriqueça com contexto: | invoke Enrich_Username_Employee()
  5. Sumarize / projete a resposta

Sempre use pipe (|) entre as etapas. Extratores e enriquecedores usam | invoke FunctionName().

Diretrizes de Geração de Consultas

  • Use o seletor mínimo a menos que colunas extras sejam necessárias -> então use _All
  • Encadeie extratores antes de enriquecedores (extratores adicionam colunas que os enriquecedores podem usar como chave)
  • Coloque filtros where o mais cedo possível
  • Use summarize para agregações, project para seleção final de colunas
  • Termine com order by + take para limitar a saída

Exemplos

Para prompts adicionais e exemplos trabalhados, veja references/EXAMPLES.md.

Detecção de força bruta

Get_Event_Authentication
| where Result == "Failed Login"
| summarize FailedCount = count() by Username
| where FailedCount > 19
| invoke Enrich_Username_Employee()
| project Username, Name, Role, Email, FailedCount
| order by FailedCount desc

Triagem de phishing por senioridade do destinatário

Get_Email
| invoke Extract_Email_Sender_Domain()
| project EnvTime, EmailSender, Domain, Username = EmailRecipient, Subject, Url
| invoke Enrich_Username_Employee()
| extend Seniority = case(
    Role has_any ("CEO", "Chief", "Director", "VP", "President"), 3,
    Role has_any ("Manager", "Lead", "Senior"), 2,
    1)
| summarize
    TotalEmails = count(),
    SeniorityScore = sum(Seniority),
    Recipients = make_set(Name, 50),
    DistinctRecipients = dcount(Username)
  by Domain
| where DistinctRecipients >= 2
| order by SeniorityScore desc
| take 20

Pivot pós-exploração a partir de um indicador

let victims =
    Get_Event_FileCreation_All
    | where Filename has "<INDICATOR>"
    | distinct Hostname;
Get_Event_Process
| where Hostname in (victims)
| where ProcessCommandLine has_any ("rundll32", "regsvr32", "powershell", "systeminfo")
| project EnvTime, Hostname, Username, ProcessName, ProcessCommandLine
| order by EnvTime asc

Tráfego de saída suspeito enriquecido com identidade

Get_Event_NetworkOutbound
| invoke Extract_Event_Network_Domain()
| where DomainName has_any ("<SUSPICIOUS_DOMAIN_1>", "<SUSPICIOUS_DOMAIN_2>")
| invoke Enrich_Ip_Employee()
| project EnvTime, Name, Role, DomainName, Url, ClientIp
| order by EnvTime desc

Anomalia de autenticação de IP externo

Get_Event_Authentication_All
| where not(ClientIp startswith "10.") and not(ClientIp startswith "192.168.")
| summarize
    Attempts = count(),
    Failures = countif(Result == "Failed Login"),
    Users = make_set(Username)
  by ClientIp
| order by Failures desc
| take 20

Ferramentas MCP Utilizadas

FerramentaPropósito
kusto_queryExecutar pipelines IRQL em um banco de dados Kusto
kusto_table_schema_getDescobrir tabelas e colunas disponíveis
kusto_cluster_listListar clusters ADX disponíveis
kusto_database_listListar bancos de dados em um cluster

Abrindo Consultas no Kusto Explorer (Somente Windows)

Recurso opcional de conveniência. O fluxo de trabalho padrão é exibir o KQL no chat e deixar o usuário copiá-lo para o Kusto Explorer ou extensão Kusto do VS Code manualmente. O auto-lançamento é opt-in.

Sempre exiba a consulta KQL completa na resposta do chat com a Etapa 1 (conectar) e Etapa 2 (consultar) claramente identificadas:

// Step 1: Connect to your cluster (skip if already connected)
// Example: uncomment to connect to the KC7 training cluster
// #connect cluster('kc7001.eastus.kusto.windows.net').database('ValdyTimes')
// Or replace with your own cluster:
// #connect cluster('<YOUR_CLUSTER>').database('<YOUR_DATABASE>')

// Step 2: Run the query below
<KQL_QUERY>

Se o usuário pedir para salvar ou abrir no Kusto Explorer, siga o procedimento em references/KUSTO_EXPLORER_LAUNCH.md. Regras importantes:

  • Use ask_user para confirmar antes de escrever arquivos ou executar executáveis
  • Exiba o conteúdo do arquivo no chat para que o usuário possa revisar antes de abrir
  • Nunca use interpolação de shell ou here-strings — escreva arquivos via Set-Content/Add-Content
  • Nunca codifique consultas em URLs de navegador
  • No macOS/Linux, salve o arquivo .kql e sugira a extensão Kusto do VS Code ou o ADX Web Explorer
  • Para visualização de grafos a partir de dados IRQL, veja azure-kusto-graph e azure-kusto-irql-graph

Individual skills in this repo

This repo contains 12 individual skills — each has its own dedicated page.

microsoft/azure-ai-agents-persistent-dotnet

Azure AI Agents Persistent SDK for .NET. Low-level SDK for creating and managing AI agents with threads, messages, runs, and tools. Use for agent CRUD, conversation threads, streaming responses, function calling, file search, and code interpreter. Triggers: "PersistentAgentsClient", "persistent agents", "agent threads", "agent runs", "streaming agents", "function calling agents .NET".

microsoft/azure-ai-document-intelligence-dotnet

Azure AI Document Intelligence SDK for .NET. Extract text, tables, and structured data from documents using prebuilt and custom models. Use for invoice processing, receipt extraction, ID document analysis, and custom document models. Triggers: "Document Intelligence", "DocumentIntelligenceClient", "form recognizer", "invoice extraction", "receipt OCR", "document analysis .NET".

microsoft/azure-ai-openai-dotnet

Azure OpenAI SDK for .NET. Client library for Azure OpenAI and OpenAI services. Use for chat completions, embeddings, image generation, audio transcription, and assistants. Triggers: "Azure OpenAI", "AzureOpenAIClient", "ChatClient", "chat completions .NET", "GPT-4", "embeddings", "DALL-E", "Whisper", "OpenAI .NET".

microsoft/azure-ai-projects-dotnet

Azure AI Projects SDK for .NET. High-level client for Azure AI Foundry projects including agents, connections, datasets, deployments, evaluations, and indexes. Use for AI Foundry project management, versioned agents, and orchestration. Triggers: "AI Projects", "AIProjectClient", "Foundry project", "versioned agents", "evaluations", "datasets", "connections", "deployments .NET".

microsoft/azure-ai-voicelive-dotnet

Azure AI Voice Live SDK for .NET. Build real-time voice AI applications with bidirectional WebSocket communication. Use for voice assistants, conversational AI, real-time speech-to-speech, and voice-enabled chatbots. Triggers: "voice live", "real-time voice", "VoiceLiveClient", "VoiceLiveSession", "voice assistant .NET", "bidirectional audio", "speech-to-speech".

microsoft/azure-eventgrid-dotnet

Azure Event Grid SDK for .NET. Client library for publishing and consuming events with Azure Event Grid. Use for event-driven architectures, pub/sub messaging, CloudEvents, and EventGridEvents. Triggers: "Event Grid", "EventGridPublisherClient", "CloudEvent", "EventGridEvent", "publish events .NET", "event-driven", "pub/sub".

microsoft/azure-eventhub-dotnet

Azure Event Hubs SDK for .NET. Use for high-throughput event streaming: sending events (EventHubProducerClient, EventHubBufferedProducerClient), receiving events (EventProcessorClient with checkpointing), partition management, and real-time data ingestion. Triggers: "Event Hubs", "event streaming", "EventHubProducerClient", "EventProcessorClient", "send events", "receive events", "checkpointing", "partition".

microsoft/azure-identity-dotnet

Azure Identity library for .NET. Authentication library for Azure SDK clients using Microsoft Entra ID. Use for DefaultAzureCredential, managed identity, service principals, and developer credentials. Triggers: "Azure Identity", "DefaultAzureCredential", "ManagedIdentityCredential", "ClientSecretCredential", "authentication .NET", "Azure auth", "credential chain".

microsoft/azure-kusto-graph

Build and query Kusto graphs from natural language. Covers transient graphs (make-graph), persistent graph models/snapshots, pattern matching (graph-match), shortest paths, connected components, and graph-to-table export. Generates the edges-first thinking: define edges, define node lookups, union, make-graph. WHEN: make-graph, graph-match, graph-shortest-paths, graph-to-table, graph-mark-components, persistent graph, graph model, graph snapshot, build a graph from data, find paths between nodes, pattern matching in graph, connected components, transient graph, Kusto graph, KQL graph.

microsoft/azure-kusto-irql-graph

Apply IRQL graph functions to KQL or IRQL query results for Kusto Explorer visualization. Generates Lift_To_Graph mappings and composes Graph_Render_View, Graph_Fold_By_Property, Extract_Node_*, Enrich_Node_*, and Enrich_Graph_* calls. Accepts a supplied query or limited basic natural-language source request; it is not a general natural-language-to-KQL/IRQL skill. WHEN: Lift_To_Graph, Graph_Render_View, Graph_Fold_By_Property, IRQL graph enrichment, graph mapping for existing query results, icon-decorated graph, fold graph nodes. Use azure-kusto-graph for native make-graph analysis, graph-match, shortest paths, components, or persistent graphs.

microsoft/azure-local

Plan, deploy, operate, and troubleshoot Azure Local (formerly Azure Stack HCI): sizing and prerequisites, Arc registration, lifecycle updates, workloads (Azure Local VMs, AKS on Azure Local, images, disks, logical networks), SDN and network security, and failure triage — starting read-only and confirming before risky changes. WHEN: Azure Local, Azure Stack HCI, Arc resource bridge, custom location, Azure Local VM, Arc VM, AKS on Azure Local, AKS hybrid, SDN, Lifecycle Manager, Azure Local update, disconnected site.

microsoft/azure-local-multi-rack

Plan, deploy, operate, and troubleshoot multi-rack (rack scale) deployments of Azure Local — preintegrated racks scaling to hundreds of machines, built on Network Fabric Controller, Cluster Manager, SAN storage, and managed network fabric. Use for the Microsoft.NetworkCloud and Microsoft.ManagedNetworkFabric control plane. NOT for standard 1-16 node Azure Local, and NOT for rack-aware clusters (two racks as availability zones, up to 8 nodes, synchronous replication) — those are standard scale. WHEN: multi-rack, rack scale Azure Local, aggregation rack, compute rack, Network Fabric Controller, NFC, Cluster Manager, network fabric, isolation domain, az networkcloud, az networkfabric, multi-rack logical network, multi-rack Arc VM.

Habilidades Relacionadas