wahidhendrawan/Forensis

GitHub: wahidhendrawan/Forensis

一款集日志分析、网络流量检查、内存取证与多引擎威胁关联于一体的开源数字取证与事件响应平台。

Stars: 0 | Forks: 0

[![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/39/39faa54be350a1dab8afd3b2fb8c1c83e4d9cff84abfef2374d19a18053687c4.svg)](https://github.com/wahidhendrawan/Forensis/actions/workflows/ci.yml) # Forensis [![License: GPL-3.0](https://img.shields.io/badge/License-GPL-3.0-blue.svg)](https://github.com/wahidhendrawan/Forensis/blob/main/LICENSE) [![Release](https://img.shields.io/badge/release-v1.0.0-green.svg)](https://github.com/wahidhendrawan/Forensis/releases) [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/39/39faa54be350a1dab8afd3b2fb8c1c83e4d9cff84abfef2374d19a18053687c4.svg)](https://github.com/wahidhendrawan/Forensis/actions) [![Pages](https://img.shields.io/badge/docs-🌐-orange.svg)](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)。
标签:搜索引擎查询, 测试用例, 请求拦截, 逆向工具