IRQL(Incident Response Query Language,事件响应查询语言)是一个构建在 KQL 之上的函数式方言,用于 Kusto 网络安全调查。它通过选择器、提取器和富化器等可组合构件,把原始 KQL 安全表封装在意图明确、可组合的函数之后,让分析人员(以及 LLM)无需记忆模式、集群位置或连接键就能表达狩猎查询。
用途 本技能用于组合 IRQL 函数管道。当用户明确提及 IRQL、Get_、Extract_ 或 Enrich_* 函数,或说“使用 IRQL”“写一个 IRQL 查询”,或要求使用已知 IRQL 选择器构建可组合狩猎管道时激活。对于通用安全查询(如“查找登录失败”),除非用户明确要求 IRQL,否则不应激活,应转由 azure-kusto 处理。本技能不是自然语言到 IRQL 的转换器,它组合 IRQL 函数管道,仅能处理直接映射到已知选择器和简单过滤器的基本自然语言请求;通用的 NL-to-KQL 或 NL-to-IRQL 转换需使用专门的查询生成技能(单独提供)。
IRQL 是什么 IRQL 是 KQL 之上基于函数的方言,提供:统一模式——不同安全表投影为一致列名,与底层数据源无关;可组合性——小函数通过 | invoke 链接,从简单步骤构建复杂狩猎;可移植性——同一 IRQL 管道可跨不同集群/数据库运行,仅需重新指向 Get_* 原语。IRQL 不是独立语言,它是可调用的 KQL 函数,任何有效 KQL 都能与 IRQL 函数一起使用。
部署前提 IRQL 函数是存储的 KQL 函数(.create-or-alter function),必须先部署到目标数据库,本技能才能生成管道。生成管道前,需用以下查询验证目标数据库上 IRQL 是否可用:
.show functions | where Name startswith "Get_" or Name startswith "Extract_" or Name startswith "Enrich_" | project Name
如果未找到 IRQL 函数,应告知用户目标数据库未部署 IRQL,并建议改用 azure-kusto 编写原始 KQL 查询。IRQL 函数是前提条件,本技能不部署基础 IRQL 选择器。
公开示例集群(函数已预部署): 集群:https://kc7001.eastus.kusto.windows.net 数据库:ValdyTimes、JoJosHospital
要将 IRQL 移植到新集群/数据库,需创建 Get_* 选择器,将源表投影到统一模式(列名见下),然后部署提取器和富化器。只要输入模式匹配,提取器和富化器无需修改即可工作。
函数目录
-
选择器 Get_*:返回源表的投影、模式统一视图。默认使用最小形式,需要额外列时使用 _All。包括 Get_Event_Authentication(EnvTime, Hostname, ClientIp, Username, Result)及 _All(增加 Description, UserAgent, PasswordHash)、Get_Email(EnvTime, EmailSender, EmailRecipient, Subject, Url)及 _All(增加 ReplyTo, Verdict)、Get_Employees(Name, ClientIp, Email, Username, Hostname, Role)及 _All(增加 HireDate, UserAgent, Domain)、Get_Event_FileCreation(EnvTime, Hostname, Filename, Path)及 _All(增加 Username, Sha256, ProcessName)、Get_Event_NetworkInbound(EnvTime, ClientIp, Url)及 _All(增加 Method, UserAgent, StatusCode)、Get_Event_NetworkOutbound(EnvTime, ClientIp, Url)及 _All(增加 Method, UserAgent)、Get_Dns_All(EnvTime, Domain, ClientIp)、Get_Event_Process(EnvTime, ProcessCommandLine, ProcessName, Hostname, Username)及 _All(增加 ParentProcessName, ParentProcessHash, ProcessHash)、Get_SecurityAlerts_All(EnvTime, AlertType, Severity, Description, Indicators)、Get_Network_Connection_All(EnvTime, SourceIp, SourcePort, DestinationIp, DestinationPort, Protocol, Bytes)。
-
提取器 Extract_*:从现有列派生新列,在选择器之后调用。Extract_Email_Sender_Domain(T) 输入 EmailSender,增加 Domain;Extract_Employee_Firstname(T) 输入 Name,增加 Firstname;Extract_Event_Network_Domain(T) 输入 Url,增加 DomainName。
-
富化器 Enrich_*:左连接辅助函数,附加相关表上下文。Enrich_Event_Authentication_Username(T) 以 Username 为键,富化该用户的认证事件;Enrich_Ip_Employee(T) 以 ClientIp 为键,从 IP 富化员工身份;Enrich_Username_Employee(T) 以 Username 为键,从用户名富化员工身份;Enrich_Ip_Domain(T) 以 ClientIp 为键,富化解析到该 IP 的 DNS 域名;Enrich_Ip_Event_NetworkOutbound(T) 以 ClientIp 为键,富化该 IP 的出站网络;Enrich_Ip_Network_Connection(T) 以 ClientIp 为键,富化该 IP 的网络流量。
-
外部富化:Enrich_Sha256_VirusTotal(T) 来源 VirusTotal 文件报告,需要 API 密钥和 callout 策略;Get_CISA_KEV() / Enrich_CISA_KEV(T) 来源 CISA KEV 目录,需要 callout 策略。
组合规则 流程为:选择器 → 提取 → 过滤 → 富化 → 汇总/投影。步骤:以选择器开始(Get_Event_Authentication、Get_Email 等);提取派生字段 | invoke Extract_Email_Sender_Domain();过滤信号 | where Result == "Failed Login";用上下文富化 | invoke Enrich_Username_Employee();汇总/投影答案。步骤间始终使用管道(|)。提取器和富化器使用 | invoke FunctionName()。
查询生成指南:默认使用最小选择器,需要额外列时用 _All;在富化器之前链接提取器(提取器增加富化器可能用作键的列);where 过滤器尽量提前;用 summarize 做聚合,用 project 做最终列选择;以 order by + take 限制输出结尾。
示例(仅作参考展示,实际内容见原文):暴力破解检测、按收件人资历进行钓鱼分类、从指标进行后利用转枢、富化身份的疑似出站流量、外部 IP 认证异常等。更多提示和示例见 references/EXAMPLES.md。
使用的 MCP 工具:kusto_query 对 Kusto 数据库执行 IRQL 管道;kusto_table_schema_get 发现可用表和列;kusto_cluster_list 列出可用 ADX 集群;kusto_database_list 列出集群中的数据库。
在 Kusto Explorer 中打开查询(仅 Windows):可选便利功能。默认工作流是在聊天中输出 KQL,让用户手动复制到 Kusto Explorer 或 VS Code Kusto 扩展。自动启动为可选加入。始终在聊天响应中输出完整 KQL 查询,并清晰标注第 1 步(连接)和第 2 步(查询)。
限制 IRQL 函数必须预先部署,本技能不负责部署基础选择器;未部署时应改用 azure-kusto 编写原始 KQL。本技能不是通用自然语言到 IRQL 的转换器,仅处理直接映射到已知选择器和简单过滤器的基本请求。外部富化(VirusTotal、CISA KEV)需要 API 密钥或 callout 策略。自动启动 Kusto Explorer 仅限 Windows,且需用户确认;其他平台保存 .kql 文件并建议使用 VS Code Kusto 扩展或 ADX Web Explorer。关于从 IRQL 数据进行图形可视化,参见 azure-kusto-graph 和 azure-kusto-irql-graph。
分类:本技能用于 Kusto 网络安全调查的 IRQL 查询组合,属于安全与审计范畴。