IRQL 圖形函數 -- 查詢結果到視覺化
將 IRQL 圖形函數系列應用於表格結果。給定一個 KQL 或 IRQL 查詢以及使用者的圖形描述,產生一個 Lift_To_Graph 對應,並僅組合在 Kusto Explorer 中視覺化、摺疊、萃取或豐富圖形所需的儲存函數。來源查詢不需要使用 IRQL。
範圍與路由
| 請求 | 使用方式 |
|---|---|
| 將提供的 KQL/IRQL 資料列轉換為帶有圖示裝飾的視覺圖形 | 此技能:Lift_To_Graph + Graph_Render_View |
摺疊節點或應用 Extract_Node_*、Enrich_Node_* 或 Enrich_Graph_* | 此技能 |
使用 make-graph、graph-match、最短路徑、連通元件、圖形模型或快照 | azure-kusto-graph |
| 從自然語言編寫非平凡的 KQL/IRQL 調查 | 一個 Kusto 或 IRQL 查詢生成技能,然後是此技能 |
如果請求混合了視覺化和原生圖形分析,則對此技能的升力/呈現部分使用此技能,並對操作員語義使用 azure-kusto-graph。除非使用者要求原生圖形運算符,否則不要用自建的邊優先圖形取代圖形升力函數。
輸入合約
- 偏好輸入:一個能產生表格結果的工作 KQL/IRQL 查詢,加上關於所需節點、邊、標籤、圖示、萃取、豐富化或摺疊的自然語言描述。
- 此技能不是自然語言轉 KQL 或 NL 轉 IRQL 轉換器。它將現有的查詢結果轉換為圖形視覺化。對於一般的 NL 轉 KQL 或 NL 轉 IRQL,請使用專用的查詢生成技能(可另行取得)。
- 保留所提供查詢的檢索、聯結、篩選器和彙總。僅新增圖形對應所需的投影或合成 ID。
- 僅在基礎自然語言來源請求直接對應到一個已知表格或 IRQL
Get_*選取器,且具有明顯的資料行和簡單的篩選器時,才支援此類請求。請說明假定的來源,並且不要發明聯結、結構描述或調查邏輯。 - 對於非平凡的查詢建構,請先使用單獨的 Kusto/IRQL 查詢生成技能,然後再將此技能應用於其輸出。
- 如果沒有可用的查詢或輸出結構描述,且來源並非微不足道,請在產生對應之前要求提供 KQL 查詢或其結果資料行。
觸發條件
當使用者符合以下條件時使用此技能:
- 提供 KQL/IRQL 結果並要求 IRQL 圖形視覺化或對應
- 提及
Lift_To_Graph、Graph_Render_View或Graph_Fold_By_Property - 要求在 Kusto Explorer 中使用圖示裝飾的節點/邊對應
- 想要根據共享屬性摺疊/折疊節點
- 透過
Extract_Node_*、Enrich_Node_*或Enrich_Graph_*請求圖形萃取或豐富化
請勿僅因 graph-match、圖形路徑/元件、持久性圖形或通用 make-graph 建構而啟動此技能;這些屬於 azure-kusto-graph。
不是自然語言轉 KQL/IRQL 轉換器。 輸入通常應該是一個需要圖形視覺化其結果的工作 KQL 或 IRQL 查詢。基礎 NL 來源請求僅適用於簡單的單一表格/選取器案例。對於一般的 NL 轉 KQL 或 NL 轉 IRQL,請使用專用的查詢生成技能(可另行取得)。
環境
- 叢集:
https://kc7001.eastus.kusto.windows.net - 資料庫:
ValdyTimes、JoJosHospital(已預先部署圖形函數) - 呈現:Kusto Explorer 桌面應用程式(make-graph 視覺化視窗)
- 工具:
kusto_query(透過 Azure MCP Server)
函數預檢
Lift_To_Graph 和 Graph_Render_View 是儲存函數,而非內建的 Kusto 運算符。在針對目標資料庫產生或執行升力管線之前,請檢查部署了哪些函數:
.show functions
| where Name in~ ("Lift_To_Graph", "Graph_Render_View", "Graph_Fold_By_Property")
| project Name
Lift_To_Graph和Graph_Render_View是必要的。Graph_Fold_By_Property僅在要求摺疊時是必要的。- 在使用任何
Extract_Node_*、Enrich_Node_*或Enrich_Graph_*函數之前請先檢查;當無法使用時省略可選的豐富化,除非使用者希望部署它。 - 如果缺少必要的函數,且您有權修改資料庫,請在使用者確認後再進行部署。然後使用 references/DEPLOY_IRQL_FUNCTIONS.md 中的
.create-or-alter function定義。執行相關的.create-or-alter區塊,然後重新執行預檢檢查以確認。 - 如果您沒有修改權限,請告知使用者缺少哪些函數,並引導他們前往
references/DEPLOY_IRQL_FUNCTIONS.md進行手動部署。
IRQL 圖形函數系列
Lift_To_Graph(T, mappingJson)
將任何表格 KQL 結果轉換為統一的節點 + 邊表格。
輸入:任何表格 T + 一個 JSON 對應字串。
輸出:EntityType = "node" 或 "edge" 的資料列,準備好供 make-graph 使用。
Graph_Render_View(T)
接收 Lift_To_Graph 輸出,分割節點/邊,並呼叫 make-graph 以開啟 Kusto Explorer 的圖形視窗。
Graph_Fold_By_Property(T, NodeType, PropertyName)
將共用屬性值的特定類型節點摺疊為單一節點。自動重新接線邊緣。
圖形萃取與豐富化函數
這些是必須已部署在目標資料庫上的額外儲存函數。它們未包含在 references/DEPLOY_IRQL_FUNCTIONS.md 中。在將其納入管線之前,請使用 .show functions 驗證可用性。
| 函數 | 操作 | 關鍵屬性 |
|---|---|---|
Extract_Node_Email_Sender_Domain(T, displayName) | 將 Domain 新增到節點屬性 | EmailSender |
Extract_Node_Employee_Firstname(T, displayName) | 將 Firstname 新增到節點屬性 | Name |
Extract_Node_Event_Network_Domain(T, displayName) | 將 DomainName 新增到節點屬性 | Url |
Enrich_Node_Ip_Employee(T, displayName) | 將員工資訊新增到 IP 節點 | ClientIp |
Enrich_Node_Username_Employee(T, displayName) | 將員工資訊新增到使用者節點 | Username |
Enrich_Node_Event_Authentication_Username(T, displayName) | 新增驗證上下文 | Username |
Enrich_Node_Ip_Domain(T, displayName) | 新增 DNS 網域 | ClientIp |
Enrich_Node_Ip_Event_NetworkOutbound(T, displayName) | 新增傳出事件 | ClientIp |
Enrich_Graph_Ip_Employee(T, mappingJson) | 使用員工節點擴展圖形 | ClientIp |
Enrich_Graph_Username_Employee(T, mappingJson) | 使用員工節點擴展圖形 | Username |
Enrich_Graph_Event_Authentication_Username(T, mappingJson) | 使用驗證節點擴展 | Username |
對應 JSON 結構描述
JSON 對應有兩個陣列:node_types 和 edges。
node_types[]
| 欄位 | 必要 | 描述 |
|---|---|---|
type | 是 | 節點類型標籤(例如 "User"、"Host"、"IP") |
id | 是 | 節點 ID 的前綴;通常與類型相同 |
key | 是 | 其值成為節點身分識別的資料行名稱 |
props | 是 | 要作為節點屬性攜帶的資料行陣列 |
defaults | 否 | 為空值/空屬性提供備用值的物件 |
defIcon | 否 | 此節點類型的預設圖示 URL |
displayName | 否 | 用於顯示標籤的資料行(預設為 id) |
color | 否 | 從中取得顏色的資料行 |
size | 否 | 從中取得大小的資料行 |
edges[]
| 欄位 | 必要 | 描述 |
|---|---|---|
type | 是 | 邊類型標籤(例如 "AuthenticatesTo"、"SentEmail") |
source | 是 | {"id": "<前綴>", "type": "<NodeType>"} |
target | 是 | {"id": "<前綴>", "type": "<NodeType>"} |
props | 否 | 要作為邊屬性攜帶的資料行陣列 |
displayName | 否 | 邊標籤的資料行 |
color | 否 | 邊顏色的資料行 |
圖示儲存庫
使用來自 https://raw.githubusercontent.com/benc-uk/icon-collection/master/azure-icons/ 的圖示:
- IP:
Public-IP-Addresses-(Classic).svg - 主機/VM:
Virtual-Machine.svg - 使用者:
Users.svg - 電子郵件:
Mailbox.svg(或azure-cds/command-1070-Mail.svg) - 程序:
App-Services.svg - 檔案:
Storage-Accounts.svg - 警示:
Activity-Log.svg - 網域:
DNS-Zones.svg
對應產生規則
根據提供的查詢資料列和使用者的圖形描述,依以下步驟產生對應 JSON:
- 識別實體 -> 每個不同的名詞變成一個
node_type - 識別關係 -> 每個動詞/介係詞變成一個
edge - 對應到資料行 -> 使用所提供查詢產生的實際資料行;切勿假設不可用的資料行
- 設定方向 -> 來源是行動者,目標是被行動者
- 新增屬性 -> 包含與調查相關的資料行(時間戳記、結果、雜湊值)
- 指派圖示 -> 根據實體類型從上述圖示集中選取
資料行參考(IRQL 統一結構描述)
| 實體 | 關鍵資料行 | 可用屬性 |
|---|---|---|
| 使用者 | Username | Username、Name、Role、Email |
| 主機 | Hostname | Hostname |
| IP | ClientIp | ClientIp |
| 電子郵件訊息 | Subject | EnvTime、Subject、Verdict、Url |
| 寄件者 | EmailSender | EmailSender、Domain |
| 收件者 | EmailRecipient | EmailRecipient |
| 程序 | ProcessName | EnvTime、ProcessName、ProcessCommandLine、ProcessHash |
| 檔案 | Filename | EnvTime、Filename、Path、Sha256 |
| 網域 | DomainName | DomainName |
| 驗證事件 | (合成 ID) | EnvTime、UserAgent、Result、Description |
函數選擇
- 從提供的 KQL/IRQL 表格管線開始。
- 使用
Lift_To_Graph(mapping)建立圖形實體。 - 僅在請求且與對應的索引鍵相容時,新增
Extract_Node_*、Enrich_Node_*或Enrich_Graph_*。 - 僅在請求分組/摺疊時,新增
Graph_Fold_By_Property()。 - 以
Graph_Render_View()結束視覺輸出。 - 預檢為管線選取的精確儲存函數。
管線模式
// 1. 保留提供的 KQL 或 IRQL 查詢
<輸入查詢>
// 2. 升力到圖形
| invoke Lift_To_Graph(<mapping_json>)
// 3. 選擇性地萃取或豐富化圖形實體
| invoke <Extract_Node_* | Enrich_Node_* | Enrich_Graph_*>()
// 4. 選擇性地在請求時摺疊節點
| invoke Graph_Fold_By_Property("<NodeType>", "<PropertyName>")
// 5. 呈現
| invoke Graph_Render_View()
範例
有關其他提示和實作範例,請參閱 references/EXAMPLES.md。
驗證圖形:IP -> AuthEvent -> User -> Host
輸入查詢:Get_Event_Authentication_All | where Result == "Failed Login" | take 200
圖形請求:「顯示 IP、驗證事件、使用者和主機;依結果摺疊事件。」
let auth_mapping = '{"node_types":[{"type":"SrcIp","id":"SrcIp","key":"ClientIp","props":["ClientIp"],"defaults":{},"defIcon":"https://raw.githubusercontent.com/benc-uk/icon-collection/master/azure-icons/Public-IP-Addresses-(Classic).svg"},{"type":"Host","id":"Host","key":"Hostname","props":["Hostname"],"defaults":{},"defIcon":"https://raw.githubusercontent.com/benc-uk/icon-collection/master/azure-icons/Virtual-Machine.svg"},{"type":"User","id":"User","key":"Username","props":["Username"],"defaults":{},"defIcon":"https://raw.githubusercontent.com/benc-uk/icon-collection/master/azure-icons/Users.svg"},{"type":"AuthEvent","id":"AuthEvent","key":"AuthEventId","props":["AuthEventId","EnvTime","UserAgent","Result","Description"],"defaults":{"Result":"unknown"},"defIcon":"https://raw.githubusercontent.com/benc-uk/icon-collection/master/azure-icons/Activity-Log.svg"}],"edges":[{"type":"RequestsAuth","source":{"id":"SrcIp","type":"SrcIp"},"target":{"id":"AuthEvent","type":"AuthEvent"},"props":["EnvTime"]},{"type":"TargetsUser","source":{"id":"AuthEvent","type":"AuthEvent"},"target":{"id":"User","type":"User"},"props":["EnvTime"]},{"type":"AgainstHost","source":{"id":"AuthEvent","type":"AuthEvent"},"target":{"id":"Host","type":"Host"},"props":["EnvTime"]}]}';
Get_Event_Authentication_All
| extend AuthEventId = strcat(Username, "_", Hostname, "_", EnvTime)
| where Result == "Failed Login"
| take 200
| invoke Lift_To_Graph(auth_mapping)
| invoke Graph_Fold_By_Property("AuthEvent", "Result")
| invoke Graph_Render_View()
電子郵件圖形:寄件者 -> 郵件 -> 收件者
輸入查詢:Get_Email_All | take 400
圖形請求:「視覺化寄件者到郵件到收件者的流程,並依判決摺疊郵件。」
let mail_mapping = '{"node_types":[{"type":"EmailMessage","id":"Message","key":"Subject","props":["EnvTime","Subject","Verdict"],"defaults":{},"defIcon":"https://raw.githubusercontent.com/benc-uk/icon-collection/master/azure-icons/Media-File.svg"},{"type":"Sender","id":"Email","key":"EmailSender","props":["EmailSender"],"defaults":{},"defIcon":"https://raw.githubusercontent.com/benc-uk/icon-collection/master/azure-cds/command-1070-Mail.svg"},{"type":"Recipient","id":"Email","key":"EmailRecipient","props":["EmailRecipient"],"defaults":{},"defIcon":"https://raw.githubusercontent.com/benc-uk/icon-collection/master/azure-cds/command-1070-Mail.svg"}],"edges":[{"type":"SentBy","source":{"id":"Message","type":"EmailMessage"},"target":{"id":"Email","type":"Sender"},"props":["EnvTime","Verdict"]},{"type":"DeliveredTo","source":{"id":"Message","type":"EmailMessage"},"target":{"id":"Email","type":"Recipient"},"props":["EnvTime","Verdict"]}]}';
Get_Email_All
| take 400
| invoke Lift_To_Graph(mail_mapping)
| invoke Graph_Fold_By_Property("EmailMessage", "Verdict")
| invoke Graph_Render_View()
可疑網域調查(端到端)
基礎來源請求:「使用這些可疑網域的傳出網路事件,並繪製以員工姓名豐富化的 IP 對網域連線圖形。」
這是有限的備用方案:一個已知的選取器、一個萃取器和一個直接篩選器。
let suspicious_domain_mapping = '{"node_types":[{"type":"IP","id":"IP","key":"ClientIp","props":["ClientIp"],"defaults":{},"defIcon":"https://raw
…
[已截斷以進行翻譯]