supermhel/argiem
GitHub: supermhel/argiem
一款面向工业中小企业的开源 SIEM 系统,将多源安全日志规范化为 OCSF 格式并提供本地 AI 告警甄别与 OpenSearch 存储。
Stars: 0 | Forks: 0
# ARGIEM
**面向欧洲工业中小企业(Mittelstand)的开源 SIEM —— 将您的
工厂和 IT 日志转化为符合 NIS2/DORA 要求的证据,其 AI 甄别功能绝不会离开您的
网络。**
ARGIEM 从多个来源摄取日志,将其规范化为统一的 schema
([OCSF](https://schema.ocsf.io/)),在滑动窗口上运行关联规则,
并在仪表板中展示警报。每个服务都是独立的,仅通过消息总线
与系统的其余部分进行通信,因此您可以扩展或替换任何部分
而无需重写其他部分。
与通用的自托管 SIEM 相比,它有三个不同之处:
- **原生 OCSF,非后期改造。** 每个来源从第一天起就规范化为相同的开放
schema —— 一次性检测,保持可移植性,无供应商日志格式
锁定。
- **OpenSearch,非 Elastic。** 存储引擎上没有许可证星号(限制)——
开源的故事没有附属细则。
- **绝不离开您网络的 AI 甄别。** 默认使用本地 Ollama,并带有
文档化的存根降级方案 —— 您的警报数据绝不会通过
第三方 LLM API 进行传输。
v0.4 中的新功能:包含了该切入领域实际所需的解析器包 —— MCP/AI-agent
工具调用审计日志、工业 OPC UA 控制系统事件,以及 n8n 自动化平台
日志 —— 外加一个事件报告草稿钩子(这是 NIS2/DORA
合规证据功能开放的一半;请参阅 [`contracts/reporting.md`](contracts/reporting.md))。
## 快速开始(10 分钟)
```
git clone https://github.com/supermhel/argiem.git && cd argiem
make preflight # doctor: checks vm.max_map_count, Docker RAM, free ports
make demo # docker compose up -- a real SSH brute-force alert appears
# in the dashboard within ~30-60s, no manual step
# 打开 http://localhost:8080
```
手头没有 Docker?整个检测管道可以在零基础设施下运行:
`make e2e` 在完全没有 Redis/OpenSearch/Docker 的情况下,证明了相同的 SSH 暴力破解 → 真实警报 → 幂等重放
路径。
## 演示
观看 ARGIEM 将真实的 SSH 暴力破解突发流量转化为真实警报 —— **零
基础设施**(无需 Docker、Redis、OpenSearch):
```
bash tools/demo.sh
```
这会将来自同一 IP 的 10 次失败的 SSH 登录尝试通过整个管道
(规范化 → 检测 → 甄别 → 索引),展示生成的暴力破解**警报**,
并重放该事件以证明该警报是**幂等的**(去重,而非
重复)。
### 自己尝试
```
# Zero-infra:SSH brute-force -> 真实告警,在 replay 下幂等(无需 Docker)。
make e2e # runs demo_e2e.py (fast, no narration)
bash tools/demo.sh # same test with banner + story narration
# # Windows:powershell -File tools\demo.ps1
# 完整 live stack(collect -> normalize -> detect -> index -> dashboard):
make up # docker compose up -d
# ...然后打开位于以下地址的 ARGIEM 告警控制台:
# http://localhost:8080
make down # stop the stack and remove volumes
```
## 实际功能(v0.3 已发布,v0.4 进行中)
ARGIEM 提供了一个**可工作的检测管道**。我们对于什么是
已实现和什么是计划中非常明确 —— 这是一个安全工具,因此准确性比
冗长的功能列表更重要。
| 功能 | 状态 | 备注 |
|---|---|---|
| **检测管道**(收集 → 规范化 → 检测 → 索引 → 仪表板) | ✅ 正常工作 | 自 v0.1 起实现端到端 |
| **解析器(10个)** | ✅ 正常工作 | Cisco ASA、Active Directory、VMware vSphere、Linux SSH、通用 syslog、Windows Event Log(包含账户变更 4720/4722/4726/4728/4732)、数据库审计(GRANT/REVOKE/ALTER)、MCP/AI-agent 工具调用审计、OPC UA/OT 审计、n8n 自动化平台审计 —— 全部 → OCSF |
| **检测规则(17条)** | ✅ 正常工作 | 暴力破解、端口扫描、横向移动、密码喷洒、特权组授权、非工作时间管理、不可能的行程、银行数据库提权、DC 批量虚拟机删除、代理凭证文件访问/工具调用突发/提示注入指示器、OT 维护外写入/新建工程连接/配置变更、n8n 新暴露的 webhook/非工作时间修改的工作流 |
| **规则语法** | ✅ 正常工作 | 布尔逻辑、比较运算符(`gt/gte/lt/lte/ne`)、白名单抑制(`not_in`,CIDR + 精确匹配)、时间段(`outside_hours`)—— 在格式错误的输入上全部失败关闭 |
| **规则预过滤** | ✅ 正常工作 | 规则按 `class_uid` 等值选择进行分桶;事件仅根据候选规则进行评估(修复了 O(规则×事件) 的扫描问题) |
| **防休眠防护** | ✅ 正常工作 | CI 门控中的 `tools/check_rule_producers.py` 证明了每个规则的选择都可以由真实解析器实际发出的值所满足 |
| **AI 甄别**(本地 Ollama) | ✅ 正常工作 | 通过 `OLLAMA_URL` 进行真正的本地 LLM 甄别;在零基础设施下降级为文档化的透传存根 |
| **甄别工作流** | ✅ 正常工作 | 每个警报的状态和分析师备注,通过 WS-3 甄别 API 持久化,可在仪表板中编辑;并发写入在两个层面受到保护(进程内锁 + OpenSearch 乐观并发控制) |
| **事件报告草稿钩子** | ✅ 正常工作(v0.4) | `POST /alerts/{id}/report` 根据警报事实渲染通用的 Markdown 事件报告,始终标记为 `status: draft` 并附带免责声明;受监管内容的后端为付费的可选附加组件(`contracts/reporting.md`) |
| **可选认证** | ✅ 正常工作(v0.4) | 甄别/库存 API 上的共享密钥 `ARGIEM_API_KEY`,可选的仪表板 basic-auth,可选的 Redis `AUTH` —— 未设置(默认)保持完全开放,与 v0.1-v0.3 的行为一致 |
| **Syslog UDP 监听器**(WS-1) | ✅ 正常工作 | 实时数据报 → `raw.events` |
| **甄别工作流** | ✅ 正常工作(v0.3) | 每个警报的状态和分析师备注,通过 WS-3 甄别 API 持久化,可在仪表板中编辑。容器到容器的 Nginx 路径已通过配置审查验证,但尚未通过实际堆栈冒烟测试验证 |
| SNMP 解析器 | 🚧 计划中 | 延期 —— [很好的第一个问题](CONTRIBUTING.md) |
| NetFlow 解析器 | 🚧 计划中 | 延期(二进制格式) |
| 自定义 JSON 解析器 | 🚧 计划中 | 延期 |
## 前置条件
- **Docker Desktop**(或 Docker Engine + Compose v2),并且为 Docker 分配了 **≥ 4 GB 内存**。
- **操作系统:** Linux、macOS 或 **通过 WSL2 运行的 Windows**。(演示堆栈运行 Linux 容器;
预检查和演示脚本是 POSIX `sh`。)
- **Python 3** —— 仅当您想运行契约测试或贡献解析器时才需要。
您**不需要** Docker 即可添加解析器(请参阅[贡献指南](#contributing))。
## ⚠️ 预检查 —— 启动堆栈前请阅读此内容
在具有默认内核设置的 Linux/WSL2 上,OpenSearch(存储引擎)**将无法启动**。
它需要提高 `vm.max_map_count` 限制。**每台机器运行一次**
(重启后会重置):
```
sudo sysctl -w vm.max_map_count=262144
```
使其在重启后永久生效:
```
echo 'vm.max_map_count=262144' | sudo tee /etc/sysctl.d/99-argiem.conf
```
`make preflight`(见下文)会为您检查此项,如果有任何缺失,会打印出确切的修复方法。
## 快速开始
```
# 1. 检查您的机器是否已准备就绪(vm.max_map_count、Docker RAM、可用端口)
make preflight
# 2. 启动 full stack
make demo
```
`make demo` 运行预检查,然后使用 Docker Compose 启动所有服务。
所有服务都是长时间运行的守护进程,带有 `/health` 端点和重启策略。
其他便捷的目标命令:
```
make e2e # zero-infra ACCEPTANCE test: SSH brute-force -> real alert (no Docker)
make test # run the full zero-infra contract test suite (no Docker needed)
make up # start the stack detached (docker compose up -d)
make down # stop the stack and remove volumes
```
## 端口
| 端口 | 服务 | 描述 |
|------|---------|------------|
| 6379 | `redis`(`siem-bus`) | 服务间的消息总线 |
| 9200 | `opensearch`(`siem-store`) | 事件/警报存储 + 查询 API |
| 5601 | `dashboards`(`siem-dashboards`) | OpenSearch Dashboards |
| 8000 | `ws6-inventory` | 库存 API(IP/MAC 历史记录) |
| 8080 | `ws7-dashboard` | ARGIEM 警报控制台 |
| 5514/udp | `ws1-collectors` | 实时 syslog 摄取(未认证 —— 仅限受信任的网段) |
| 8013 | `ws3-indexer` | 甄别 API —— **仅限内部**,仪表板通过容器到容器的方式代理到此;不发布到主机 |
`make preflight` 会在您启动前检查已发布的端口是否空闲。
## 如何查看警报
v0.1 的验收测试是一个真实的**暴力破解警报**,而非模拟数据:
1. **信号。** 60 秒内来自同一源 IP 的 10 次失败认证事件。
ARGIEM 从 Linux SSH 的 `Failed password` 行或
Windows 的 `EventID 4625` 生成这些事件 —— 两者都规范化为相同的 OCSF Authentication 事件
(`class_uid: 3002`,`activity_id: 4`)。
2. **规则。** [`contracts/rules/common_bruteforce.yml`](contracts/rules/common_bruteforce.yml)
匹配这些事件,按 `src_endpoint.ip` 分组,具有 `threshold: 10` 和
`window_seconds: 60`。它与来源无关,因此无论在 SSH 还是 AD 上触发效果完全相同。
3. **警报。** 当来自同一 IP 的第 10 次失败落在时间窗口内时,
检测服务会发出一个警报,该警报流向索引器并进入仪表板
警报列表。
查看**整个管道**在**无基础设施**的情况下生成警报 ——
验收测试注入了 10 次失败的 SSH 登录,并断言真实的暴力破解警报
到达索引,并且重放相同的事件会重用相同的警报 ID
(幂等,因此至少一次投递永远不会产生重复警报):
```
make e2e # or: python tools/demo_e2e.py
```
预期结尾:
```
ALERT: Authentication brute-force from single source src=203.0.113.5 score=70 id=...
T7 OK: replay reused alert_id ... -> deduped (alerts count stayed 2)
[OK] ARGIEM v0.1 acceptance: SSH brute-force -> real alert in the index, idempotent under replay. Zero infra.
```
倾向于单元级别的检查?WS-4 检测契约测试断言规则在第
10 次尝试时触发:`cd services/ws4-detection && python test_contract.py`。
对于完整的 Docker 化堆栈(收集 → 规范化 → 检测 → 索引 → 仪表板),运行
`make demo` 并在 打开仪表板。
## 架构
```
WS-1 Collectors ─raw.events─▶ WS-2 Normalization ─normalized.events─┬─▶ WS-3 Indexer ─▶ OpenSearch
(Cisco ASA / AD / (parsers → OCSF) ├─▶ WS-6 Inventory (IP/MAC)
VMware / Linux SSH) └─▶ WS-4 Detection ─scored.events─▶ WS-3
│ alerts ─▶ WS-3 / WS-7
└─ai.requests─▶ WS-5 AI (stub) ─▶ WS-3/WS-7
WS-7 Dashboard ◀── WS-6 API + alerts
```
服务之间**唯一**的耦合是消息总线。其他一切都是
[`contracts/`](contracts/) 下的冻结契约。所有的源格式异构性都在
边缘被吸收(WS-2 中每个来源一个解析器);系统的内部只处理单一的
schema(OCSF)。
| WS | 服务 | 角色 | v0.1 状态 |
|----|---------|------|-------------|
| 1 | `services/ws1-collectors` | 收集日志 → `raw.events` | ✅ |
| 2 | `services/ws2-normalization` | 解析器 → 验证过的 OCSF 事件 | ✅(4 个解析器) |
| 3 | `services/ws3-indexer` | 路由 + OpenSearch 索引(幂等) | ✅ |
| 4 | `services/ws4-detection` | 关联规则 + 评分 + 窗口化 | ✅ |
| 5 | `services/ws5-ai` | 甄别 | 🚧 透传存根(AI 在 v0.2 中) |
| 6 | `services/ws6-inventory` | IP/MAC 库存 API(SQLite) | ✅ |
| 7 | `services/ws7-dashboard` | 警报控制台 | ✅ |
有关完整的设计、范围决策和路线图,请参阅
[v0.1 构建计划](docs/superpowers/specs/2026-06-27-argiem-v0.1-build-plan.md) 和
[`docs/PHASE0_README.md`](docs/PHASE0_README.md)。
## 安全性
ARGIEM v0.1 服务专为**localhost / Docker-Compose 网络**设计,并且
**未**针对互联网暴露进行硬化。**v0.1 中设计为没有身份验证**,
并且检测引擎会执行规则文件 —— 因此请仅运行您信任的规则。
有关完整的威胁边界以及如何报告漏洞,请参阅
**[SECURITY.md](SECURITY.md)**。
## 许可证
ARGIEM 采用 **Apache License 2.0** 授权。请参阅 [LICENSE](LICENSE)。
标签:AI风险缓解, OCSF, 安全合规, 安全运营, 扫描框架, 搜索引擎查询, 本地AI, 版权保护, 网络代理, 请求拦截, 逆向工具