如何在KQL中按AlertID聚合365Defender关联事件到单行?
365 Defender 按AlertID聚合单行数据的解决方案
针对你遇到的同一AlertID数据聚合问题,有两种更简洁且实用的处理方式,完全可以实现单行聚合的需求:
方案1:按字段聚合唯一值数组(最适合关联分析)
如果你的核心需求是和Device*Events等表做关联,直接把每个字段的所有唯一值聚合为数组是最高效的方式,避免了嵌套打包的问题:
AlertEvidence | where DetectionSource contains "Office" | where AttackTechniques contains "phish" | summarize AlertTitle = take_any(Title), // 同一AlertID的Title通常一致,取任意值即可 Timestamps = make_set(Timestamp), AccountNames = make_set(AccountName), DeviceNames = make_set(DeviceName), EmailSubjects = make_set(EmailSubject), NetworkMessageIds = make_set(NetworkMessageId), FileNames = make_set(FileName), FolderPaths = make_set(FolderPath), SHA1s = make_set(SHA1), RemoteUrls = make_set(RemoteUrl) by AlertId
这个查询会生成单行Per AlertID的结果,每个字段存储该警报下的所有唯一值数组,后续关联其他表时,直接用has_any或contains匹配数组中的值即可。
方案2:保留完整事件结构(数组包裹对象)
如果需要保留每个事件的完整字段结构,无需手动列字段,用pack_all()自动打包整行数据,再聚合为数组即可,比你之前的写法更简洁:
AlertEvidence | where DetectionSource contains "Office" | where AttackTechniques contains "phish" | extend EventDetails = pack_all() // 自动打包当前行所有字段为动态对象 | summarize AllEvents = make_set(EventDetails) by AlertId
这种方式得到的AllEvents是一个数组,每个元素对应一条原始事件的完整数据。如果需要关联其他表,可以先通过mv-expand展开数组,关联后再重新聚合,或者直接提取数组中的特定字段值进行匹配。
你之前遇到的“双重打包”其实是数组包裹对象的合理结构,并非无法处理,只是方案1的形式更适合关联分析场景。
内容的提问来源于stack exchange,提问作者Andreas Törnqvist
相关产品推荐
相关产品推荐

