
deadair v0.4.0
找出SIEM中运行盲点的检测规则
开源 SIEM 检测健康度。
发现因遥测数据缺失、过期、延迟或 schema 不兼容而失明的已启用检测。
本地运行 · 只读 · 无代理 · 不上传遥测数据
阅读技术文档 · 入选 Detection Engineering Weekly · 入选 tl;dr sec #341
对一次性 Elastic 实验室的真实扫描,其中故意包含缺失、过期、延迟和未使用的遥测数据。打开图片查看简短回放,或使用 make record-scan-lab 复现。
为什么选择 deadair
一条规则可以在其所需数据消失后仍然保持启用、按计划运行且无错误。deadair 读取实时规则清单,使用后端原生语义解析每条规则的输入,并检查其背后的具体数据源。
它能发现:
- 索引、别名或数据流选择器解析不到任何内容的规则;
- 混合选择器规则,其中一个声明的输入已消失而另一个仍可解析;
- 匹配的数据源全部过期或为空的规则;
- 在 Elastic 上,运行但缺少声明字段的规则;
- 在 Elastic 和符合条件的 Sentinel Scheduled 规则上,存在摄取延迟盲区;
- 在 Sentinel 上,已知数据源使用不兼容的 Basic 或 Auxiliary 表计划的规则;
- 在 Elastic 和 OpenSearch 上,健康但没有任何已启用检测读取的遥测数据。
deadair 支持 Elastic Security、OpenSearch Security Analytics 和 Microsoft Sentinel。
快速开始
从 GitHub Releases 下载适用于 macOS、Linux 或 Windows 的二进制文件,或使用 Go 安装:
go install github.com/alephnull-sh/deadair/cmd/deadair@latest
打印您的 SIEM 的只读设置:
deadair setup elastic # Elastic Security
deadair setup opensearch # OpenSearch Security Analytics
deadair setup sentinel # Microsoft Sentinel
运行一个设置,然后验证并扫描:
deadair check # 验证凭据是否可以扫描
deadair scan # 评估实时规则和遥测数据
退出码是稳定的:0 表示通过配置的门槛,1 表示存在门槛内发现的问题,2 表示扫描失败。
工作原理
| 阶段 | deadair 的作用 |
|---|---|
| 清单 | 读取已启用的检测及其声明的输入 |
| 解析 | 在 Elastic 和 OpenSearch 上使用原生索引解析;在 Sentinel 上,结合 KQL 分析与表、watchlist、已保存函数、ASIM 和映射的跨工作区证据 |
| 度量 | 检查数据源新鲜度和时序,以及后端支持的 schema 和存储 |
| 报告 | 输出终端、JSON、HTML、fleet 汇总和 Prometheus 指标,并附上每个判定背后的证据 |
Sentinel 遵循相同的规则到数据源模型。其适配器还理解字面 watchlist、已保存函数、ASIM 解析器、映射工作区和汇总表血缘。当 Azure 提供足够证据时,deadair 可以显示共享表的某个过滤切片已静默,或汇总管道已落后。这两项检查是建议性的;它们不会改变门槛。 使用指南 描述了证据规则,验证记录 记录了实时测试覆盖。
对预置了缺失、过期、延迟和不兼容遥测数据的一次性 Sentinel 实验室进行实时扫描。打开图片查看简短回放。有关只读和拒绝写入测试,请参阅单独的 Azure 一致性记录。
deadair 检查检测的遥测数据是否存在且健康。它不验证规则逻辑,也不证明模拟攻击会触发警报。请使用静态规则验证和端到端检测测试来完成这些工作。
发现项
| 发现项 | 含义 | 首要检查 |
|---|---|---|
| 无匹配数据源 | 规则的任何输入都无法解析到可见的索引、数据流或 Sentinel 表 | 模式变更、缺失集成和凭据范围 |
| 所有数据源过期或为空 | 每个已解析的数据源当前都不可用 | 数据源节奏和摄取路径 |
| 字段缺失 | 在读取所有数据源映射后,Elastic 规则声明的字段在一个或多个已解析数据源中不存在或不可搜索 | 解析器、包和映射变更 |
| 延迟盲区 | 配对事件的 p95 摄取延迟超过规则的回看余量 | 规则间隔、回看、时间戳覆盖和管道延迟 |
| 输入覆盖不完整 | 完整表达式可解析,但其中的一个正向选择器解析为空 | 迁移、回退选择器和预期替代方案;除非策略要求,否则仅为信息性 |
| 数据源计划不兼容 | Sentinel 规则依赖的 Basic 或 Auxiliary 表不符合分析规则证据路径的资格 | 表计划和规则类型 |
| 数据源降级 | 数据源过期、为空、低容量或 schema 漂移 | 数据源历史和预期维护 |
| 未使用的遥测数据 | 在 Elastic 或 OpenSearch 上,数据被存储但没有任何已启用的本地检测解析到它 | 已禁用的规则和有意收集 |
每个判定仅限于配置的凭据所能看到的内容。JSON 报告包含配置的表达式、已解析的数据源、解析方法、评估状态、后端元数据和能力证据。有关实际示例和分类,请参阅使用指南。
连接 SIEM
Elastic:
export DEADAIR_ES_URL=https://es.example.internal:9200
export DEADAIR_KIBANA_URL=https://kibana.example.internal:5601
export DEADAIR_API_KEY=<read-only-api-key>
deadair check
deadair scan --json-out report.json --html-out report.html
OpenSearch:
export DEADAIR_BACKEND=opensearch
export DEADAIR_OPENSEARCH_URL=https://opensearch.example.internal:9200
export DEADAIR_OPENSEARCH_USERNAME=deadair
export DEADAIR_OPENSEARCH_PASSWORD=<password>
deadair check
deadair scan
Microsoft Sentinel:
az login --tenant <tenant-id>
export DEADAIR_BACKEND=sentinel
export DEADAIR_AZURE_SUBSCRIPTION_ID=<subscription-id>
export DEADAIR_AZURE_RESOURCE_GROUP=<resource-group>
export DEADAIR_SENTINEL_WORKSPACE=<workspace-resource-name>
# 可选:字面 workspace() 目标的 JSON 允许列表。
# export DEADAIR_SENTINEL_REMOTES=/restricted/path/sentinel-remotes.json
deadair check
deadair scan
在 deadair 评估规则映射的远程工作区之前,该工作区必须已部署 Sentinel。同一订阅内的映射可以证明数据源可用性。跨订阅规则需要与确切规则身份绑定的运行时证据。有关证据规则、工作区和区域限制以及 Microsoft 的性能指南,请参阅 Sentinel 使用详情。
使用文档中记录的只读角色:Elastic、OpenSearch 或 Microsoft Sentinel。
CI、fleet 和监控
# 根据实时数据源可用性对候选规则进行门槛检查。
deadair scan --rule new-rule.json
# 仅对报告之间的新回归失败。
deadair diff yesterday.json today.json
# 从单个进程扫描多个 SIEM 实例。
deadair scan --fleet fleet.json
# 将缓存的扫描结果导出为 Prometheus 指标。
deadair serve --interval 5m
scan --rule 将后端原生候选规则或检测器与无关积压工作隔离。diff 适用于使用同一调用方持有的密钥创建的脱敏报告。Fleet 配置通过环境变量引用密钥,而不是存储密钥值。
官方 GitHub Action 封装了 Elastic、OpenSearch 和 Sentinel 的单实例候选门槛。它写入作业摘要、上传脱敏的 JSON 报告,并且可以在不安装规则的情况下应用 deadair 策略。Sentinel 工作流首先将运行器认证到 Azure;该 Action 不定义任何 Azure 凭据输入。
有关在您自己的环境中测试的配置,请参阅 CI 门槛行为、fleet 和 MSSP 部署 以及 Prometheus 示例。
已测试的后端
| 后端 | 实时验证 |
|---|---|
| Elastic Security | 在 8.19.19 和 9.4.4 上进行可信 CI |
| OpenSearch Security Analytics | 在 2.19.6 和 3.7.0 上进行可信 CI |
| Microsoft Sentinel | 在一次性 UK South 工作区中记录的可选一致性测试;请参阅 验证状态 |
Sentinel 一致性运行是手动的,不是计划中的 CI。
安全模型
- 所有适配器调用均为只读。可信的 Elastic 和 OpenSearch 测试以及单独的 Sentinel 实验室探针验证了文档化的扫描身份无法执行代表性的写入操作。
- 报告、HTML、状态文件和 fleet 输出在 POSIX 系统上以
0600权限写入。 - 凭据可以来自环境变量或文件,避免在进程参数中暴露密钥。
--redact使用带密钥的 HMAC 假名替换租户、规则、数据源、模式、字段、依赖项、血缘、来源、工作区、watchlist、模板和包标识符。经过验证的依赖探针表达式及其 KQL 参数永远不会被序列化。由随机字节生成的--redact-key-file也启用脱敏,并在不同运行之间保持名称稳定。- 导出器默认绑定到回环地址。
- deadair 没有电话回家行为或使用遥测。
将报告视为敏感的 SOC 工件:它们标识盲检测、数据源名称、schema 缺口和未使用的收集。
文档
- 使用指南 — 首次扫描、报告证据、发现项、CI 门槛、状态和 fleet
- 验证状态 — 已测试的路径和当前限制
- 架构 — 后端契约、数据模型、安全属性和限制
- 最佳实践 — 部署顺序、警报上下文和路由
- MSSP 指南 — 密钥、脱敏、调度和租户故障处理
- 运行但无法看见的检测 — 问题及可复现的模拟
贡献
欢迎提交错误报告、脱敏的测试夹具、正确性案例、文档和后端提案。从 CONTRIBUTING.md 开始,适配器工作请使用后端 RFC 模板。
许可证
Apache-2.0。

