
log-horizon v0.9.0
Microsoft Sentinel SIEM 日志源分析器
Microsoft Sentinel SIEM 日志源分析器
我回答过无数次 “我们到底从这些日志中得到了什么?” 或 “Microsoft Sentinel 的推荐日志是什么?” 这样的问题。答案总是取决于很多因素,但我们可以给出通用的建议。所以我就在这里构建了这个工具。
Log Horizon 连接到你的 Microsoft Sentinel 工作区(可选地连接到 Defender XDR),遍历你正在引入的每个日志表,并告诉你是否能从中获得安全价值,还是只是在烧钱。它对表进行分类,根据你的检测规则对其进行评分,并给出带有节省估算的具体建议。
重要提示:这是一种通用方法。如果你知道某个日志源对你的环境很重要,那么该上下文始终优先于此工具告诉你的内容。分类只是一个起点,并非绝对真理。
想了解更多?我在博客上写了一些关于 Log Horizon 的文章:
功能
| 功能 | 描述 |
|---|---|
| 分类引擎 | 包含 481 条目的知识库,覆盖 240+ 连接器、22 个类别,具有生命周期状态(已弃用/旧版及替换表),并为未知表提供自动启发式回退 |
| 成本-价值评分 | 按表的成本层级与检测层级矩阵,结合综合评估(高价值到低价值),并根据观察到的计划(Analytics、Basic、Data Lake)定价 |
| 建议 | 13 种优先操作类型:数据湖或 Basic 候选、零检测表、XDR 流式传输浪费、引入时过滤、拆分候选、计划使用、已弃用源、保留不足、XDR 检查器和检测分析器发现,每种都带有节省估算 |
| 检测映射 | 将分析规则、搜寻查询和 XDR 检测映射到每个表,以发现覆盖缺口 |
| 关联标签 | 检测规则描述中的 #DONT_CORR# / #INC_CORR# 标签,并标记被排除在 Defender 关联之外的规则 |
| 保留合规性 | 根据行业标准和安全最佳实践,将实际保留期与建议的最低保留期进行比较 |
| SOC 优化 | 从 Security Insights API 拉取 Microsoft 自身的 SOC 改进建议 |
| 关键词缺口分析 | 根据供应商/产品关键词,标记你应该引入但尚未引入的表 |
| 转换发现 | 发现针对工作区的数据收集规则(DCR)(按目标过滤的订阅列表、工作区转换 DCR 和工作区关联),解析内联和多阶段转换,并标记每个操作(过滤、投影、列删除、富化、聚合) |
| 拆分表检测 | 识别 _SPLT_CL 拆分表,并在分类引擎中将其链接回父表 |
| 拆分 KQL 生成器 | 从精选知识库、实时规则分析和社区字段频率统计生成可直接用于门户的拆分 KQL——仅条件格式,可直接粘贴到 Sentinel 拆分规则编辑器中。字段列表与表的实时架构相交;任何不存在的字段都会报告为已丢弃 |
| 检测分析器 | 使用事件结果(自动关闭率、误报率和事件量百分位数)对分析规则的潜在噪音进行评分 |
| XDR 检查器 | 添加以 XDR 为重点的咨询层:流式传输覆盖检查,以及针对 XDR 相关遥测的一年数据湖保留指导 |
| 自定义分类 | 提供你自己的 JSON 以添加或覆盖内置分类数据库 |
| 收集缓存 | 收集的工作区数据在本地缓存(默认 60 分钟),因此重新运行和重新导出只需几秒钟;可使用 -NoCache 选择退出 |
| 主权云 | ARM、Log Analytics 和 Graph 端点遵循已登录的 Azure 环境(公有云、美国政府、中国) |
| 交互式 TUI | Spectre.Console 仪表板,带菜单、彩色编码表、下钻、保留向导和 ASCII 艺术 |
| 导出 | JSON、Markdown 或静态 HTML 报告,便于与团队共享 |
免责声明
[!CAUTION] 免责声明
此工具是在 AI 的帮助下开发和维护的。 请谨慎使用此解决方案,并在生产环境中运行之前始终了解你正在运行的内容。开发者对任何漏洞或问题不承担任何责任。
下载、安装或使用此工具,即表示你确认已阅读、理解并同意这些条款。
先决条件
| 你需要什么 | 版本 |
|---|---|
| PowerShell | 7.0+ |
| Az 模块 | Az.Accounts |
| 其他模块 | PwshSpectreConsole 2.6.3+ |
| 可选 | Microsoft.Graph.Authentication(用于以已登录用户身份使用 -IncludeDefenderXDR) |
端点遵循当前 Connect-AzAccount 会话的 Azure 环境,因此 Azure Government 和 Azure China 工作区无需额外参数即可工作。当没有可用环境时,使用公有云值。
如果你尚未登录 Azure,模块将为你启动 Connect-AzAccount。如果你已登录,它将直接继续。
权限:工作区上的 Log Analytics Reader 和 Microsoft Sentinel Reader 即可覆盖分析。转换发现还需要订阅或资源组上的 Microsoft.Insights/dataCollectionRules/read(Monitoring Reader);如果没有,运行将继续并打印一条警告,指出缺少的权限。-IncludeDefenderXDR 使用 Microsoft Graph 和 CustomDetection.Read.All,对于已登录用户,这意味着需要可选的 Microsoft.Graph.Authentication 模块。
快速开始
非常简单:```powershell
Grab the dependencies
Install-Module -Name Az.Accounts -Scope CurrentUser Install-Module -Name PwshSpectreConsole -Scope CurrentUser
Clone and import
git clone https://github.com/lnfernux/log-horizon Import-Module ./log-horizon/LogHorizon.psd1
## 使用方法
### 基础操作
首先连接到 Azure,并确保选择了正确的账户和订阅:```powershell
Connect-AzAccount
然后我们可以调用该工具:```powershell Invoke-LogHorizon -SubscriptionId '00000000-0000-0000-0000-000000000000' -ResourceGroup 'rg-sentinel' -WorkspaceName 'my-sentinel-ws'
<img width="860" height="842" alt="{F4FFA929-B24F-490C-BD3D-F75E214BCD93}" src="https://assets.kitploit.com/production/public/readmes/13110/ff9d1da85043d02a216df72913ecf63520310b8d820b1bd1278b8e4aca718494.png" />
此外,还有一个菜单可以深入查看其他输出:
<img width="395" height="223" alt="{83CE9E6E-F373-49CD-BE05-182DB69F36BE}" src="https://assets.kitploit.com/production/public/readmes/13110/0606a575b10640bd13ebb87b930f74b2438167b5578cb843b412b4fcf273fc26.png" />
### 关键词缺口 + Defender XDR
想知道你是否遗漏了与特定供应商相关的表?加入一些关键词。如果你还想要 XDR 分析,请添加 `-IncludeDefenderXDR`。```powershell
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -Keywords 'CrowdStrike','AWS','Okta' -IncludeDefenderXDR
检测分析器
基于事件和自动化规则启用规则质量/噪音分析:```powershell Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -IncludeDetectionAnalyzer -DetectionLookbackDays 90
### 导出报告```powershell
# JSON
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -Output json -OutputPath ./report.json
# Markdown
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -Output markdown -OutputPath ./report.md
# Static HTML (self-contained, no JS, works offline)
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -Output html -OutputPath ./report.html
# Auto-generate timestamped filename by pointing at a directory
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -Output html -OutputPath ./reports/
管理表保留期和类型
现在您可以直接从交互式 TUI 中更新表保留期和表类型:
- 正常打开
Invoke-LogHorizon,然后从主菜单中选择 管理表保留期和类型,以进行批量保留期或类型更新。 - 打开 日志调优 / 转换 > 评估特定表,然后选择 管理此表的保留期/类型,以进行单表更改。
对于脚本编写或自动化操作,请使用专用的公共命令:```powershell
Preview a single-table change (prints a Table / Plan / Interactive / Total / Status / Reason table, applies nothing)
Set-LogHorizonTableRetention -SubscriptionId '...' -ResourceGroupName 'rg' -WorkspaceName 'ws' ` -TableName 'SigninLogs' -TotalRetentionInDays 365 -WhatIf
Switch tables to Basic and set total retention
Set-LogHorizonTableRetention -SubscriptionId '...' -ResourceGroupName 'rg' -WorkspaceName 'ws' ` -TableName 'AzureDiagnostics','VMConnection' -TargetPlan Basic -TotalRetentionInDays 730
Use -1 for inherit/default semantics
RetentionInDays = inherit workspace default
TotalRetentionInDays = remove long-term retention
Set-LogHorizonTableRetention -SubscriptionId '...' -ResourceGroupName 'rg' -WorkspaceName 'ws' ` -TableName 'SigninLogs' -RetentionInDays -1 -TotalRetentionInDays -1
### 非交互式 / CI 模式
跳过交互式 TUI,直接导出到文件,适用于流水线或定时运行:```powershell
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -NonInteractive -Output json -OutputPath ./reports/
如果省略 -Output,分析对象将返回到管道中,以便你可以将其传递到你自己的逻辑中。
集合缓存
数据收集阶段(使用情况、规则、事件、表、DCR)默认会被缓存,因此针对同一工作区重新运行(例如导出第二种格式或重新打开 TUI)只需几秒钟,而不是几分钟。缓存位于 $env:LOCALAPPDATA\LogHorizon\cache 下(可通过 -CachePath 覆盖),每个订阅、资源组、工作区、-DaysBack、-DetectionLookbackDays、-IncludeDefenderXDR、-IncludeDetectionAnalyzer、三个价格参数及模块版本的组合对应一个文件。早于 -CacheMaxAgeMinutes(默认 60)的条目会被忽略,并且每次保存都会删除过期的条目,因此该文件夹不会累积来自其他参数集或旧版本的文件。令牌永远不会写入缓存;每次调用都会执行身份验证,因此保留向导始终拥有实时凭据。
缓存文件是纯文本 Clixml。使用 -IncludeDetectionAnalyzer 时,它包含来自你工作区的事件标题、编号、状态和分类;事件所有者、规则作者和指定所有者身份不会被收集。在共享机器上使用 -NoCache,或将 -CachePath 指向具有所需访问控制的位置。```powershell
Force a fresh collection and refresh the cache
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -RefreshCache
Never read or write the cache
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -NoCache
Accept cached data for up to a day
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -CacheMaxAgeMinutes 1440
### 日志调优与拆分 KQL
交互式 TUI 包含一个 **日志调优 / 转换** 菜单,提供实时调优建议(基于已部署规则和搜寻查询中的字段使用情况)、知识库拆分 KQL,以及按表评估器。每个 KQL 块仅包含条件,可直接粘贴到 Sentinel 拆分规则编辑器中,并带有来源归属(知识库、规则分析或两者结合)。
### 自定义定价
默认价格为西欧简化即用即付(PAYG)美元计价:分析日志 5.59 美元/GB,基础日志 1.15 美元/GB,数据湖 0.20 美元/GB(摄取 0.07 + 处理 0.13)。每个表根据 `Usage` 表中观察到的计划定价,免费状态来自 `Usage.IsBillable`。容量使用计费 GB(1000 MB)。如果您的承诺层级不同:```powershell
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -PricePerGB 4.61 -BasicPricePerGB 1.15 -LakePricePerGB 0.20
所有参数
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
-SubscriptionId | string | 是 | - | Azure 订阅 ID |
-ResourceGroup | string | 是 | - | 包含 Sentinel 工作区的资源组 |
-WorkspaceName | string | 是 | - | Log Analytics 工作区名称 |
-WorkspaceId | string | 否 | - | 工作区 ID(省略时自动解析) |
-Output | string | 否 | - | 导出格式:json、markdown / md 或 html(别名 -o) |
-OutputPath | string | 否 | - | 导出的文件或目录路径。现有目录或带尾部分隔符的路径会生成带时间戳的文件名;无扩展名的文件名会附加对应格式的扩展名;缺失的目录会被自动创建 |
-Keywords | string[] | 否 | - | 用于差距分析的关键词(例如 'AWS','CrowdStrike',别名 -kw) |
-IncludeDefenderXDR | switch | 否 | - | 包含 Defender XDR 自定义检测分析 |
-IncludeDetectionAnalyzer | switch | 否 | - | 使用事件和自动化规则进行逐规则噪声检测分析 |
-DetectionLookbackDays | int | 否 | 90 | 基于事件/自动化规则的检测分析查询窗口(1-365 天) |
-DaysBack | int | 否 | 90 | 用量数据的查询窗口(1-365 天) |
-PricePerGB | decimal | 否 | 5.59 | Sentinel Analytics 层每 GB 摄取价格(别名 -ppgb) |
-BasicPricePerGB | decimal | 否 | 1.15 | Basic Logs 每 GB 价格 |
-LakePricePerGB | decimal | 否 | 0.20 | Auxiliary / Data Lake 层每 GB 价格(摄取 + 处理) |
-NonInteractive | switch | 否 | - | 跳过 TUI 仪表板并直接导出(若省略 -Output,则将数据返回管道) |
-CustomClassificationPath | string | 否 | - | 自定义 JSON 文件的路径,用于添加或覆盖分类(别名 -clf) |
-NoCache | switch | 否 | - | 不读取或写入收集缓存 |
-RefreshCache | switch | 否 | - | 收集新数据并覆盖缓存条目 |
-CacheMaxAgeMinutes | int | 否 | 60 | 可复用的缓存条目最大年龄(1-10080) |
-CachePath | string | 否 | $env:LOCALAPPDATA\LogHorizon\cache | 缓存文件目录 |
底层原理
因此共有四个阶段。
1. 数据收集
该模块连接到 Azure,并从 Log Analytics、Security Insights、Azure Monitor 和 Microsoft Graph API 拉取数据。每次调用都会经过重试包装器(429、5xx 和传输错误),并且除非设置了 -NoCache,否则收集的数据会在本地缓存以供下次运行使用。
| 数据源 | API | 我们获取的内容 |
|---|---|---|
| 表用量 | Usage 表(KQL) | 查询窗口内每个表的摄取量、计划和计费标志 |
| 分析规则 | Security Insights REST | 活动检测规则 + 它们命中的表 + 关联标签,以及非 KQL 规则类型的隐式表消费者 |
| 搜寻查询 | Log Analytics 已保存搜索 REST | 已保存的搜寻查询 + 引用的表 |
| 数据连接器 | Security Insights REST | 已安装的连接器清单 |
| SOC 优化 | Security Insights REST(预览版) | Microsoft 内置的 SOC 建议 |
| 表保留 | Log Analytics Tables REST | 每个表的保留期、存档、计划(Analytics/Basic/Auxiliary)、继承默认标志和架构列 |
| 数据收集规则 | Azure Monitor REST | 针对工作区的 DCR(订阅列表、工作区转换 DCR、关联)及其转换 |
| Defender XDR | Microsoft Graph | XDR 自定义检测规则(可选;委托的 CustomDetection.Read.All 或 Az Graph 令牌) |
| 事件 | Security Insights REST | 事件结果(状态/分类)、时间线以及用于规则质量评分的规则关联提示 |
| 自动化规则 | Security Insights REST | 规则级关闭事件操作和标题匹配条件,用于自动关闭归因 |
| SentinelHealth | Log Analytics KQL | 带事件编号的自动化规则运行事件,用于确定性的自动关闭归因(可选,需要运行状况监控) |
2. 分类
每个表都会经过两轮分类:
首先,直接对照 Data/log-classifications.json 中 481 条目的知识库进行查找。每个条目包含连接器名称、主要/次要分类、安全类别、MITRE 数据源映射、推荐的定价层和保留期,以及可选的生命周期标志(已弃用/旧版及替换表、XDR 可流式传输性、平台)。
如果没有匹配项,则按以下顺序触发启发式规则:
- 名称包含安全令牌,如
Alert、Incident、Threat、Signin、Logon、Audit、Risk、Detection(在 PascalCase 单词开头匹配)-> 主要 - 名称看起来像基础设施遥测:
Flow、Metric、Diagnostic、Perf、Heartbeat、Health、Inventory、Usage-> 次要 - 有活动分析规则指向它 -> 主要
- 带有 Microsoft 前缀的内置表(
AAD、Microsoft、Azure、Defender、Purview、Entra、Sentinel、Office、Intune、Windows...)-> 主要,标记为需审查并添加到数据库 - 通用
*Log/*Logs名称 -> 次要 - 高容量(>10 GB/月)且无任何检测 -> 次要
- 以上均不符合 -> 未知
3. 成本价值评分
每个表都会在几个维度上评分:
- 成本层:免费 / 低(<1 GB)/ 中(1-10 GB)/ 高(10-50 GB)/ 极高(>50 GB)
- 检测层:无 / 低(1-2 条规则)/ 中(3-9 条规则)/ 高(10+ 条规则)
- 评估:高价值 / 良好价值 / 覆盖缺失 / 优化 / 低价值 / 利用不足 / 免费层 / 平台
- 覆盖率 %:至少有一条分析规则或搜寻查询引用的表所占百分比,计算公式为
tablesWithRules / totalTables * 100。单表覆盖率汇总了通过解析 KQL 中的表名找到的分析规则 + 搜寻查询。 - 隐式覆盖:不含 KQL 的规则类型仍会消耗表。
Data/implicit-consumers.json映射了它们(Threat Intelligence 匹配 ->ThreatIntelIndicators/ThreatIntelObjects,Fusion ->SecurityAlert/Anomalies,UEBA ->BehaviorAnalytics/UserPeerAnalytics/IdentityInfo,Microsoft 事件创建 ->SecurityAlert)。这些类型的已启用规则计入有效覆盖率,每个表报告CoverageSource为kql、xdr、implicit、platform或none。Sentinel 为自身写入的平台表(SecurityIncident、SentinelHealth、Watchlist、Usage...)永远不会被标记为覆盖缺失,并获得Platform评估。 - 只有已启用的分析规则和已启用的 Defender 自定义检测才计入覆盖率。
然后,模块生成建议(13 种类型):
| 类型 | 触发条件 | 建议操作 |
|---|---|---|
| Data Lake | 次要 + 高成本 + 检测少,且表支持 Auxiliary 计划(仅支持 Basic 时回退为 Basic 计划建议) | 迁移到 Auxiliary/Data Lake 层;节省额为当前成本减去相同容量在 lake(或 Basic)费率下的成本 |
| 低价值 | 高成本 + 零检测 | 添加规则、过滤或迁移到数据湖 |
| XDR 优化 | XDR 流式传输 + 0 条 Sentinel 规则 + 存在 XDR 规则 | 停止流式传输,改用统一的 XDR 门户 |
| 覆盖缺失 | 主要 + 零检测(非平台表) | 编写分析规则以从数据中获取价值 |
| 摄取时过滤 | 主要 + >20 GB + <=3 条检测 | 应用摄取时转换以削减容量 |
| 拆分候选 | 主要 + 高容量 + 有检测 + 无现有转换 | 拆分表,使高价值行保留在 Analytics 上,其余移至 Data Lake |
| 计划使用 | Usage 行显示多个计划,或配置的计划与 Usage 观察到的不同 | 审查计划转换是否符合预期 |
| 已弃用源 | 数据库中标记为已弃用或旧版的表仍在摄取 | 将检测迁移到替换表,然后停用旧连接器。仅供参考:不声称节省费用,因为摄取是转移而非消失 |
| 保留不足 | 工作区或表保留低于 90 天基线 | 增加总/存档保留期以满足监管指导 |
| 保留改进 | 付费的非平台表满足 90 天但低于类别建议 | 考虑更长的总保留期 |
| 交互式低于基线 | Analytics 表的交互式(热)保留低于 90 天 | 将交互式保留提高到 Sentinel 包含的 90 天,除非短热窗口是有意为之 |
| XDR 检查器 | 已知 Defender XDR 表未流式传输、流式传输但无覆盖、未转发到 Data Lake,或低于一年建议期 | 审查 XDR 遥测的流式传输和保留 |
| 检测分析器 | 规则评分 >= 70 且至少有 5 个事件(使用 -IncludeDetectionAnalyzer) | 调整或禁用噪声规则 |
建议排序一次,高 > 中 > 低,然后按估计节省额排序,所有输出(JSON、Markdown、HTML、TUI)都保持该顺序。
4. 检测分析器(噪声评分)
当您传入 -IncludeDetectionAnalyzer 时,模块会获取近期事件和自动化规则,然后对每条已启用的分析规则进行潜在噪声评分。
逐规则指标(根据事件数据计算):
| 指标 | 计算方式 |
|---|---|
| 事件总数 | 关联到该规则的事件数量 |
| 自动关闭比率 | 由自动化规则关闭的事件 ÷ 总事件数。主要来源:SentinelHealth 表(按已启用的关闭事件或 playbook 规则的自动化规则运行,按事件编号匹配)。回退:自动化规则条件匹配(分析规则 ID、标题和严重性条件,按 Sentinel 的方式 AND 组合)。条件仅为状态/战术/实体的规则被视为适用于每个事件。 |
| 误报比率 | 分类为误报的事件 ÷ 总事件数 |
噪声评分公式:
每个指标都会转换为所有至少有一个事件的规则中的百分位排名。综合评分是加权混合:``` Score = (Volume_percentile × 0.35) + (AutoClose_percentile × 0.40) + (FalsePositive_percentile × 0.25)
- **卷百分位数(35%)**:某规则生成的事件数相对于其他规则的多少。
- **自动关闭百分位数(40%)**:事件被自动化规则自动关闭的频率(权重最高,因为自动关闭是低价值警报的最强信号)。
- **误报百分位数(25%)**:分析师将结果归类为误报的频率。
**评分阈值**:
| 评分 | 标签 | 含义 |
|---|---|---|
| ≥ 70 | 嘈杂 | 规则可能需要调整或禁用 |
| ≥ 50 | 关注 | 规则显示出嘈杂的早期迹象 |
| < 50 | 健康 | 规则处于正常范围内 |
| 不适用 | - | 规则没有关联事件,或少于3条规则有事件,因此没有可排名的对象 |
事件按分析规则ID分桶(回退到规则名称,再回退到标题),因此共享显示名称的两条规则会分别评分。
评分 ≥ 70 且至少有5个事件的规则会自动在“建议”视图中作为**高优先级建议**呈现。
### 5. 交互式仪表板
主菜单提供以下视图:
- **仪表板**:概览统计、成本最高的前10张表(已弃用和旧版源带有徽章)、覆盖率条、保留合规性摘要、关联排除提示
- **查看建议**:按优先级排序的操作及预估月度节省,超过10项时可展开显示完整列表
- **查看检测评估**:成本-价值矩阵摘要、每张表的规则和狩猎查询覆盖率、主要/次要下钻、关联排除规则列表
- **查看检测分析器**:基于百分位数的嘈杂规则排名及关闭质量指标(当你使用 `-IncludeDetectionAnalyzer` 时)、可搜索的规则浏览器
- **查看SOC优化**:微软自身的改进建议及下钻
- **查看保留评估**:低于建议最低保留期的表,显示当前与建议保留期、计划类型和缺口,外加XDR咨询行
- **查看数据转换**:DCR转换清单,含转换类型分类和每张表的完整KQL
- **日志调优/转换**:实时调优建议、知识库拆分KQL,以及带单表保留/类型更改的每表评估器
- **查看所有表**:完整列表,含分类、计划、成本、规则、保留期(颜色编码)和评估;选择一张表可查看详情面板(覆盖率来源、计划支持、保留期、状态及其建议)
- **管理表保留和类型**:批量保留和计划向导,带预览和应用功能
- **字典**:工具使用的每个术语(分类、成本和检测层级、评估、覆盖率来源、13种建议类型、检测分析器指标和评分标签、表计划、生命周期状态、XDR状态、转换类型),定义与本README一致,从 `Data/dictionary.json` 提供
- **导出报告**:选择格式,然后选择路径(目录用于带时间戳的文件,或文件名;按Enter保留当前目录),直接从菜单写入JSON、Markdown或HTML
- **XDR分析**:当你使用 `-IncludeDefenderXDR` 时,会出现在仪表板上
---
## 分类数据库
位于 `Data/log-classifications.json`。**481条条目**、**243个连接器**、**22个类别**。
### 每条条目包含的内容
| 字段 | 内容 |
|---|---|
| `tableName` | Log Analytics表名(`SecurityEvent`、`SigninLogs` 等) |
| `connector` | 生成此表的数据连接器 |
| `classification` | `primary`(安全价值)或 `secondary`(辅助遥测) |
| `category` | 安全类别:身份与访问、网络安全等 |
| `description` | 表中内容的通俗英文摘要 |
| `keywords` | 用于关键词差距分析匹配的术语 |
| `mitreSources` | MITRE ATT&CK数据源映射 |
| `recommendedTier` | `analytics`(热层)或 `datalake`(辅助候选) |
| `recommendedRetentionDays` | 建议的最低总保留天数(监管指导) |
| `isFree` | 微软是否免费摄取此表(运行时先使用 `Usage.IsBillable`) |
| `status` | 可选。`deprecated`(连接器已退役或摄取已停止)或 `legacy`(较旧的收集路径,有记录的后续版本) |
| `replacedBy` | 可选。要迁移到的表名;只要设置了 `status` 就存在(可能为空) |
| `xdrStreamable` | 可选,仅Defender表。`true` 表示Defender XDR连接器流式传输的21张表;`false` 表示仅门户和TVM表 |
| `platform` | 可选。`true` 表示Sentinel自身消费的表(`SecurityIncident`、`Usage`、`Watchlist` 等),这些表永远不需要分析规则 |
带有 `status` 的表会在TUI和报告中显示徽章,任何仍在摄取的此类表都会引发 `DeprecatedSource` 建议,指明替代表。`xdrStreamable: false` 的表永远不会被XDR检查器视为XDR流式传输候选。
### 主要与次要安全数据
**主要**(278条条目):你实际用于构建检测的表。登录日志、安全警报、威胁情报、审计跟踪、漏洞发现、防火墙命中、EDR遥测。
**次要**(203条条目):辅助内容。性能指标、基础设施诊断、网络流量量、库存快照、配置基线、健康检查。
### 类别概览
| 类别 | 数量 | 示例 |
|---|---|---|
| 身份与访问 | 51 | `SigninLogs`、`MicrosoftServicePrincipalSignInLogs`、`OktaSSO` |
| 网络安全 | 49 | `AZFWNetworkRule`、`NSPAccessLogs`、`DarktraceModelAlerts_CL` |
| 云控制平面 | 37 | `AzureActivity`、`AZKVAuditLogs`、`GoogleWorkspaceReports` |
| 网络流量 | 36 | `NTANetAnalytics`、`CommonSecurityLog`、`AZFWFatFlow` |
| 端点检测 | 33 | `DeviceProcessEvents`、`CrowdStrikeAuditEvents`、`SentinelOneAlertsV2_CL` |
| 应用程序日志 | 32 | `AppServiceHTTPLogs`、`AppServiceAuditLogs`、`DynatraceAttacksV2_CL` |
| 电子邮件安全 | 29 | `EmailEvents`、`CampaignInfo`、`Ttp_Url_CL` |
| 安全警报 | 29 | `SecurityAlert`、`SentinelBehaviorInfo`、`DisruptionAndResponseEvents` |
| 漏洞管理 | 23 | `DeviceTvmSoftwareVulnerabilities`、`Rapid7InsightVMCloudVulnerabilities` |
| 云安全 | 20 | `EnrichedMicrosoft365AuditLogs`、`OAuthAppInfo`、`PowerAppsActivity` |
| 端点遥测 | 18 | `DeviceInfo`、`Windows365NetworkLogs`、`SentinelOneAgents_CL` |
| 态势管理 | 17 | `ExposureGraphNodes`、`SecurityNestedRecommendation`、`ZTSMetadata` |
| 数据安全 | 16 | `PurviewDataSensitivityLogs`、`DataSecurityEvents`、`PowerPlatformDlpActivity` |
| 数据平台 | 16 | `SQLSecurityAuditEvents`、`CDBControlPlaneRequests`、`SnowflakeLogin_CL` |
| 平台健康 | 14 | `SentinelHealth`、`Usage`、`SecurityCaseEvent` |
| 容器与K8s | 13 | `AKSAudit`、`CloudProcessEvents`、`GKEAudit` |
| 基础设施诊断 | 13 | `AzureMetrics`、`AGWPerformanceLogs`、`ContainerAppSystemLogs` |
| 威胁情报 | 10 | `ThreatIntelIndicators`、`ThreatIntelObjects`、`CybleVisionAlerts_CL` |
| 配置管理 | 8 | `ConfigurationData`、`AVNMRuleCollectionChange` |
| SAP安全 | 7 | `ABAPAuditLog`、`SAPBTPAuditLog_CL`、`Onapsis_Defend_CL` |
| 存储访问 | 6 | `StorageBlobLogs`、`CloudStorageAggregatedEvents`、`AWSS3ServerAccess` |
| IoT/OT安全 | 4 | `RadiflowEvent`、`DragosAlerts_CL`、`Phosphorus_CL` |
### 表计划支持
`Data/basic-plan-tables.json` 和 `Data/auxiliary-plan-tables.json` 列出了 [Azure Monitor表功能矩阵](https://learn.microsoft.com/en-us/azure/azure-monitor/reference/tables-features) 标记为支持基本和辅助(数据湖)计划的内置表。保留向导使用基本列表来验证计划切换,`DataLake` 建议仅对支持湖层的表提出该层级建议,在最低支持层级为基本计划时回退到基本计划建议。基于DCR的自定义表支持两种计划;经典自定义表两者都不支持。这两个文件在每次发布时都会从该矩阵重新生成。
### 自定义分类
你可以提供自己的分类文件来**添加**内置数据库中不存在的表条目,或在默认值不符合你的环境时**覆盖**现有条目。当相同的 `tableName` 同时出现在两者中时,自定义条目优先于内置条目。```powershell
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' `
-CustomClassificationPath './my-classifications.json'
自定义文件使用与 Data/log-classifications.json 相同的模式,即一个对象数组:```json
[
{
"tableName": "MyCustomApp_CL",
"connector": "Custom Logs (DCR)",
"classification": "primary",
"category": "Application Logs",
"description": "Security-relevant audit events from an internal application",
"keywords": ["custom", "internal", "audit"],
"mitreSources": [],
"recommendedTier": "analytics",
"isFree": false
},
{
"tableName": "AzureMetrics",
"connector": "Azure Monitor",
"classification": "primary",
"category": "Infrastructure Diag",
"description": "Override: promoted to primary because we detect on Azure resource metrics in this environment",
"keywords": ["metrics", "azure", "infrastructure", "monitoring"],
"mitreSources": [],
"recommendedTier": "analytics",
"isFree": false
}
]
参见 `Data/custom-classifications-example.json` 获取可直接使用的模板。
### 分类是如何构建的
主要/次要分级部分由作者完成,随后将 Microsoft 的数据连接器和表定义输入 AI,并辅以人工分级基线,以 Microsoft 最佳实践和行业标准作为分类标准。如果某些内容在你的环境中看起来不太对劲,请优先相信你自己的上下文判断,而不是这个工具——AI 可能会犯错,而上下文才是关键。
分类标准来源于以下资料:
**ACSC(澳大利亚信号局,澳大利亚网络安全中心)**
- [ACSC:事件日志记录与威胁检测最佳实践(2024年8月)](https://www.cyber.gov.au/sites/default/files/2024-08/best-practices-for-event-logging-and-threat-detection.pdf)
- [ACSC:SIEM 接入的优先日志——从业者指南(2025年5月)](https://www.cyber.gov.au/business-government/detecting-responding-to-threats/event-logging/implementing-siem-soar-platforms/priority-logs-for-siem-ingestion-practitioner-guidance)
**CISA(网络安全与基础设施安全局)**
- [CISA:实施 M-21-31 的指南:改进联邦政府的调查与补救能力](https://www.cisa.gov/sites/default/files/2023-02/TLP%20CLEAR%20-%20Guidance%20for%20Implementing%20M-21-31_Improving%20the%20Federal%20Governments%20Investigative%20and%20Remediation%20Capabilities_.pdf)
- [CISA:Microsoft 扩展云日志实施手册(2025年)](https://www.cisa.gov/sites/default/files/2025-01/microsoft-expanded-cloud-logs-implementation-playbook-508c.pdf)
**Microsoft**
- [Microsoft Sentinel 数据连接器参考](https://learn.microsoft.com/en-us/azure/sentinel/data-connectors-reference)
- [Microsoft Sentinel 表与连接器参考](https://learn.microsoft.com/en-us/azure/sentinel/sentinel-tables-connectors-reference)
- [Azure-Sentinel GitHub 仓库](https://github.com/Azure/Azure-Sentinel)(社区分析规则、连接器定义、解决方案模板)
- [Microsoft Sentinel 计费](https://learn.microsoft.com/azure/sentinel/billing)
- [Microsoft Sentinel 数据层级管理](https://learn.microsoft.com/azure/sentinel/manage-data-overview)
**MITRE**
- [MITRE ATT&CK 数据源](https://attack.mitre.org/datasources/)
**NIST(美国国家标准与技术研究院)**
- [NIST SP 800-92:计算机安全日志管理指南](https://csrc.nist.gov/pubs/sp/800/92/final)
**NSA(美国国家安全局)**
- NSA 网络事件转发指南
**NCSC-UK(英国国家网络安全中心)**
- NCSC-UK 的“我们到底应该记录什么?”
**Google Cloud**
- [Google Cloud 审计日志概述](https://docs.cloud.google.com/logging/docs/audit)
- [Google Cloud 审计日志最佳实践](https://docs.cloud.google.com/logging/docs/audit/best-practices)
此外还使用了其他来源,以及作者本人的“专业知识”(如果你愿意这样归类的话)。
---
## 项目结构```
LogHorizon.psd1 Module manifest (v0.9.0)
LogHorizon.psm1 Module loader
Public/
Invoke-LogHorizon.ps1 Entry point, the main orchestrator
Set-LogHorizonTableRetention.ps1 Scriptable table retention and plan changes
Private/
Connect-Sentinel.ps1 Azure auth + workspace resolution
Get-TableUsage.ps1 KQL query for ingestion volumes
Get-AnalyticsRules.ps1 Analytics rules + table/field extraction + correlation tags
Get-HuntingQueries.ps1 Hunting queries + table extraction
Get-DataConnectors.ps1 Data connector inventory
Get-DataTransforms.ps1 DCR transform discovery, split KQL generation
Get-DefenderXDR.ps1 Defender XDR analysis (optional)
Get-Incidents.ps1 Incident fetch + SentinelHealth auto-close attribution
Get-AutomationRules.ps1 Automation rule inventory + close-logic attribution
Get-SocOptimization.ps1 SOC improvement recommendations
Get-TableRetention.ps1 Per-table retention, archive, and plan type
Get-CollectionCache.ps1 Collection cache (key, path, read, write)
Get-LogHorizonEndpoint.ps1 ARM / Log Analytics / Graph endpoints for the signed-in Azure environment
Get-LogHorizonDictionary.ps1 Loads the term dictionary shown by the Dictionary menu
Invoke-AzRestWithRetry.ps1 REST wrapper: retry on 429/5xx/transport errors, async operation polling
Invoke-Classification.ps1 Static DB + heuristic classification + _SPLT_CL detection + custom file validation
Invoke-Analysis.ps1 Cost-value matrix + recommendations + Detection Analyzer + XDR Checker + split suggestions
Set-TableRetention.ps1 Retention change set, preview, Tables API apply engine, plan support lookups
Write-Report.ps1 Spectre.Console TUI rendering
Export-Report.ps1 JSON / Markdown / static HTML export with shared section renderer
Data/
log-classifications.json 481-entry classification knowledge base
basic-plan-tables.json Built-in tables that support the Basic plan (from the Azure Monitor feature matrix)
auxiliary-plan-tables.json Built-in tables that support the Auxiliary / Data Lake plan
implicit-consumers.json Non-KQL rule kinds to tables, plus platform tables
dictionary.json Term definitions for the Dictionary menu (kept 1:1 with this README, enforced by tests)
high-value-fields.json Split KQL knowledge base: 165 tables with curated fields and split hints
field-frequency-stats.json Community field frequency stats mined from the Azure-Sentinel rule corpus
custom-classifications-example.json Example custom classification override file
ReportTemplate.html Static HTML report template (pure-CSS tabs, zero JS, CSP meta)
Tests/
LogHorizon.Tests.ps1 437 Pester v5 unit tests
知识库的生成方式
拆分后的 KQL 知识库 high-value-fields.json 和 field-frequency-stats.json 是在离线环境下,基于公开的 Azure/Azure-Sentinel 仓库(Solutions/、Detections/、Hunting Queries/,约 3,800 个 YAML 规则文件)构建的。每个查询都会通过模块在运行时使用的相同 Get-TablesFromKql 和 Get-FieldsFromKql 进行处理,以生成每个表的字段频率统计,并据此推导出三个层级的回退字段:
- 通用字段:出现在超过 50% 的所有表中的字段(例如
TimeGenerated) - 分类默认值:出现在某个分类类别中超过 40% 的表中的字段
- 按表统计:针对至少被 3 条规则引用的表的原始字段频率统计
挖掘出的字段会合并到经过整理的 high-value-fields.json 中(保留整理后的条目,并添加新发现的、至少包含 3 条规则和 3 个有意义字段的表)。
在运行时,Get-SplitKql 使用以下回退层级:整理后的知识库条目 -> 实时规则/狩猎字段分析 -> 社区按表统计 -> 分类默认值 -> 通用字段。字段频率并非完美的方法,但了解它仍然有用。
测试
437 个 Pester v5 测试,无需 Azure 连接。请从普通的 PowerShell 会话中运行它们,而不是 VS Code 集成终端:```powershell Invoke-Pester ./Tests/LogHorizon.Tests.ps1 -Output Detailed
## 许可证
GPL-3.0。参见 [LICENSE](https://github.com/lnfernux/log-horizon/blob/main/LICENSE)。
## 版本历史
| 版本 | 日期 | 变更 |
|---|---|---|
| 0.9.0 | 2026-09-06 | 基于完整代码与数据审查的修复版本。正确性:基于 `Usage.Plan` 和 `Usage.IsBillable` 的计划感知定价,含 Basic 与 Data Lake 费率及计费 GB(1000 MB);Detection Analyzer 自动关闭归因仅限已启用的关闭/剧本规则(`triggeringLogic.isEnabled`);通过 `2025-09-01` 获取事件,使用 `$top=1000`;对非 KQL 规则类型及平台表提供隐式覆盖(`implicit-consumers.json`);交互式保留期基线检查;单一建议排序。转换:DCR 发现限定在订阅范围并按目标工作区过滤,同时包含工作区转换 DCR 及关联,权限缺失时显示可见状态与警告;工作区及多阶段转换解析;与实时表架构相交的拆分 KQL。健壮性:默认启用收集缓存(`-NoCache`、`-RefreshCache`、`-CacheMaxAgeMinutes`、`-CachePath`);在转轮动画前完成身份验证,警告随后打印;转义 TUI 与 Markdown 输出;导出路径解析可创建目录并返回写入路径;HTML 中的 CSP meta;REST 传输错误重试及 Location 风格异步完成;通过 REST 解析工作区(移除 `Az.Resources`);自定义分类验证;PascalCase 感知启发式并带 Microsoft 第一方回退;正则表达式超时。端点遵循已登录的 Azure 环境(政府版、中国版),API 版本移至 SecurityInsights `2025-09-01`、OperationalInsights `2025-07-01`、建议 `2025-10-01-preview`。数据:分类数据库从 345 条增至 481 条,含 `status`/`replacedBy`/`xdrStreamable`/`platform` 键;80+ 第一方表及 35 个后继表;连接器标签修复;`isFree` 修正;基于 Azure Monitor 表功能矩阵重新生成 `basic-plan-tables.json` 并新增 `auxiliary-plan-tables.json`;`DeprecatedSource` 建议;带 Basic 回退的计划感知 Data Lake 建议;XDR Checker 遵循可流式传输性;TUI 与导出中的生命周期徽章。审查通过:缓存键覆盖定价与模块版本;自定义分类布尔值与层级采用解析而非强制转换;严重性感知的自动关闭归因;拆分 KQL 谓词对照实时架构检查;XDR 获取状态显式呈现而非静默 `$null`;无扩展名的输出路径视为文件;不再收集事件所有者身份。TUI 中提供字典菜单,涵盖工具使用的所有术语,由 `Data/dictionary.json` 支撑并通过测试与代码绑定。自动化规则与 Defender 自定义检测对象仅投影到所消费字段,因此作者身份(createdBy、lastModifiedBy、分配的所有者)绝不会进入缓存或导出。GPL-3.0 许可证。437 项测试 |
| 0.8.0 | 2026-05-26 | 新增交互式表保留期管理,含批量 TUI 流程及单表更新入口,以及公开的 `Set-LogHorizonTableRetention` 命令。新增 Tables API PATCH 应用引擎,含验证、Azure 异步操作轮询及两步回退(组合 PATCH,然后仅计划加仅保留期),以实现弹性保留期更新。新增针对验证、负载结构、回退及公开命令映射的 Pester 测试。同时修复一个边界情况/缺陷:若用户仍有分析数据保留在 Sentinel 中,系统会建议将 data lake 表改为 data lake 层级 |
| 0.7.1 | 2026-05-15 | 新增基于 `Usage.Plan` 的计划感知,且不替换已配置的表计划:分析现可跟踪观察到的计划历史、标记多计划使用及配置与观察不匹配情况,并在仪表板、表下钻、查看所有表、保留期评估及导出中呈现计划数据。修复 Detection Analyzer 自动关闭归因,使时间启发式仅在不存在已启用的自动化规则时应用。203 项测试通过 |
| 0.7.0 | 2026-04-16 | 检测评估新增成本-价值矩阵汇总表(主要/次要 x7 个评估类别,带颜色编码)、主/次表下钻子菜单(含成本/检测层级列)。Detection Analyzer 新增基于 GB 加权的容量覆盖条(检测/狩猎/组合 GB 占总摄入量的百分比,与现有表计数条并列)。Detection Analyzer 的自适应显示改进(动态条宽、规则名截断、基于控制台宽度的条件列隐藏)。193 项测试通过 |
| 0.6.3 | 2026-04-11 | PSGallery 小更新 |
| 0.6.2 | 2026-04-11 | 日志调优/转换菜单:实时数据调优分析(基于已部署规则/狩猎查询的每表字段使用情况、过滤/投影/组合 KQL 生成、节省估算)、Tables API 架构列提取、`Get-SplitKql` 回退层级(社区统计 → 类别默认值 → 通用字段)、带字段使用矩阵的综合表评估器、统一 KB + 实时调优导出部分、用于 Azure-Sentinel GitHub 规则语料库的 `Build-FieldKnowledgeBase.ps1` 挖掘脚本。Detection Analyzer:基于 SentinelHealth 的自动关闭归因(主要)并带操作符感知规则匹配回退、布尔条件包装解析、Resolved 状态检测、ARM 资源 ID 的 GUID 尾部匹配。覆盖率现基于所有表(含免费层级)的表计数。TUI 与导出中新增评分免责声明。174 项测试 |
| 0.6.1 | 2026-04-10 | 缺陷修复:`$kqlKeywords` 过滤现共享于文件作用域(此前在 `Get-TablesFromKql` 中未定义);为所有辅助函数添加 `[CmdletBinding()]`;简化 Defender 统一检查;移除幽灵 `-RuleCount` 测试参数。健壮性:`Get-HuntingQueries` 分页;`Invoke-AzRestWithRetry` 重试包装器,对 429/5xx 采用指数退避;`PricePerGB` 验证;关键函数中的 `Write-Verbose`。文档:版本徽章、数据库计数、先决条件与清单对齐 |
| 0.6.0 | 2026-04-10 | 动态 XDR 流式传输检测,含 21 个 `KnownXDRTables`(原硬编码 18 个)、每表 `XDRState`(`NotStreaming`/`Analytics`/`Basic`/`Auxiliary`)、Auxiliary 识别为 data lake 层级、未流式传输的 XDR 表以信息/低优先级建议呈现并含 `NotStreamedCount`、保留期分析器将未流式传输的 XDR 表显示为“仅 XDR(30 天)”、概览层级细分(analytics/basic/data lake + 未流式传输)、Export-Report 中 Auxiliary→“data lake”标签、分类数据库更新至 345 条(+`DeviceNetworkInfo`、`DeviceInfo`→secondary/datalake、`DeviceImageLoadEvents` 与 `IdentityQueryEvents`→datalake 层级)、15 项新 Pester 测试(共 121 项) |
| 0.5.0 | 2026-04-03 | 静态 HTML 导出,采用纯 CSS 标签页(零 JS、无 CDN、完全自包含)、统一 MD/HTML 部分渲染器、完整 JSON 数据捕获(dataTransforms、correlationExcluded/Included、streamingTables)、用于 CI/管道使用的 `-NonInteractive` 开关、`md` 格式别名、带日期时间戳的自动文件名、DCR 转换中完整 KQL 显示(无截断)、markdown 表格中的多行 KQL 处理、修复 HTML 令牌替换中正则 `$` 反向引用损坏问题、重命名内部辅助函数以避免 PowerShell 别名冲突(`h`→`hEnc`、`md`→`mdEsc`)、33 项新 Pester 测试(共 106 项) |
| 0.4.1 | 2026-04-03 | 安全与稳定性修复——新增令牌内存清理、输出路径验证与 XSS 防护、REST API 分页限制、修复模块加载器错误屏蔽,并解决 PSScriptAnalyzer 警告 |
| 0.4.0 | 2026-04-02 | 转换发现(DCR 列表 + 转换类型分类)、拆分表检测(`_SPLT_CL`)、含 15 表知识库(`high-value-fields.json`)的拆分 KQL 辅助工具 + 规则分析回退、门户就绪的条件仅 KQL 输出、可展开建议列表、拆分 KQL 建议 TUI 菜单 |
| 0.3.0 | 2026-04-02 | 日志保留期合规分析(CISA M-21-31、NIST SP 800-92、NCSC-UK、ASD ACSC、NSA)、关联标签检测(`#DONT_CORR#`/`#INC_CORR#`)、保留期评估菜单视图、所有表中保留期列、分类架构中的 `recommendedRetentionDays` |
| 0.2.2 | 2026-04-02 | SOC 优化表在窄控制台上隐藏详情列 |
| 0.2.1 | 2026-04-02 | 自定义分类支持(`-CustomClassificationPath`)、带 API 建议/下钻的增强 SOC 优化建议、仅活动默认视图、UTF-8 编码警告抑制 |
| 0.2.0 | - | 初始公开发布,含分类引擎、成本-价值评分、Spectre.Console TUI、导出至 JSON/Markdown |
| 0.1.0 | - | 内部开发版本 |
## 已知问题
### PwshSpectreConsole UTF-8 编码警告
要在终端中启用 UTF-8 输出,请在 PowerShell `$PROFILE` 文件顶部添加以下行并重启终端:```powershell
$OutputEncoding = [console]::InputEncoding = [console]::OutputEncoding = [System.Text.UTF8Encoding]::new()
该模块在导入时会自动设置此项,但根据您的会话情况,警告仍可能出现。这仅影响外观,不影响功能。
贡献
如果您遇到问题或希望贡献代码,请创建 PR。