wahidhendrawan/Forensis
GitHub: wahidhendrawan/Forensis
一款集日志分析、网络流量检查、内存取证与多引擎威胁关联于一体的开源数字取证与事件响应平台。
Stars: 0 | Forks: 0
[](https://github.com/wahidhendrawan/Forensis/actions/workflows/ci.yml)
# Forensis
[](https://github.com/wahidhendrawan/Forensis/blob/main/LICENSE)
[](https://github.com/wahidhendrawan/Forensis/releases)
[](https://github.com/wahidhendrawan/Forensis/actions)
[](https://wahidhendrawan.github.io/Forensis/)
Forensis 是一个用于威胁分析和数字取证操作的开源 Web 平台。
它为日志分析、网络数据包检查、内存取证、多引擎检测关联以及安全的用户管理提供了统一的工作流。
## DFIR 服务架构
Forensis 现在使用面向服务的内部架构(模块化单体基线),直接映射到生产环境的微服务边界:
- **api-service** 职责:
- 认证、用户、案例注册、artifact 注册、作业提交、作业状态 API。
- 端点:`/api/cases`, `/api/jobs`, `/api/jobs/`, `/api/jobs//status`。
- **analysis-workers** 职责:
- 用于 `logs`、`network` 和 `memory` 分析作业的专用 Celery worker。
- 队列分离的 worker(`logs`、`network`、`memory`、`rules`)已准备好进行基于队列深度的自动缩放。
- 分阶段 pipeline:`queued -> parse -> enrich -> persist -> post_rule_match -> complete/failed`。
- **rule-service** 职责:
- Sigma/YARA 富化编排和关联限制。
- 针对大型数据集的异步 Sigma 后处理。
- **ui-service** 职责:
- 前端页面获取作业状态并在分析期间显示实时进度。
为了兼容性,当前仓库将这些服务保留在一个可部署单元中,同时领域/服务边界已准备好被提取为独立的运行时服务。
### 调查数据模型
核心标准化实体(内部 ECS 风格 schema 版本 `forensis-ecs-0.1`):
- `Case`
- `Artifact`
- `AnalysisJob`
- `Finding`
- `RuleMatch`
- `TimelineEvent`
### 推荐的生产数据库
- **主要建议**:PostgreSQL 16+(`postgresql+psycopg` 驱动)。
- 原因:
- 在多 worker 负载下,具有比 SQLite 更强的并发写入性能,
- 更好的索引、查询规划和操作工具,
- 对于 case/finding/timeline 规模而言更安全的扩展路径。
- 对于轻量级部署和开发,仍然支持 SQLite。
### 迁移版本控制
- 包含 Alembic 用于数据库 schema 版本控制。
- 迁移源:
- `alembic.ini`
- `migrations/`
- CI 漂移检查:
- `scripts/check_migration_drift.py`
- `.github/workflows/ci.yml`
## 核心功能
### 1. 日志解析器和分析器
- 解析 Apache、Syslog、CSV、JSON、类 Elastic 和类 Splunk 的日志输入。
- 从可疑模式和状态行为中检测异常。
- 将解析后的事件与 Sigma、YARA、Threat Intel 和基线分析进行关联。
- 在一个视图中显示威胁评分、TI 匹配、YARA 命中和基线漂移。
- 将结果导出为 JSON 和 CSV。
### 2. 网络流量分析器
- 分析 PCAP 和 PCAPNG 文件。
- 构建流摘要(源、目标、端口、协议、字节数、数据包数、持续时间)。
- 突出显示可疑的通信模式。
- 对网络事件运行 Sigma + YARA + Threat Intel + 基线关联。
- 在流和异常输出中包含时间线字段(`first_seen`、`last_seen`)。
- 应用数据包/流防护机制,以保持大型捕获处理的响应速度。
- 将结果导出为 JSON 和 CSV。
### 3. 内存
- 独立的取证页面,与 Helper 分开。
- 接受原始粘贴或上传以下格式:TXT、LOG、JSON、NDJSON/JSONL、CSV、TSV、XML、YAML、ZIP、VMEM、MEM、RAW、DMP、IMG、BIN。
- 解析混合的内存工具输出,并显示带有严重程度的可疑指标。
- 对解析后的内存 artifact 运行 YARA/TI/基线富化。
- 提供后续建议并导出为 JSON/CSV。
### 4. Helper
- 用于内存、网络和日志调查 playbook 的计划生成器。
- 常见 DFIR 命令的操作速查表。
- 针对快速取证移交和可重复的分析师工作流进行了优化。
### 5. Sigma 引擎和规则管理
- 内置来自仓库 `SigmaHQ/sigma` 的 SigmaHQ 基线规则集,固定在提交 `994da16651194500b607a3007186c29779e1f961`(`rules/` 路径)。
- 启动时自动引导本地基线缓存(核心规则无需手动同步)。
- 针对日志、网络和内存 artifact 的本地 Sigma 规则关联。
- 仪表板操作可从远程 URL 同步 Sigma 规则。
- 支持在不重启整个技术栈的情况下重新加载规则。
### 6. 快速恶意检测技术栈(超越 Sigma)
- 用于内存/日志/网络文本 artifact(`yara_rules/`)的 **YARA 引擎**。
- 针对IP/域名/哈希的 **Threat Intel 富化**,包含本地馈源 + 本地缓存 + 评分(`threat_intel/ioc_feed.json`)。
- 针对日志分析中公共 IP 指标的外部声誉查询的 **OTX 公共 IP 富化**(在用户和管理中配置)。
- 按时间窗口和共享身份(IP/主机)进行 **跨源关联**(日志 + 网络 + 内存)。
- 每个环境的 **实体基线和允许列表**(`config/entity_baseline.json`、`config/entity_allowlist.json`)。
- 带有良性/恶意数据集和自动回归检查的 **规则 QA pipeline**(`scripts/rule_qa.py`)。
### 7. 事件搜索和分析存储
- **OpenSearch** sink,用于大规模的索引事件搜索。
- **ClickHouse** sink,用于大容量事件分析和时间线聚合。
- 搜索 API 支持 OpenSearch 后端 + 数据库回退。
### 8. 用户和管理
- 基于角色的访问控制(管理员和分析师)。
- 用户 CRUD 和组管理。
- 内置 MFA (TOTP) 设置、禁用和重置流程。
- 专用的用户和安全区域,用于账户治理。
- 管理面板中的 OTX API 密钥管理,带有掩码显示以及清除/轮换控制。
- 对敏感的 POST 操作(管理和分析器操作)提供 CSRF 保护。
### 9. 历史和报告
- 持久化日志、网络、内存 playbook 和内存取证的分析历史。
- 查看、删除和审查以前的会话。
- 从当前内存中的结果集导出报告包。
## 技术栈
- Flask
- SQLAlchemy(推荐 PostgreSQL,回退到 SQLite)
- Flask-Login 和 Flask-Bcrypt
- PyOTP (MFA)
- Celery + Redis(异步处理)
- YARA(通过 `yara-python`)
- Gunicorn(WSGI 运行时)
- Alembic(schema 迁移)
- Bootstrap 5 前端
## 快速开始
### Docker(推荐)
1. 确保已安装 Docker 和 Docker Compose。
2. 在项目根目录创建或编辑 `.env`:
```
FORENSIS_SECRET_KEY=replace_with_strong_secret
FORENSIS_ADMIN_USER=admin
FORENSIS_ADMIN_PASSWORD=forensis123
CELERY_BROKER_URL=redis://redis:6379/0
CELERY_RESULT_BACKEND=redis://redis:6379/0
# 可选 SigmaHQ baseline controls
# FORENSIS_SIGMAHQ_REPO=SigmaHQ/sigma
# FORENSIS_SIGMAHQ_COMMIT=994da16651194500b607a3007186c29779e1f961
# FORENSIS_SIGMAHQ_RULES_SUBDIR=rules
# FORENSIS_SIGMAHQ_REFRESH=0
# 可选检测调优
# FORENSIS_CORRELATION_WINDOW_MINUTES=60
# FORENSIS_TI_CACHE_TTL=43200
# FORENSIS_TI_CACHE_MAX_ENTRIES=50000
# FORENSIS_TI_MAX_HITS=500
# FORENSIS_OTX_TIMEOUT_SECONDS=4
# FORENSIS_OTX_MAX_LOOKUPS=30
# FORENSIS_OTX_MAX_SECONDS=12
# 异步 post-rule 关联以加快首次结果渲染
# FORENSIS_ASYNC_SIGMA_POSTPROCESS=1
# 可选 Sigma 关联性能防护机制
# FORENSIS_SIGMA_MAX_EVENTS=900
# FORENSIS_SIGMA_MAX_EVENTS_NETWORK=250
# FORENSIS_SIGMA_MAX_EVENTS_LOGS=900
# FORENSIS_SIGMA_MAX_EVENTS_MEMORY=700
# FORENSIS_SIGMA_MAX_MATCHES=1500
# FORENSIS_NETWORK_EVENTS_STORE_LIMIT=900
# FORENSIS_NETWORK_ANOMALIES_STORE_LIMIT=500
# FORENSIS_PCAP_MAX_UPLOAD_BYTES=314572800
# FORENSIS_PCAP_MAX_PACKETS=350000
# FORENSIS_PCAP_MAX_TRACKED_FLOWS=250000
# 可选 DB backend(示例 PostgreSQL)
# FORENSIS_DB_URI=postgresql+psycopg://forensis:forensis_change_me@postgres:5432/forensis
# 可选 OpenSearch sink/search
# FORENSIS_OPENSEARCH_URL=http://opensearch:9200
# FORENSIS_OPENSEARCH_INDEX=forensis-events
# FORENSIS_OPENSEARCH_USERNAME=
# FORENSIS_OPENSEARCH_PASSWORD=
# FORENSIS_OPENSEARCH_VERIFY_TLS=false
# 可选 ClickHouse sink/analytics
# FORENSIS_CLICKHOUSE_URL=http://clickhouse:8123
# FORENSIS_CLICKHOUSE_DB=forensis
# FORENSIS_CLICKHOUSE_TABLE=events
# FORENSIS_CLICKHOUSE_USERNAME=
# FORENSIS_CLICKHOUSE_PASSWORD=
# 可选 PostgreSQL 的 SQLAlchemy pool 调优
# FORENSIS_DB_POOL_SIZE=20
# FORENSIS_DB_POOL_MAX_OVERFLOW=40
# FORENSIS_DB_POOL_TIMEOUT=30
# FORENSIS_DB_POOL_RECYCLE=1800
# 可选显示时区(默认:Asia/Jakarta / GMT+7)
# FORENSIS_DISPLAY_TZ=Asia/Jakarta
```
3. 构建并运行:
```
docker compose up -d --build
```
4. 打开:
- `http://localhost:5000`
默认凭据(如果未更改):
- 用户名:`admin`
- 密码:`forensis123`
### 本地运行
1. 创建虚拟环境并安装依赖:
```
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt
```
2. 启动应用:
```
python app.py
```
3. 打开:
- `http://127.0.0.1:5000`
## 主要路由
- `/`(重定向到 `/login`)
- `/login`
- `/dashboard`
- `/log-analyzer`
- `/network-analyzer`
- `/memory-triage`
- `/helper`
- `/history`
- `/users`
其他 API:
- `/api/search/events`
- `/api/analytics/overview`
## 生产环境 Profile(可选)
启用可选的面向生产环境的技术栈组件:
```
docker compose --profile dfir-prod up -d --build
```
此 profile 启用:
- `minio`(用于 artifact 扩展的对象存储)
- `rabbitmq`(备选队列后端选项)
- 专用队列 worker:`worker_logs`、`worker_network`、`worker_memory`、`worker_rules`
- `opensearch` + `opensearch_dashboards`
`postgres` 在默认的 compose 技术栈中运行。
启用 ClickHouse 分析 profile:
```
docker compose --profile dfir-analytics up -d --build
```
## 从 SQLite 切换到 PostgreSQL
1. 启动 PostgreSQL 目标并将 `FORENSIS_DB_URI` 设置为 PostgreSQL。
2. 启动一次 Forensis 以便创建 schema/表。
3. 运行迁移脚本:
```
python scripts/migrate_sqlite_to_postgres.py \
--sqlite-path instance/forensis.db \
--postgres-uri postgresql+psycopg://forensis:forensis_change_me@localhost:5432/forensis
```
迁移脚本会截断目标表,复制行,并重新对齐 PostgreSQL 的 ID 序列,以防止插入重复的主键。
Alembic 升级/漂移检查:
```
alembic upgrade head
python scripts/check_migration_drift.py
```
## 作业 Pipeline(事件驱动)
对于每个上传的 artifact,Forensis 会创建:
1. `Case`(如果同一分析师/当天没有活跃的 case,则自动打开 case)
2. `Artifact`(哈希 + 元数据)
3. `AnalysisJob`(被跟踪的状态机)
执行流程:
1. 上传 artifact
2. 创建排队的作业
3. Worker 运行解析 + 富化
4. 持久化标准化结果
5. 异步 Sigma 关联(可配置)
6. 完成 findings/rule matches/timeline 并更新作业状态
作业状态机:
- `queued`
- `running`
- `partial`(核心结果已就绪,后规则关联仍在运行)
- `succeeded`
- `failed`
作业阶段示例:
- `artifact_received`
- `parse`
- `enrich`
- `rule_match`
- `post_rule_match`
- `complete`
## 规则 QA 回归
运行自动化的良性/恶意回归检查:
```
python scripts/rule_qa.py
```
机器可读的输出:
```
python scripts/rule_qa.py --json
```
预期文件:
- `qa_datasets/regression_expectations.json`
## 基于队列深度的 Worker 自动缩放 (KEDA)
用于分离队列 worker 和自动缩放的 Kubernetes 清单:
- `deploy/k8s/workers-keda.yaml`
- `deploy/k8s/README.md`
## 项目结构
```
Forensis/
├── app.py
├── forensis/
│ ├── models.py
│ ├── analyzers/
│ │ ├── log_analyzer.py
│ │ ├── network_analyzer.py
│ │ ├── playbook_engine.py
│ │ ├── sigma_engine.py
│ │ ├── yara_engine.py
│ │ ├── threat_intel.py
│ │ ├── entity_profile.py
│ │ ├── correlation_engine.py
│ │ └── detection_pipeline.py
│ ├── services/
│ │ ├── event_search_service.py
│ │ ├── analytics_service.py
│ │ ├── job_service.py
│ │ └── rule_service.py
│ └── integrations/
│ └── elk_loki.py
├── migrations/
│ └── versions/
├── deploy/
│ ├── clickhouse/
│ └── k8s/
├── .github/workflows/ci.yml
├── templates/
├── static/
├── sigma_rules/
├── yara_rules/
├── threat_intel/
├── config/
├── qa_datasets/
├── scripts/
│ ├── check_migration_drift.py
│ ├── migrate_sqlite_to_postgres.py
│ └── rule_qa.py
├── instance/
├── uploads/
├── Dockerfile
├── alembic.ini
├── docker-compose.yml
└── requirements.txt
```
## 安全说明
- 立即更改默认管理员凭据。
- 使用强健的 `FORENSIS_SECRET_KEY`。
- 为特权用户启用 MFA。
- 将 TI 馈源、基线允许列表和自定义 YARA 规则置于版本控制之下。
- 在生产使用前,审查上传的 artifact 处理和存储策略。
## 许可证
请参阅 [LICENSE](LICENSE)。
标签:搜索引擎查询, 测试用例, 请求拦截, 逆向工具