CommunityRédaction et éditiongithub.com

microsoft/azure-kusto-irql

Composer des pipelines de requêtes IRQL (Incident Response Query Language) pour les investigations de cybersécurité Kusto. Traduit les questions de chasse en langage naturel en pipelines IRQL composables utilisant les fonctions Get_*, Extract_* et Enrich_*.

Qu'est-ce que azure-kusto-irql ?

Cette compétence spécialisée permet aux analystes SOC et aux agents d'IA de composer des pipelines de requêtes IRQL (Incident Response Query Language) pour la chasse aux menaces et les investigations de réponse aux incidents sur les bases de données Azure Data Explorer (ADX) / Kusto. IRQL est un dialecte fonctionnel basé sur KQL qui unifie la syntaxe des tables de sécurité disparates, offrant une couche d'abstraction au-dessus de KQL brut. La compétence permet aux utilisateurs de décrire leurs objectifs de chasse en langage naturel (par exemple « rechercher des mouvements latéraux »), qui sont ensuite traduits en pipelines composables utilisant des sélecteurs (`Get_*`), des extracteurs (`Extract_*`) et des enrichisseurs (`Enrich_*`). Cela élimine le besoin de mémoriser les schémas de table, les emplacements de cluster ou les clés de jointure. La compétence prend en charge plusieurs cas d'utilisation de cybersécurité, notamment la détection par force brute, le triage du phishing, l'analyse post-exploitation et l'enrichissement du trafic réseau. Des outils MCP tels que `kusto_query` et `kusto_table_schema_get` sont utilisés pour exécuter les requêtes et découvrir les schémas.

Compatible avec~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 Rédaction et édition skills: steipete/notion, langchain-ai/langchain, bytedance/podcast-generation · View all 6 →

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

IRQL -- Langage de Requête pour la Réponse aux Incidents

Composer des pipelines de fonctions IRQL à partir de blocs de construction sélecteurs, extracteurs et enrichisseurs. IRQL encapsule les tables de sécurité KQL brutes derrière des fonctions composables qui révèlent l'intention, permettant aux analystes (et aux LLM) d'exprimer des chasses sans mémoriser les schémas, les emplacements de cluster ou les clés de jointure.

Déclencheurs d'Activation

Utilisez cette compétence lorsque l'utilisateur :

  • Mentionne explicitement IRQL, les fonctions Get_*, Extract_* ou Enrich_*
  • Dit "utilise IRQL" ou "écris une requête IRQL"
  • Demande un pipeline de chasse composable utilisant des sélecteurs IRQL connus

N'activez pas pour des requêtes de sécurité génériques (par exemple "trouver les échecs de connexion") à moins que l'utilisateur ne demande explicitement IRQL. Redirigez-les vers azure-kusto à la place.

Ce n'est pas un convertisseur langage-naturel-vers-IRQL. Cette compétence compose des pipelines de fonctions IRQL et peut gérer des requêtes de base en langage naturel qui correspondent directement à des sélecteurs connus et des filtres simples. Pour une conversion générale NL-vers-KQL ou NL-vers-IRQL, utilisez une compétence dédiée de génération de requêtes (disponible séparément).

Vérification Préalable des Fonctions IRQL

Avant de générer un pipeline, vérifiez qu'IRQL est disponible sur la base de données cible :

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

Si aucune fonction IRQL n'est trouvée, informez l'utilisateur qu'IRQL n'est pas déployé sur la base de données cible et suggérez d'utiliser azure-kusto pour les requêtes KQL brutes à la place. Les fonctions IRQL sont un prérequis -- cette compétence ne déploie pas les sélecteurs IRQL de base.

Ce qu'est IRQL

IRQL est un dialecte basé sur des fonctions au-dessus de KQL. Il fournit :

  1. Schéma unifié -- les tables de sécurité disparates projettent des noms de colonnes cohérents, quelle que soit la source de données sous-jacente
  2. Composabilité -- de petites fonctions s'enchaînent via | invoke pour construire des chasses complexes à partir d'étapes simples
  3. Portabilité -- le même pipeline IRQL fonctionne sur différents clusters/bases de données ; seules les primitives Get_* doivent être re-pointées

IRQL n'est pas un langage séparé. Ce sont des fonctions KQL que vous invoquez. Tout KQL valide fonctionne aux côtés des fonctions IRQL.

Déploiement d'IRQL

Les fonctions IRQL sont des fonctions KQL stockées (.create-or-alter function). Elles doivent déjà être déployées sur la base de données cible avant que cette compétence puisse générer des pipelines.

Exemple de cluster public (fonctions pré-déployées) :

  • Cluster : https://kc7001.eastus.kusto.windows.net
  • Bases de données : ValdyTimes, JoJosHospital

Pour porter IRQL vers un nouveau cluster/base de données, créez des sélecteurs Get_* qui projettent vos tables sources dans le schéma unifié (noms de colonnes ci-dessous), puis déployez les extracteurs et enrichisseurs. Les extracteurs et enrichisseurs fonctionnent sans changement tant que le schéma d'entrée correspond.

Catalogue de Fonctions

1. Sélecteurs -- Get_*

Renvoient des vues projetées et unifiées par schéma des tables sources. Utilisez la forme minimale par défaut ; utilisez _All lorsque des colonnes supplémentaires sont nécessaires.

FonctionColonnes
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. Extracteurs -- Extract_*

Dérivent une nouvelle colonne à partir d'une existante. Invoquez après un sélecteur.

FonctionColonne d'EntréeAjoute
Extract_Email_Sender_Domain(T)EmailSenderDomain
Extract_Employee_Firstname(T)NameFirstname
Extract_Event_Network_Domain(T)UrlDomainName

3. Enrichisseurs -- Enrich_*

Aides de jointure gauche qui attachent le contexte d'une table associée.

FonctionColonne CléEnrichit Avec
Enrich_Event_Authentication_Username(T)UsernameÉvénements d'authentification pour l'utilisateur
Enrich_Ip_Employee(T)ClientIpIdentité de l'employé à partir de l'IP
Enrich_Username_Employee(T)UsernameIdentité de l'employé à partir du nom d'utilisateur
Enrich_Ip_Domain(T)ClientIpDomaines DNS résolus en IP
Enrich_Ip_Event_NetworkOutbound(T)ClientIpRéseau sortant depuis l'IP
Enrich_Ip_Network_Connection(T)ClientIpFlux réseau depuis l'IP

4. Enrichissement Externe

FonctionSourcePrérequis
Enrich_Sha256_VirusTotal(T)Rapport de fichier VirusTotalClé API + politique d'appel (callout policy)
Get_CISA_KEV() / Enrich_CISA_KEV(T)Catalogue CISA KEVPolitique d'appel

Règles de Composition

Sélecteur -> Extracteur -> Filtre -> Enrichisseur -> Résumer/Projeter
  1. Commencez par un Sélecteur : Get_Event_Authentication, Get_Email, etc.
  2. Extrayez les champs dérivés : | invoke Extract_Email_Sender_Domain()
  3. Filtrez le signal : | where Result == "Failed Login"
  4. Enrichissez avec du contexte : | invoke Enrich_Username_Employee()
  5. Résumez / projetez la réponse

Utilisez toujours le tube (|) entre les étapes. Les extracteurs et enrichisseurs utilisent | invoke NomFonction().

Directives de Génération de Requêtes

  • Utilisez le sélecteur minimal sauf si des colonnes supplémentaires sont nécessaires -> alors utilisez _All
  • Enchaînez les extracteurs avant les enrichisseurs (les extracteurs ajoutent des colonnes sur lesquelles les enrichisseurs peuvent se baser)
  • Placez les filtres where le plus tôt possible
  • Utilisez summarize pour les agrégations, project pour la sélection finale des colonnes
  • Terminez par order by + take pour limiter la sortie

Exemples

Pour des exemples supplémentaires et des invites travaillées, consultez references/EXAMPLES.md.

Détection par force brute

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

Triage du phishing par ancienneté du destinataire

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 post-exploitation à partir d'un indicateur

let victims =
    Get_Event_FileCreation_All
    | where Filename has "<INDICATEUR>"
    | 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

Trafic sortant suspect enrichi avec l'identité

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

Anomalie d'authentification IP externe

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

Outils MCP Utilisés

OutilObjectif
kusto_queryExécuter des pipelines IRQL sur une base de données Kusto
kusto_table_schema_getDécouvrir les tables et colonnes disponibles
kusto_cluster_listLister les clusters ADX disponibles
kusto_database_listLister les bases de données dans un cluster

Ouverture des Requêtes dans Kusto Explorer (Windows uniquement)

Fonctionnalité de commodité optionnelle. Le flux de travail par défaut consiste à afficher le KQL dans le chat et à laisser l'utilisateur le copier dans Kusto Explorer ou l'extension Kusto de VS Code manuellement. Le lancement automatique est uniquement sur option.

Affichez toujours la requête KQL complète dans la réponse du chat avec les étapes 1 (connexion) et 2 (requête) clairement étiquetées :

// Étape 1 : Connectez-vous à votre cluster (ignorer si déjà connecté)
// Exemple : décommentez pour vous connecter au cluster d'entraînement KC7
// #connect cluster('kc7001.eastus.kusto.windows.net').database('ValdyTimes')
// Ou remplacez par votre propre cluster :
// #connect cluster('<VOTRE_CLUSTER>').database('<VOTRE_BASE_DE_DONNEES>')

// Étape 2 : Exécutez la requête ci-dessous
<REQUETE_KQL>

Si l'utilisateur demande à sauvegarder ou ouvrir dans Kusto Explorer, suivez la procédure dans references/KUSTO_EXPLORER_LAUNCH.md. Règles clés :

  • Utilisez ask_user pour confirmer avant d'écrire des fichiers ou de lancer des exécutables
  • Affichez le contenu du fichier dans le chat pour que l'utilisateur puisse le vérifier avant ouverture
  • N'utilisez jamais d'interpolation shell ou de here-strings — écrivez les fichiers via Set-Content/Add-Content
  • N'encodez jamais les requêtes dans les URL du navigateur
  • Sur macOS/Linux, enregistrez le fichier .kql et suggérez l'extension Kusto de VS Code ou ADX Web Explorer
  • Pour la visualisation de graphes à partir de données IRQL, voir azure-kusto-graph et 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.

Skills associés