subhsamal/Detection-as-Code-with-AI
GitHub: subhsamal/Detection-as-Code-with-AI
一个基于开源工具构建的生产级 AI 增强检测与响应平台,通过检测即代码、双模型 AI 审计和 MCP 工具网关实现闭环 SOC 能力。
Stars: 0 | Forks: 0
# 使用 AI 的 Detection-as-Code
**一个生产级、AI 增强的检测与响应平台,基于开源工具构建。**
由 Subhadarshi Samal — 高级检测与响应工程师构建。
## 项目简介
该平台回答了每一个高级 D&R 面试中都会出现的一个问题:*“你将如何使用开源工具构建世界一流的 SOC 能力?”*
答案不是“安装 Elastic 并写几条规则”。答案是一个闭环系统:遥测数据反馈给检测器,检测器触发 AI agent,agent 产生经过审计的输出,而 agent 本身也成为一个检测面。每个组件都有明确的角色、明确的接口和明确的反馈路径。
这也是一个鲜活的作品集——每个模块都直接映射到 AI 前沿安全组织所看重的技能:检测工程、零信任访问、Agentic AI、LLM 输出审计、REST API 集成以及威胁情报的运营化。
## 架构概览

## 仓库结构
```
Detection-as-Code-with-AI/
│
├── infra/ # Elastic stack (Docker)
│ ├── docker-compose.yml
│ ├── .env
│ ├── elasticsearch/
│ │ └── elasticsearch.yml
│ └── kibana/
│ └── kibana.yml
│
├── telemetry/ # Log sources and simulators
│ ├── simulators/
│ │ ├── auth_events.py
│ │ └── process_events.py
│ └── beyondcorp/
│ └── pomerium.yml
│ │ ├── authentik.yml
│ │ ├── authentik-db.yml
│
├── detections/ # Detection-as-code
│ ├── rules/
│ │ └── *.yml (ES|QL rules with MITRE mapping)
│ ├── tests/
│ ├── coverage_map/
│ └── deploy.py
│
├── mcp-server/ # AI tool gateway
│ ├── server.py
│ ├── tools/
│ │ └── elastic_tools.py
│ ├── scope_policy.py
│ └── audit_log.py
│
├── agents/ # AI agent roles
│ ├── copilot/
│ │ └── rule_copilot.py
│ ├── auditor/
│ │ └── rule_auditor.py
│ ├── triage_agent/
│ │ └── triage.py
│ └── shared/
│ └── redaction.py
│
├── threat-intel/ # CTI pipeline
│ ├── stix_ingest.py
│ ├── ttp_mapper.py
│ ├── gap_finder.py
│ ├── draft_rule.py
│ └── otx_feed.py
│
├── n8n/ # SOAR-equivalent workflows
│ └── workflows/
│ ├── alert_triage.json
│ └── alert_enrich.json
│
└── .github/
└── workflows/
└── ci.yml # Lint → co-pilot → auditor → deploy
```
## 组件角色
### 1. `infra/` — Elastic stack
**它是什么:** 数据基础。Elasticsearch 存储所有安全遥测数据、检测规则输出和 AI agent 审计日志。Kibana 提供仪表板、检测规则 UI 以及 ATT&CK 覆盖热力图。
**为什么采用这种方法:** `elastic-start-local` Docker 脚本提供了一个完全可移植、永不过期的 Elastic stack,任何人都可以克隆并通过两条命令运行。没有云试用,也不用在演示到一半时担心许可证过期。整个平台可以在 MacBook 上运行。
**核心接口:**
- Elasticsearch REST API (`localhost:9200`) — 被 `detections/deploy.py`、`mcp-server/tools/elastic_tools.py` 和 `mcp-server/audit_log.py` 使用
- Kibana UI (`localhost:5601`) — 用于仪表板和检测规则管理
**在平台中的角色:** 一切都流经 Elasticsearch。遥测数据在此处建立索引。检测规则针对它运行。AI agent 的工具调用被记录回其中。它是整个系统的唯一事实来源。
### 2. `telemetry/` — 日志源与合成模拟器
**它是什么:** 原始安全信号。包含两个组件:生成真实合成事件的 Python 模拟器(认证失败、进程执行、横向移动模式),以及完整的零信任身份 stack:作为身份提供商 的 Authentik 和作为身份感知代理 的 Pomerium。Authentik 管理用户、组、MFA 并签发 OIDC token。Pomerium 信任这些 token,并在 Kibana、n8n 和 MCP server 管理界面之前强制执行基于路由的访问策略。
**为什么使用模拟器:** 一个没有真实数据的实验室无法产生有意义的检测,也无法产生有意义的 AI 分诊输出。模拟器生成良性的基线流量以及注入的攻击模式(编码的 PowerShell、暴力破解序列、可疑的进程链),以便可以根据看起来真实的遥测数据验证每一条检测规则。
**为什么使用 BeyondCorp/Pomerium:** Pomerium 做出的每一个访问决策——设备状态、身份、上下文——都会成为一条结构化日志,并建立索引到 Elasticsearch 中。这为平台提供了一个零信任日志源,以便针对其编写访问异常检测,同时也让你能够在自己的基础设施上获得相当于 Google BeyondCorp 模型的实操经验。
**核心接口:**
- 模拟器通过 REST API 将事件批量索引到 Elasticsearch
- Pomerium 将访问日志写入专用的 Elasticsearch 索引中
**在平台中的角色:** 产生供检测器运行测试的遥测数据。BeyondCorp 层增加了一个零信任访问面,该面本身即成为一个检测源。
### 3. `detections/` — 检测即代码
**它是什么:** 所有检测逻辑都以版本化的 YAML 文件形式存在于此目录中。每条规则都包含 ES|QL 查询、MITRE ATT&CK 映射(战术、技术、子技术)、严重性、响应指南和测试用例。`deploy.py` 通过 REST API 将规则推送到 Elastic 检测引擎。
**为什么使用 YAML + CI/CD:** 检测规则即是代码。它们应归属于版本控制中,并伴随代码审查、自动化测试和部署流水线——这与应用程序代码采用的标准相同。这是“检测即代码”的核心实践,它使得每一次规则更改都是可审计且可回滚的。
**ATT&CK 覆盖图:** 一个 `coverage_map/` 文件夹用于跟踪哪些 MITRE 技术已具备检测覆盖,哪些尚未覆盖。这将直接输入到威胁情报流水线(第 3 阶段)中,并为 Kibana 热力图仪表板提供数据支持。
**核心接口:**
- `deploy.py` 调用 Elasticsearch 检测规则 API
- CI 流水线 (`ci.yml`) 运行测试,调用 AI 辅助审查 agent 和审计器,然后在合并时执行部署
**在平台中的角色:** 检测层。每一个流入 n8n 和 AI agent 的告警都源于此目录中的某条规则。
### 4. `mcp-server/` — AI 工具网关
**它是什么:** 一个 Python MCP (Model Context Protocol) server,向 AI agent 公开一组预定义的工具。Agent 与 Elasticsearch、检测规则库或查询性能分析的每一次交互,都必须通过此服务器,绝不直接接触。
**为什么使用 MCP:** MCP 是一项新兴标准,旨在为 AI agent 提供对外部系统的结构化、可审计的访问。构建你自己的 MCP server(而不是使用一次性的 Python 函数)意味着工具集成只需编写一次,任何未来的 agent 都可以复用它们。这也意味着可以在单点进行访问范围的控制、记录和监控。
**暴露的工具:**
| 工具 | 作用 | 允许调用者 |
|---|---|---|
| `search_alerts` | 按严重性、时间、实体查询最近的告警 | 分诊 agent、辅助 agent (只读) |
| `run_esql` | 针对 SIEM 执行 ES|QL 查询 | 所有 agent (只读) |
| `get_coverage` | 返回 ATT&CK 技术覆盖状态 | 辅助 agent、审计器 |
| `list_rules` | 列出已部署的检测规则 | 辅助 agent、审计器 |
| `query_profile` | 分析 ES|QL 查询的性能开销 | 仅限审计器 |
**`scope_policy.py`:** 为 AI agent 实现最小权限原则。每个 agent 角色都有一个允许其调用的工具白名单。分诊 agent 不能调用 `query_profile`。审计器不能创建或修改规则。这是将针对人类用户的零信任原则同样应用到了 AI agent 身上。
**`audit_log.py`:** Agent 的每一次工具调用都会以结构化的 JSON 日志条目形式,写入到专门的 Elasticsearch 索引 (`mcp-audit-logs`) 中。字段包括:agent 角色、工具名称、参数、响应摘要、时间戳和延迟。这不是可有可无的遥测数据——它是第一级别的安全数据源。
**核心接口:**
- 暴露 MCP 协议 endpoint,供 `agents/` 中的 agent 使用
- 通过 REST API 写入 Elasticsearch
**在平台中的角色:** AI agent 与平台其余部分之间唯一的受控网关。它强制执行作用域控制,产生审计追踪记录,并使整个 AI 层变得可观测。
### 5. `agents/` — AI agent 角色
**它是什么:** 三个截然不同的 AI agent,每个都有特定范围的系统 prompt、通过 MCP server 定义的明确工具白名单,以及在 D&R 工作流中的具体职责。
#### 检测规则辅助审查 (`copilot/rule_copilot.py`)
辅助 agent 的工作是协助进行检测工程。当一个新的规则 PR 被打开时,CI 流水线会带着规则内容调用辅助 agent。辅助 agent 会对其进行审查并返回结构化反馈:MITRE ATT&CK 映射的完整性、可能的误报场景、缺失的测试用例、建议的查询改进,以及该规则是否与现有覆盖范围重复。
辅助 agent 不会批准或部署任何东西。它只在 PR 上生成审查评论。由分析师决定如何处理它。
**工具访问权限:** `run_esql`(用于测试查询逻辑)、`list_rules`(用于检查是否存在重复覆盖)、`get_coverage`(用于验证 ATT&CK 映射)。
#### 审计器 (`auditor/rule_auditor.py`)
审计器是双模型批评模式 实际应用的体现。在辅助 agent 产生输出(无论是规则审查、分诊评估还是查询建议)之后,审计器会在其到达分析师或 CI 流水线之前对其进行独立审查。审计器会检查三件事:
- **架构完整性:** 提议的规则是否遵循 schema 约定?它是否正确映射到了检测规则数据模型?
- **性能:** 这个 ES|QL 查询是否会非常消耗资源?审计器调用 `query_profile` 获取实际的成本估算,而不是靠猜测。
- **安全风险:** 规则是否产生了盲点?它是否依赖于攻击者可以屏蔽的字段?辅助 agent 的输出中是否包含看起来像 prompt injection 产物的内容?
审计器的发现将与辅助 agent 的审查一起附加到 PR 评论中。分析师在做决定之前会同时看到两者。
这是 D&R AI 工具中最罕见的能力——大多数团队只使用一个模型并信任其输出。在每一次 AI 输出上运行独立的批评者,并记录两方的发现,是一项具有重大意义的安全控制措施。
**工具访问权限:** `run_esql`、`list_rules`、`get_coverage`、`query_profile`。
#### SOC 分诊 agent (`triage_agent/triage.py`)
分诊 agent 是这三个中最具 Agentic 特性的。当 n8n 将一个复杂的告警路由到 AI 层时,分诊 agent 会接收到(经过脱敏处理的)告警,并运行多步推理循环:
1. 调用 `search_alerts` 提取过去 24 小时内同一实体的相关告警
2. 调用 `run_esql` 检查附加上下文(例如,该用户是否在同一时间窗口内从异常位置进行了认证?)
3. 评估严重性,映射到 ATT&CK 技术,识别出建议的下一步行动
4. 编写结构化的分诊笔记,准确引用哪些工具调用为每个结论提供了依据
5. 将输出返回给 n8n,n8n 会通过 Slack 将结果发送给分析师,或更新 Jira 工单
与 SOAR playbook 的关键区别在于:分诊 agent 会推理要寻找什么,而不仅仅是执行什么。工具调用轨迹是可见的,因此分析师可以看到 agent 的推理过程,而不仅仅是结论。
**`shared/redaction.py`:** 在任何告警数据接触到 AI 模型之前,此模块会剥离或哈希敏感字段(用户名、主机名、IP 地址)。AI 是基于脱敏后的数据进行工作的。脱敏映射保存在内存中,用于在向分析师展示的最终分诊输出中恢复实体名称。这是一种应用于 AI 边界的数据治理控制手段。
**工具访问权限:** `search_alerts`、`run_esql`。
### 6. `n8n/` — 编排层
**它是什么:** 一个自托管的 n8n 实例,与 Elastic stack 一起在 Docker 中运行。n8n 是 Elastic 触发的告警的第一接收者,并充当轻量级的 SOAR 层。
**为什么要在 MCP server 旁边使用 n8n:** 这两个组件用途不同,不应混为一谈。n8n 处理确定性的、可重复的自动化任务——创建 Jira 工单、向 Slack 发送消息、调用 VirusTotal 进行 IP 富化。这些工作流不需要 AI 推理,也不应消耗 AI API 预算。MCP server 和 AI agent 负责处理非确定性的、需要推理的工作——关联事件、评估意图、编写分诊笔记。
路由决策发生在 n8n 中:如果告警的严重性和类型符合简单的 playbook,n8n 会完全处理它。如果告警需要上下文推理,n8n 会调用 MCP server 的分诊 agent endpoint,并将 agent 的输出反馈给分析师。
**核心工作流:**
- `alert_triage.json` — 路由告警,针对复杂情况调用分诊 agent,将分析结果发送到 Slack
- `alert_enrich.json` — 在将数据传递给 AI 层之前,使用 VirusTotal、AbuseIPDB 和 Shodan 对告警实体进行富化
**在平台中的角色:** 运维自动化层。让简单的事情保持简单,并将复杂的事情路由到正确的地方。防止 AI 层成为处理日常工作的瓶颈。
### 7. `threat-intel/` — CTI 流水线
**它是什么:** 一个自动化流水线,用于摄取结构化的威胁情报,将其映射到平台当前的 ATT&CK 检测覆盖范围,识别差距,并使用 AI 辅助审查 agent 为未覆盖的技术起草候选检测规则。
**组件:**
- `stix_ingest.py` — 从 TAXII server 拉取 MITRE ATT&CK STIX 数据。解析技术、子技术和相关数据源。
- `otx_feed.py` — 从 AlienVault OTX 拉取最新的威胁报告。提取 pulse 报告中提及的 TTP。
- `ttp_mapper.py` — 将摄取的 TTP 与 Elasticsearch 中的 ATT&CK 覆盖图进行交叉引用。生成未被检测覆盖的技术列表。
- `gap_finder.py` — 根据威胁行为者的相关性(APT 组织当前是否在使用此技术?)、数据源可用性和检测难度,对覆盖差距进行优先级排序。
- `draft_rule.py` — 针对最高优先级的差距,调用辅助 agent 起草候选的 ES|QL 检测规则。草稿在提交到 `detections/rules/` 作为 PR 供分析师审查之前,会经过审计器审核。
**在平台中的角色:** 弥合外部威胁情报与内部检测覆盖之间的闭环。“在对手 TTP 方面保持领先”变成了一个产出可操作检测规则草案的自动化流水线,而不再是一种依赖手动搜索的习惯。
### 8. `.github/workflows/ci.yml` — CI/CD 流水线
**它是什么:** GitHub Actions 流水线,会在每一个触及 `detections/rules/` 的 PR 上运行。
**流水线阶段:**
```
PR opened
│
▼
1. Lint validate YAML schema, required fields, MITRE mapping format
│
▼
2. Co-pilot AI reviews rule quality, flags issues, suggests improvements
│
▼
3. Auditor AI independently reviews co-pilot output and rule for risk
│
▼
4. PR comment both reviews posted as a structured comment for analyst
│
▼
5. Merge (manual approval required)
│
▼
6. Deploy deploy.py pushes rule to Elastic detection engine
```
**在平台中的角色:** 使检测工程成为一种有纪律、可审计的实践。没有一条规则能在未经 schema 验证、AI 审查、独立审计和人工批准的情况下进入生产环境。
## 两大标志性能力
### 双模型批评模式
在这个平台中,每一次 AI 输出在到达人类或生产系统之前,都会经过第二个模型的独立审查。辅助 agent 提议;审计器批评。两个模型都不知道对方会说什么——它们是顺序运行的,不在一个共享的上下文窗口中。审计器的工作是对抗性的:找出辅助 agent 遗漏的内容。
这种模式解决了安全工作流中单模型 AI 的核心故障模式:一个提出了带有细微盲点的检测规则的 AI,自身并没有机制来发现它。而专门针对盲点、查询成本和 schema 完整性进行审查的第二个模型则能做到。
这也是对“你如何审计 AI 生成的输出以确保架构完整性、性能瓶颈和安全风险”的直接回答——这不是事后代码审查,而是 CI 流水线中内置的自动化控制措施。
### 将 Agent 行为作为检测源
MCP server 的 `audit_log.py` 会将每一次 agent 工具调用以日志形式写入 Elasticsearch 的 `mcp-audit-logs` 中。而 `detections/rules/` 中的检测规则就是针对这个索引编写的。平台时刻监视着它自己的 AI agent。
检测示例:
- 分诊 agent 调用 `search_alerts` 时使用的参数看起来像是在进行数据探测(这可能是由于 agent 摄取的恶意日志条目引发的 prompt injection)
- 任何 agent 尝试使用超出其作用域白名单的工具(纵深防御——应该被 MCP 层拦截,但这可以检测到是否有漏网之鱼)
- 审计器通过率的峰值超过基线两个标准差(可能是系统 prompt 遭到了篡改)
- 分诊 agent 产生的结构化输出与其工具调用轨迹存在显著分歧(agent 的推理与证据不一致)
这使得 AI 层本身变成了一个受监控、可检测的攻击面——对于任何处理不受信任数据(安全日志)并产生特权输出(分诊决策、检测规则)的系统来说,这都是一种正确的安全姿态。
## 实施路线图
### 第 1 阶段 — 核心平台(第 1-2 周)
**目标:** 可运行的端到端演示。告警在 Elastic 中触发 → n8n 路由告警 → 分诊 agent 进行推理 → 分析师看到结构化输出。
| 任务 | 模块 | 交付物 |
|---|---|---|
| 通过 Docker 部署 Elastic stack | `infra/` | `docker-compose.yml`, `.env`, Kibana 可通过 `localhost:5601` 访问 |
| 合成事件模拟器 | `telemetry/simulators/` | `auth_events.py`, `process_events.py` 索引到 Elastic |
| 3 个初始检测规则 | `detections/rules/` | 包含 MITRE 映射和测试用例的 ES|QL YAML 规则 |
| 规则部署脚本 | `detections/` | `deploy.py` 通过 Elastic REST API 推送规则 |
| MCP server — 2 个工具 | `mcp-server/` | `search_alerts` 和 `run_esql` 实现端到端运行 |
| MCP 审计日志记录 | `mcp-server/` | `audit_log.py` 将工具调用写入 `mcp-audit-logs` 索引 |
| 分诊 agent | `agents/triage_agent/` | 多步循环,脱敏处理,结构化分诊输出 |
| 辅助 agent (CI 步骤) | `agents/copilot/` | 审查规则 PR,发布结构化评论 |
| 审计器 (CI 步骤) | `agents/auditor/` | 审查辅助 agent 的输出,发布审计结果 |
| n8n 告警路由 | `n8n/` | 在 Docker 中运行 n8n,告警 webhook → 路由 → 分诊 agent |
| GitHub Actions CI | `.github/workflows/` | Lint → 辅助 agent → 审计器 → 部署流水线 |
**第 1 阶段面试故事:** “我基于开源 Elastic 构建了一个检测即代码流水线,其中每一条检测规则在进入生产环境之前,都要经过 AI 辅助 agent 的审查和独立 AI 审计器的审核。AI agent 本身也受到了监控——它们执行的每一次工具调用都会被重新索引到 SIEM 中,并且我编写了针对异常 agent 行为的检测规则。”
### 第 2 阶段 — 零信任访问层(第 3 周)
**目标:** 在 Kibana 之前部署 BeyondCorp 风格的 IAP。访问决策成为日志源。
| 任务 | 模块 | 交付物 |
|---|---|---|
| 在 Docker 中部署 Pomerium IAP | `telemetry/beyondcorp/` | `pomerium.yml
│ │ ├── authentik.yml
│ │ ├── authentik-db.yml`, Kibana 只能通过 IAP 访问 |
| 访问日志摄取 | `telemetry/` | Pomerium 日志被索引到 `beyondcorp-access` Elastic 索引中 |
| 访问异常检测规则 | `detections/rules/` | 针对安全工具的异常访问模式触发的 ES|QL 规则 |
**第 2 阶段面试故事:** “安全工具本身——Kibana、n8n 仪表板——位于 BeyondCorp 风格的身份感知代理之后。每一个访问决策都会被记录下来,并且我编写了相应的检测规则,如果有人在正常模式之外访问 SOC 工具,就会触发警报。将零信任应用于 SOC 自身的基础设施。”
### 第 3 阶段 — 威胁情报流水线(第 4 周)
**目标:** 自动化的 TTP 到覆盖差距流水线,并生成由 AI 起草的检测规则。
| 任务 | 模块 | 交付物 |
|---|---|---|
| 摄取 MITRE ATT&CK STIX | `threat-intel/` | `stix_ingest.py` 从 TAXII server 拉取数据 |
| 摄取 OTX feed | `threat-intel/` | `otx_feed.py` 解析 pulse 报告获取 TTP |
| 覆盖差距分析 | `threat-intel/` | `gap_finder.py` 交叉引用覆盖图 |
| AI 起草规则流水线 | `threat-intel/` | `draft_rule.py` → 辅助 agent → 审计器 → PR |
| ATT&CK 热力图仪表板 | Kibana | 显示已检测和未检测技术的覆盖热力图 |
**第 3 阶段面试故事:** “该平台摄取 MITRE ATT&CK STIX 数据和威胁报告,将它们与当前的检测覆盖率进行交叉比对,根据活跃威胁行为者的相关性对缺口进行优先级排序,并使用 AI 为最关键的缺口起草候选规则。分析师看到的是一个 PR,而不是电子表格。”
## 展示的技能 — 映射到面试要求
| 平台能力 | 展示的技能 |
|---|---|
| Elastic SIEM、ES|QL 规则、通过 REST API 部署 | SIEM 架构,检测工程 |
| 结合 GitHub Actions CI 的检测即代码 | DevSecOps,用于安全内容的 CI/CD |
| 具有作用域工具访问限制的 MCP server | REST API 集成,AI 工具设计 |
| 双模型批评模式(辅助 agent + 审计器) | LLM 输出审计,AI 治理 |
| 具有多步推理能力的分诊 agent | Agentic AI,安全工作流中的 LLM 集成 |
| 将 Agent 行为索引作为检测源 | 创新的检测工程,AI 安全 |
| Kibana 前端的 Pomerium IAP | BeyondCorp / 零信任访问模型 |
| 摄取 STIX,TTP 到覆盖差距的流水线 | 威胁情报运营化 |
| n8n 编排层 | 相当于 SOAR 的工作流自动化 |
| AI 边界之前的脱敏网关 | 数据治理,AI 系统中的 PII 处理 |
## 快速开始(第 1 阶段)
前置条件:在 macOS 上安装至少分配了 8GB 内存的 Docker Desktop,Python 3.11+,以及一个 Claude API key。
```
# Clone repo
git clone https://github.com/subhsamal/Detection-as-Code-with-AI
cd Detection-as-Code-with-AI
# 启动 Elastic stack
cd infra
docker compose up -d
# 验证 Elasticsearch 是否健康
curl -u elastic:$ES_PASSWORD http://localhost:9200/_cluster/health
# 运行 event simulators 以用 synthetic telemetry 填充 Elastic
cd ../telemetry/simulators
python auth_events.py
python process_events.py
# Deploy starter detection rules
cd ../../detections
python deploy.py
# 启动 MCP server
cd ../mcp-server
python server.py
# Kibana 现在可通过 http://localhost:5601 访问
```
*本文档是构建过程中的北极星指标。编写的每一个代码文件、提交的每一个 PR、录制的每一次演示,都可以映射回上述路线图中的某一项任务。*
标签:AI智能体, JSONLines, MIT许可证, 威胁情报, 安全运营, 开发者工具, 扫描框架, 检测与响应, 检测即代码, 请求拦截, 逆向工具, 零信任