nathan-m-devsec/Threat-Intelligence---Agentic
GitHub: nathan-m-devsec/Threat-Intelligence---Agentic
基于 n8n 的威胁情报暴露验证工作流演示,通过将威胁情报与模拟资产环境匹配来过滤噪音并生成经人工审批的修复工单。
Stars: 2 | Forks: 0
# 🛡️ n8n 威胁情报暴露管线 — 作品集演示
这是一个独立的、由**模拟数据驱动**的 n8n 工作流,展示了如何将原始威胁
情报转化为经过验证的、感知环境的暴露审查 —— 并在任何操作之前
加入人工审批环节。
## 问题所在
安全团队被海量的威胁情报淹没 —— CVE、KEV 新增条目、厂商
公告、已命名的漏洞利用、供应链报告。对于任何特定的组织来说,
其中大部分都是噪音。最困难的环节不是*收集*情报;而是要回答:
一条情报源只是一个声明。真正的价值来自于**根据您实际运行的
环境验证该声明**,并如实报告结果 —— 包括当您*无法*确定的时候。
## 此管线的作用
```
Schedule / Manual Trigger → Demo Configuration → Threat Feed Collection →
CVE / Non-CVE Normalisation → NVD / KEV / EPSS Enrichment → Mock Inventory Matching →
Mock Region A + Region B Exposure Checks → Mock Asset Context →
Confidence & Risk Scoring → HTML Security Digest → Simulated Human-Approved Ticket
```
对于每个发现,它会:
1. 通过专用的 **Threat Feed Collector** 子工作流在**每日计划**(或按需)
收集威胁源条目,该工作流会对条目去重、验证
发布日期、过滤出过去 24 小时(UTC)的条目,并容忍损坏的情报源。
2. 将它们**标准化**为 CVE、产品/软件或非 CVE 供应链查询。
3. 使用 NVD 严重性/CVSS、CISA KEV 状态和 EPSS **丰富** CVE 信息。
4. 与运行时/软件资产清单进行**匹配**以确定相关性。
5. 通过模拟暴露平台**在两个区域验证暴露情况**。
6. 使用业务/运营上下文**丰富已确认的资产**。
7. 分配**置信状态**和**风险优先级**。
8. 生成轻量级的 **HTML 安全摘要**。
9. 提议一张**模拟的、经人工审批的**修复工单 —— 绝非真实工单。
请参阅 [`docs/architecture.md`](docs/architecture.md) 获取图表以及
从初始概念到脱敏实现版本的映射关系。
## 为什么需要针对环境验证情报?
因为基于未验证的情报采取行动会浪费精力并削弱信任。在您并未使用的产品中发现的“严重
RCE”就是噪音;而在面向互联网的生产服务器上出现的同一个 CVE 则是一起
事件。此管线仅在将威胁与真实的(此处为模拟的)资产匹配并使用
诸如 *生产环境 / 面向互联网 / 关键任务* 等上下文对其进行丰富**之后**,
才会分配优先级。
## 为什么要同时检查两个区域?
真实的资产环境很少是单一同构的。此管线会检查两个
独立的区域(`Region A`、`Region B`),并且只有在**两者**都
做出响应时,才会报告干净的 **"Not detected"**。如果某个区域检查失败,结果将变为
**Incomplete** —— 绝不会是虚假的“无暴露”(参见 `api_failure` 场景)。
## 为什么暴露决策要基于结构化结果?
每个区域检查都会被强制转换为一种 **通用 schema**:
```
{
"query_type": "cve | software | package",
"query_value": "CVE-2026-12345",
"region": "region-a",
"status": "confirmed | likely | not_detected | error",
"asset_count": 3,
"assets": [],
"error": null,
"source": "mock-exposure-platform"
}
```
评分和报告仅依赖于这些字段 —— 从不依赖自由文本或
特定于厂商的响应格式。这使得逻辑具有可测试性、可移植性,并且
能够安全地进行扩展。
## 演示模式如何工作
**Demo Configuration** 节点驱动一切:
```
{ "demo_mode": true, "enable_ai_analysis": false, "demo_scenario": "confirmed_exposure" }
```
- `demo_mode` —— 保持所有副作用均为模拟。
- `enable_ai_analysis` —— 设为 `false` 会使用确定性的 Code/Set 节点来构建
报告(不需要 AI 密钥)。文档中记录了一个可选的 AI 分支。
- `demo_scenario` —— 选择故事情节。只需更改此值即可重新运行下方
的任意场景;所有下游值均由此派生。
## 场景
| `demo_scenario` | 结果 | 演示目的 |
|------------------------|-------------------------------------------------|--------------|
| `confirmed_exposure` | **Confirmed**,严重,提议工单 | 模拟资产上的高优先级 CVE;上下文提升优先级 |
| `inventory_match_only` | **Likely**,高 | 检测到产品家族,但具体版本未确认 |
| `not_relevant` | **Not relevant**,信息级 | 威胁不在资产清单中;无需操作 |
| `not_detected` | **Not detected**,信息级 | 两个区域均安全 |
| `high_risk_asset` | **Confirmed**,严重,提议工单 | 生产环境 / 面向互联网的服务器提升了优先级 |
| `api_failure` | **Incomplete**,需要重新检查 | 一个区域失败;无虚假的“无暴露” |
| `large_asset_count` | **Confirmed**,严重,提议工单 | 显示总数 + 简短样本,避免信息洪流 |
| `non_cve_supply_chain` | **Not detected (runtime/software inventory only)** | 供应链条目;未检查仓库/lockfile/CI/SBOM |
其中四个场景的预渲染输出位于 [`examples/`](examples) 中,外加一个
说明性的 AI 生成叙事示例(见[下文](#why-is-ai-optional))。
## 如何导入与运行
按以下顺序导入所有三个工作流,然后连接一个节点:
1. `workflows/mock-rss-collector.json` — *Mock and Public Threat Feed Collector*。
2. `workflows/mock-exposure-api.json` — *Mock Exposure Platform API*。
3. `workflows/threat-intelligence-demo.json` — 主管线。
4. 打开主管线工作流,打开 **Collect Threat Feed (RSS sub-workflow)** 并
选择已导入的 RSS 收集器(根据设计,没有硬编码工作流 ID;如果
跳过此步,它将回退到内嵌的固定数据并继续运行)。
5. 点击 **Execute Workflow**,然后阅读 **Preview Security Digest** 输出。
6. 若要尝试另一个场景,请在 **Demo Configuration** 上更改 `demo_scenario` 并
再次执行。
RSS 收集器默认使用离线 **fixture** 模式;**live** 模式会获取
真实的公开情报源。暴露检查可以选择性地调用模拟 API webhook。
完整步骤 —— 情报源模式、添加/移除情报源以及可选的 AI 分支 —
请参阅 [`docs/demo-guide.md`](docs/demo-guide.md) 和
[`docs/rss-collector.md`](docs/rss-collector.md)。
## 为什么 AI 是可选的?
最初的设计使用 AI Agent 来编排工具并撰写摘要。
这虽然强大,但会让演示依赖于付费的 API 密钥并产生非确定性
输出。在此,管线**默认是确定性的**,因此任何人都可以导入并
运行它,而 AI 分支是*可选的增强功能*,而非硬性依赖。结构化的
`run` 对象正是 AI 节点将要消费的内容,并且该
分支的脱敏系统提示词位于
[`docs/demo-guide.md`](docs/demo-guide.md#recommended-system-message) 中。
为了在不需要 API 密钥的情况下展示预期的风格,请参阅
[`examples/ai-narrated-sample.html`](examples/ai-narrated-sample.html) — 这是一个
**手工撰写、明确标注的说明性示例**,并非实时的模型
输出。它复用了与
[`examples/confirmed-exposure.html`](examples/confirmed-exposure.html) 完全相同的事实(相同的
CVE、评分、主机、工单),因此两者绝不会产生冲突;仅仅是行文风格
有所不同。
## 供应链可见性的局限性
运行时/已安装软件的资产清单仅显示**正在运行**的内容。它**不**
证明某个包是否被用于**源代码、lockfile、CI/CD pipeline 或
SBOM** 中。管线会输出 **"Not detected (runtime/software inventory only)"**
而不是“我们在任何地方都没有使用这个”,并建议进行人工依赖审查。
这种对数据源局限性的诚实态度是一项核心设计准则。
## 错误处理
- RSS 收集器在遇到**情报源错误**时会继续运行(一个损坏的发布源无法
导致运行失败),会记录 `feed_errors`/`collection_warnings`,并验证
发布日期,确保无效日期永远不会被视为最新。
- Exposure-check HTTP 节点使用**错误分支**(`onError = continueRegularOutput`)
和 15 秒超时;失败的调用绝不会中止运行。
- 失败的区域检查会产生 **Incomplete** 结果,绝不会产生假阴性。
- 如果未连接可选的模拟 API 或 RSS 子工作流,管线将**回退到
确定性的固定数据**,以确保演示始终能够完成。
## 工具调用预算
- 资产上下文查找每次运行上限为 **5 次**;超出部分会被汇总处理。
- 每个发现恰好执行 **两** 次区域检查。
- 大型结果集会显示 **总数 + 样本**,而不是展示每一个资产。
## 安全控制
- 仓库中的任何地方都不包含凭证、token 或机密。
- 文档中仅使用文档专用 IP 范围 (RFC 5737);`DEMO-*` 主机名;虚构的 CVE。
- 在任何提议的操作之前都需要人工审批(`approval_required: true`)。
- 该演示**绝不**进行修复、拦截、隔离、打补丁、发送消息或
创建真实工单。请参阅 [`SECURITY.md`](SECURITY.md) 和
[`docs/security-design.md`](docs/security-design.md)。
## 原始版本是如何脱敏的
由雇主开发的生产级工作流重建而成,原工作流被视为
机密且**未**被复制。移除的内容包括:组织名称、个人和
服务帐号名称、租户/聊天标识符、所有凭证对象,以及所有
内部的 n8n 引用(工作流/版本/标签/项目/数据表 ID、缓存 URL、
实例元数据、固定/执行数据)。节点 ID 已重新生成。私有
集成被模拟对象替换。AI 系统提示词已使用组织中立的语言
从零开始重写。完整详情请参阅
[`docs/security-design.md`](docs/security-design.md#how-the-original-was-sanitised)。
## 已知局限性
- 丰富信息和暴露结果都是**合成且确定的** —— 非常适合
演示流程和决策逻辑,但不适用于真实评估。
- 运行时资产清单模型特意保持简单(无源代码/SBOM 分析)。
- AI 分支仅在文档中有说明,并未实际内置。
- 模拟暴露 API 对每个查询返回固定数据;它不是真实
扫描器的模拟器。
## 未来改进
- 连接可选的 AI 分支并为其添加标准输出回归测试。
- 在 feature flag 之后添加实时(无需凭证)的 NVD/EPSS 信息丰富功能。
- 在评分之前添加真实的 schema 校验节点。
- 添加 SBOM/依赖源,以填补供应链可见性方面的空白。
- 将区域参数化(支持 N 个区域而不是两个)。
## 仓库布局
```
n8n-threat-intelligence-portfolio/
├── README.md
├── workflows/ # main pipeline + Mock Exposure API + Mock RSS Collector
├── fixtures/ # synthetic data — single source of truth
├── examples/ # pre-rendered HTML digests + one illustrative AI-narrated sample
├── docs/ # architecture, demo guide, security design, RSS collector
├── .env.example # optional config (no real secrets)
├── .gitignore
├── SECURITY.md
└── LICENSE
```
## 署名
此处展示的概念由作者在专业的
安全自动化背景下开发,并作为原创的、合成的
实现进行了复现。不包含任何雇主的代码、数据、品牌或标识符。
标签:GPT, Homebrew安装, n8n, 多模态安全, 威胁情报, 安全运营, 工作流自动化, 开发者工具, 扫描框架, 漏洞管理