CommunitySchreiben & Editierengithub.com

microsoft/azure-kusto-irql

Erstelle IRQL (Incident Response Query Language) Pipelines für Kusto-Sicherheitsuntersuchungen. Übersetzt natürlichsprachliche Jagdfragen in komponierbare IRQL-Pipelines mit Get_*-, Extract_*- und Enrich_*-Funktionen.

Was ist azure-kusto-irql?

Dieses Skill ermöglicht es Analysten und KI-Agenten, IRQL-Funktionspipelines (Incident Response Query Language) für die Cybersicherheitsforensik in Azure Data Explorer (ADX) zu verfassen. IRQL ist ein funktionsbasierter Dialekt über KQL, der ein einheitliches Schema bereitstellt, indem Sicherheitstabellen in konsistente Spaltennamen projiziert werden. Der Skill erlaubt die Komposition komplexer Jagdabläufe aus modularen Selektoren (Get_*), Extraktoren (Extract_*) und Anreicherern (Enrich_*). Er unterstützt Plattformen wie Claude Code und Codex sowie Tools wie kusto_query, kusto_table_schema_get, kusto_cluster_list und kusto_database_list. Anstatt KQL direkt zu generieren, orchestriert er vordefinierte IRQL-Funktionen, die auf der Zieldatenbank bereitgestellt sein müssen. Der Skill enthält eine vollständige Funktionskatalogisierung, Kompositionsregeln sowie Beispiele für Brute-Force-Erkennung, Phishing-Triage, Post-Exploitation-Pivot und anomale Authentifizierung. Er öffnet Queries optional in Kusto Explorer (nur Windows) und unterstützt keine reine Natürlichsprache-zu-IRQL-Konvertierung – dafür ist ein separates Skill vorgesehen.

Funktioniert mit~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 Schreiben & Editieren skills: steipete/notion, langchain-ai/langchain, bytedance/podcast-generation · View all 6 →

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

IRQL – Incident Response Query Language (Sprache für Vorfallreaktionen)

Komponieren Sie IRQL-Funktionspipelines aus den Bausteinen Selektor, Extraktor und Anreicherer. IRQL verpackt rohe KQL-Sicherheitstabellen hinter absichtserkennenden, komponierbaren Funktionen, sodass Analysten (und LLMs) Jagden ausdrücken können, ohne Schemas, Cluster-Standorte oder Join-Schlüssel auswendig lernen zu müssen.

Aktivierungsauslöser

Verwenden Sie dieses Skill, wenn der Benutzer:

  • Explizit IRQL, Get_*, Extract_* oder Enrich_*-Funktionen erwähnt
  • "IRQL verwenden" oder "eine IRQL-Abfrage schreiben" sagt
  • Eine komponierbare Jagdpipeline mit bekannten IRQL-Selektoren anfordert

Nicht aktivieren für allgemeine Sicherheitsabfragen (z. B. "fehlgeschlagene Anmeldungen finden"), es sei denn, der Benutzer bittet explizit um IRQL. Leiten Sie solche Anfragen stattdessen an azure-kusto weiter.

Kein Konverter von natürlicher Sprache zu IRQL. Dieses Skill komponiert IRQL-Funktionspipelines und kann grundlegende natürlichsprachliche Anfragen verarbeiten, die direkt auf bekannte Selektoren und einfache Filter abbilden. Für die allgemeine Umwandlung von NL zu KQL oder NL zu IRQL verwenden Sie ein spezielles Query-Generierungs-Skill (separat verfügbar).

IRQL-Funktionsüberprüfung

Überprüfen Sie vor der Generierung einer Pipeline, ob IRQL auf der Zieldatenbank verfügbar ist:

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

Wenn keine IRQL-Funktionen gefunden werden, informieren Sie den Benutzer, dass IRQL nicht auf der Zieldatenbank bereitgestellt ist, und schlagen Sie die Verwendung von azure-kusto für rohe KQL-Abfragen vor. IRQL-Funktionen sind eine Voraussetzung – dieses Skill stellt keine Basis-IRQL-Selektoren bereit.

Was IRQL ist

IRQL ist ein funktionsbasierter Dialekt auf Basis von KQL. Es bietet:

  1. Einheitliches Schema – verschiedene Sicherheitstabellen projizieren in konsistente Spaltennamen, unabhängig von der zugrunde liegenden Datenquelle
  2. Komponierbarkeit – kleine Funktionen verketten sich via | invoke, um aus einfachen Schritten komplexe Jagden zu bauen
  3. Portabilität – dieselbe IRQL-Pipeline funktioniert über verschiedene Cluster/Datenbanken; nur die Get_*-Primitive müssen umadressiert werden

IRQL ist keine separate Sprache. Es sind KQL-Funktionen, die Sie aufrufen. Jedes gültige KQL funktioniert neben IRQL-Funktionen.

Bereitstellung von IRQL

IRQL-Funktionen sind gespeicherte KQL-Funktionen (.create-or-alter function). Sie müssen bereits auf der Zieldatenbank bereitgestellt sein, bevor dieses Skill Pipelines generieren kann.

Öffentlicher Beispielcluster (Funktionen vorinstalliert):

  • Cluster: https://kc7001.eastus.kusto.windows.net
  • Datenbanken: ValdyTimes, JoJosHospital

Um IRQL auf einen neuen Cluster/eine neue Datenbank zu portieren, erstellen Sie Get_*-Selektoren, die Ihre Quelltabellen in das einheitliche Schema projizieren (Spaltennamen unten), und stellen Sie dann Extraktoren und Anreicherer bereit. Die Extraktoren und Anreicherer funktionieren unverändert, solange das Eingabeschema übereinstimmt.

Funktionskatalog

1. Selektoren – Get_*

Geben projizierte, schemavereinheitlichte Ansichten der Quelltabellen zurück. Standardmäßig die minimale Form verwenden; _All verwenden, wenn zusätzliche Spalten benötigt werden.

FunktionSpalten
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. Extraktoren – Extract_*

Leiten eine neue Spalte aus einer vorhandenen ab. Nach einem Selektor aufrufen.

FunktionEingabespalteFügt hinzu
Extract_Email_Sender_Domain(T)EmailSenderDomain
Extract_Employee_Firstname(T)NameFirstname
Extract_Event_Network_Domain(T)UrlDomainName

3. Anreicherer – Enrich_*

Left-Join-Helfer, die Kontext aus einer verwandten Tabelle anhängen.

FunktionSchlüsselspalteReichert an mit
Enrich_Event_Authentication_Username(T)UsernameAuthentifizierungsereignisse für Benutzer
Enrich_Ip_Employee(T)ClientIpMitarbeiteridentität aus IP
Enrich_Username_Employee(T)UsernameMitarbeiteridentität aus Benutzername
Enrich_Ip_Domain(T)ClientIpDNS-Domänen, die zu IP aufgelöst wurden
Enrich_Ip_Event_NetworkOutbound(T)ClientIpAusgehende Netzwerke von IP
Enrich_Ip_Network_Connection(T)ClientIpNetzwerkflüsse von IP

4. Externe Anreicherung

FunktionQuelleVoraussetzung
Enrich_Sha256_VirusTotal(T)VirusTotal-DateiberichtAPI-Schlüssel + Callout-Richtlinie
Get_CISA_KEV() / Enrich_CISA_KEV(T)CISA-KEV-KatalogCallout-Richtlinie

Kompositionsregeln

Selektor -> Extraktor -> Filter -> Anreicherer -> Zusammenfassen/Projizieren
  1. Mit einem Selektor beginnen: Get_Event_Authentication, Get_Email usw.
  2. Abgeleitete Felder extrahieren: | invoke Extract_Email_Sender_Domain()
  3. Auf das Signal filtern: | where Result == "Failed Login"
  4. Mit Kontext anreichern: | invoke Enrich_Username_Employee()
  5. Die Antwort zusammenfassen/projizieren

Immer mit | zwischen den Schritten pipen. Extraktoren und Anreicherer verwenden | invoke FunktionName().

Richtlinien zur Abfragegenerierung

  • Den minimalen Selektor verwenden, es sei denn, zusätzliche Spalten werden benötigt → dann _All
  • Extraktoren vor Anreicherern verketten (Extraktoren fügen Spalten hinzu, auf die Anreicherer schlüsseln können)
  • where-Filter so früh wie möglich platzieren
  • summarize für Aggregationen, project für die endgültige Spaltenauswahl verwenden
  • Mit order by + take enden, um die Ausgabe zu begrenzen

Beispiele

Für weitere Aufforderungen und ausgearbeitete Beispiele siehe references/EXAMPLES.md.

Brute-Force-Erkennung

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

Phishing-Triage nach Empfänger-Seniorität

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

Post-Exploitation-Pivot von einem Indikator aus

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

Verdächtiger ausgehender Datenverkehr, angereichert mit Identität

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

Anomale Authentifizierung von externen IPs

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

Verwendete MCP-Tools

ToolZweck
kusto_queryAusführen von IRQL-Pipelines gegen eine Kusto-Datenbank
kusto_table_schema_getEntdecken verfügbarer Tabellen und Spalten
kusto_cluster_listAuflisten verfügbarer ADX-Cluster
kusto_database_listAuflisten von Datenbanken in einem Cluster

Öffnen von Abfragen im Kusto Explorer (nur Windows)

Optionale Komfortfunktion. Der Standard-Workflow besteht darin, das KQL im Chat auszugeben und den Benutzer es manuell in den Kusto Explorer oder die VS Code Kusto-Erweiterung kopieren zu lassen. Der automatische Start ist nur per Opt-in möglich.

Geben Sie immer die vollständige KQL-Abfrage in der Chat-Antwort aus, wobei Schritt 1 (verbinden) und Schritt 2 (Abfrage) klar gekennzeichnet sind:

// Schritt 1: Mit Ihrem Cluster verbinden (überspringen, falls bereits verbunden)
// Beispiel: Auskommentieren, um mit dem KC7-Trainingscluster zu verbinden
// #connect cluster('kc7001.eastus.kusto.windows.net').database('ValdyTimes')
// Oder durch Ihren eigenen Cluster ersetzen:
// #connect cluster('<YOUR_CLUSTER>').database('<YOUR_DATABASE>')

// Schritt 2: Die folgende Abfrage ausführen
<KQL_QUERY>

Wenn der Benutzer bittet, die Abfrage im Kusto Explorer zu speichern oder zu öffnen, befolgen Sie das Verfahren in references/KUSTO_EXPLORER_LAUNCH.md. Wichtige Regeln:

  • ask_user verwenden, um vor dem Schreiben von Dateien oder dem Starten von ausführbaren Dateien eine Bestätigung einzuholen
  • Dateiinhalte im Chat anzeigen, damit der Benutzer sie vor dem Öffnen überprüfen kann
  • Niemals Shell-Interpolation oder Here-Strings verwenden – Dateien via Set-Content/Add-Content schreiben
  • Niemals Abfragen in Browser-URLs codieren
  • Unter macOS/Linux die .kql-Datei speichern und die VS Code Kusto-Erweiterung oder den ADX Web Explorer vorschlagen
  • Für Graph-Visualisierung von IRQL-Daten siehe azure-kusto-graph und 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.

Verwandte Skills