基于KQL的文件数据外渗统计平线异常排查求助
问题原因与解决方案
问题根源
- 仅通过
InitiatingProcessAccountName关联DeviceNetworkEvents和DeviceFileEvents会产生笛卡尔积:同一个账户的所有网络事件会和该账户的所有符合条件的文件事件无差别配对,完全忽略事件的时间关联性和进程唯一性。 - 这种无限制关联会导致所有时间窗口的统计结果都包含该账户下所有匹配的文件,最终出现每日数据完全相同的平线。
修正后的查询方法
要准确统计每日外渗文件,需同时关联进程ID和时间窗口,确保网络事件与对应的文件操作属于同一设备的同一进程,且时间上存在合理关联:
DeviceNetworkEvents // 先筛选疑似外渗的出站网络事件 | where ActionType has "NetworkConnection" and RemoteType == "Internet" | project NetworkTimestamp=Timestamp, InitiatingProcessAccountName, InitiatingProcessId, DeviceName, RemoteIP | join kind=inner ( DeviceFileEvents | where FileName endswith ".docx" or FileName endswith ".pptx" or FileName endswith ".xlsx" or FileName endswith ".pdf" or FileName endswith ".txt" or FileName endswith ".zip" | project FileTimestamp=Timestamp, InitiatingProcessAccountName, InitiatingProcessId, FileName, FileSize, DeviceName ) on InitiatingProcessAccountName, InitiatingProcessId, DeviceName // 限定时间窗口:文件操作与网络事件的时间差不超过60分钟(可按需调整) | where abs(datetime_diff('minute', NetworkTimestamp, FileTimestamp)) <= 60 // 去重避免同一文件重复统计 | distinct FileName, InitiatingProcessAccountName, bin(NetworkTimestamp, 1d) // 统计每日文件数量与总大小 | summarize FilesSent = dcount(FileName), TotalExfilSize = sum(FileSize) by bin(NetworkTimestamp, 1d), InitiatingProcessAccountName | render linechart
关键优化点
- 新增
InitiatingProcessId和DeviceName关联,锁定同一设备的同一进程操作 - 加入时间窗口过滤,保证文件操作与网络传输的逻辑关联性
- 提前筛选出站网络事件,减少无效关联数据
- 增加
distinct去重,避免同一文件被重复统计 - 新增
TotalExfilSize统计,补充外渗数据量维度
参考查询逻辑(翻译自指定参考内容)
原参考内容的核心逻辑为:检测员工离职后的异常数据外渗行为,步骤如下:
- 从
IdentityDirectoryEvents中捕获员工账户禁用/删除的离职事件 - 关联
DeviceNetworkEvents与DeviceFileEvents,筛选离职后该账户发起的文件传输行为 - 统计异常外渗事件并触发告警
内容的提问来源于stack exchange,提问作者Dirk Pitt
相关产品推荐
相关产品推荐

