我回答过无数次 “我们到底从这些日志中得到了什么?” 或 “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
Install-Module -Name Az.Accounts -Scope CurrentUser Install-Module -Name PwshSpectreConsole -Scope CurrentUser
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
Set-LogHorizonTableRetention -SubscriptionId '...' -ResourceGroupName 'rg' -WorkspaceName 'ws' ` -TableName 'SigninLogs' -TotalRetentionInDays 365 -WhatIf
Set-LogHorizonTableRetention -SubscriptionId '...' -ResourceGroupName 'rg' -WorkspaceName 'ws' ` -TableName 'AzureDiagnostics','VMConnection' -TargetPlan Basic -TotalRetentionInDays 730
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
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -RefreshCache
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -NoCache
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