Blute122/argus
GitHub: Blute122/argus
Argus 是一个可自托管的开源 SIEM 系统,提供从日志摄取、Sigma 规则检测、威胁狩猎到事件响应的完整安全运营能力。
Stars: 0 | Forks: 0
# Argus
[](LICENSE)
[](https://github.com/Blute122/argus/actions/workflows/ci.yml)
**Argus** 是一个可自托管的 Security Operations Center / SIEM:实时日志流、真实日志摄取、Sigma 风格的检测规则、基于关联的告警、威胁狩猎(SPL 风格语法)、事件响应工作流、资产清单、MITRE ATT&CK 映射以及攻击模拟。
它有两种运行模式:
- **Demo / 零基础设施** — 合成日志生成器为 pipeline 提供数据;日志存储在 SQLite 中。无需 Docker。非常适合培训与开发。
- **真实 SIEM** — 日志存储和搜索在 **OpenSearch** 中进行,metadata 存放在 **Postgres** 中,并带有真实的摄取和检测功能(参见 [docs/SIEM_TRANSFORMATION_PLAN.md](docs/SIEM_TRANSFORMATION_PLAN.md))。
模式完全由配置控制 — 无需修改代码。
## 快速开始(零基础设施,SQLite)
```
# backend
cd backend
python -m venv venv && venv\Scripts\activate # Windows
pip install -r requirements.txt
cd .. && uvicorn backend.main:app --reload
# frontend
cd frontend
npm install
npm run dev
```
默认配置:`OPENSEARCH_ENABLED=false`,`DATABASE_URL=sqlite`,`DEMO_MODE=true`。
将 `.env.example` 复制为 `.env` 以进行覆盖修改。
## 使用 Docker 的完整技术栈(OpenSearch + Postgres + backend + frontend)
一条命令即可构建并运行所有内容:
```
docker compose up --build
```
然后在 **http://localhost:8080** 打开 dashboard。服务端口如下:
OpenSearch `:9200`,Dashboards `:5601`,Postgres `:5432`,API `:8000`,UI `:8080`。
- 日志存储在 OpenSearch 中(基于时间的 `logs-YYYY.MM.DD` 索引);metadata 存放在 Postgres 中。JWT 密钥会自动生成并存入挂载的卷中。
- `DEMO_MODE=true`(compose 的默认设置)附带了示例数据和培训登录账号(`admin` / `admin123`)。在 `docker-compose.yml` 中设置 `DEMO_MODE=false` 以进行真实部署 — 将会生成一个 **管理员密码并在 backend 日志中打印一次**,且不会创建示例账号/资产。
- 在公开该技术栈之前,请更改默认的 OpenSearch/Postgres 凭据。
要在**不进行容器化**的情况下针对这些服务运行 backend,请在 `backend/.env` 中设置:`OPENSEARCH_ENABLED=true`,`OPENSEARCH_PASSWORD=Soc!Secur3Pass`,`DATABASE_URL=postgresql+psycopg2://soc:soc@localhost:5432/soc`,然后启动 uvicorn。要将现有的 SQLite metadata 迁移过去:
`python -m backend.scripts.migrate_sqlite_to_pg`(`--include-logs` 还会将旧日志重新索引到 OpenSearch 中)。
## 发送真实日志(摄取)
真实日志通过摄取 pipeline(与 demo 生成器使用的路径相同)进入。一旦有了真实数据源,请设置 `DEMO_MODE=false`,以便只显示真实数据。
首次启动时,服务器会打印一个 **默认 ingest key**(仅显示一次)— 请复制保存。管理员可以通过 `POST /api/ingest/keys` 生成更多 key。
**HTTP(agents、Beats、Vector、curl):**
```
# 单个事件(JSON 或原始日志行)
curl -X POST http://localhost:8000/api/ingest \
-H "X-Ingest-Key: " \
-d '{"source":"windows","event_type":"failed_login","src_ip":"9.9.9.9","message":"4625"}'
# 批量:NDJSON,每行一个 JSON 对象或原始行
curl -X POST http://localhost:8000/api/ingest/bulk \
-H "X-Ingest-Key: " --data-binary @events.ndjson
```
添加 `?source_type=syslog|json|auto` 以强制指定解析器(默认的 `auto` 会进行自动嗅探)。
**Syslog(RFC 3164 / 5424):** 设置 `SYSLOG_ENABLED=true`(默认监听 udp/tcp `5514` 端口),然后将设备指向它:
```
logger -n localhost -P 5514 -d "test event"
```
**文件:** 设置 `FILE_TAIL_ENABLED=true` 和 `FILE_TAIL_PATHS=/var/log/auth.log,/var/log/nginx/access.log`。新增的行会被持续跟踪并摄取。
自定义格式:在 `backend/ingestion/parsers/` 下添加一个解析器,并执行 `register("mytype", parse)`。
## 检测规则
检测规则是存放在 `backend/detection/rules/` 中的 **Sigma 风格 YAML 规则**,通过两种方式进行评估:
- **流式处理** — 在每个事件摄取时进行匹配(进程内执行,适用于任何存储)
- **定时处理** — `type: threshold` 规则每 30 秒在一个时间窗口内运行一次(例如“5 分钟内来自同一 IP 的 5 次以上失败登录”)
在 **Detection Rules** 页面管理它们(启用/禁用、查看 YAML、针对最近的日志进行测试)或通过 API(`/api/detection/rules`)管理。切换状态需要拥有 `admin` 或 `threat_hunter` 角色。
将 `.yml` 文件放入规则目录即可添加您自己的规则:
```
title: Suspicious PowerShell Execution
id: my-powershell-rule
level: critical
detection:
selection:
event_type: powershell_execution
command_line|contains: ['-enc', 'frombase64']
condition: selection
tags: [attack.execution, attack.t1059.001]
recommended_action: Isolate host, review parent process tree.
```
匹配器支持常见的 Sigma 构造(字段修饰符、list-OR、带 `and/or/not` 的 `condition`、`all of`/`1 of them`),因此许多公开的 SigmaHQ 规则无需修改或只需少量修改即可直接使用。
## 配置
所有设置都位于 [backend/config.py](backend/config.py) 中,并从环境变量 / `.env` 中读取。完整列表请参见 [.env.example](.env.example)。
| 变量 | 默认值 | 用途 |
|---|---|---|
| `DATABASE_URL` | `sqlite:///./argus.db` | 关系型 metadata 存储 |
| `OPENSEARCH_ENABLED` | `false` | 使用 OpenSearch 作为日志存储 |
| `OPENSEARCH_URL` / `_USER` / `_PASSWORD` | `https://localhost:9200` / `admin` | OpenSearch 连接 |
| `DEMO_MODE` | `true` | 运行合成日志生成器 |
| `INGEST_ENABLED` | `true` | 启用 `/api/ingest` HTTP endpoint |
| `SYSLOG_ENABLED` | `false` | 启动 syslog UDP+TCP 监听器 |
| `SYSLOG_UDP_PORT` / `SYSLOG_TCP_PORT` | `5514` | Syslog 监听端口 |
| `FILE_TAIL_ENABLED` / `FILE_TAIL_PATHS` | `false` / `` | 跟踪文件并摄取新增行 |
| `CORS_ORIGINS` | `*` | 允许的前端来源(在生产环境中需锁定限制) |
## 架构
日志(大吞吐量、仅追加)存放在 [backend/search/](backend/search/) 中通用接口背后的 **日志存储**(OpenSearch,或 demo 模式下的 SQLite)中。Metadata(用户、事件、告警、资产、保存的狩猎记录)存放在 **关系型数据库**中。摄取、检测和加固分别位于 [backend/ingestion/](backend/ingestion/)、[backend/detection/](backend/detection/) 以及 auth/audit 层中。完整设计请参阅 [docs/SIEM_TRANSFORMATION_PLAN.md](docs/SIEM_TRANSFORMATION_PLAN.md)。
## 贡献与安全
欢迎贡献 — 请参阅 [CONTRIBUTING.md](CONTRIBUTING.md)。如需报告漏洞,请遵循 [SECURITY.md](SECURITY.md)(请不要开启公开的 issue)。基于 [MIT](LICENSE) 协议授权。
标签:PostgreSQL, Sigma规则, 安全运营中心, 测试用例, 目标导入, 网络映射, 请求拦截, 逆向工具