拆解MultiScanner分布式架构:Celery、GlusterFS与Elasticsearch七大组件如何协同
【免费下载链接】multiscannerModular file scanning/analysis framework项目地址: https://gitcode.com/gh_mirrors/mu/multiscanner
🐛MultiScanner是一个开源的模块化文件扫描与恶意软件分析框架。它的分布式架构由七大组件构成:Web 前端、REST API、Celery 任务队列、PostgreSQL 任务跟踪、GlusterFS 分布式文件系统、Worker 工作节点和 Elasticsearch 报告存储。本文将带你完整拆解这套架构,看清每个组件的职责,以及它们如何协同完成一次大规模文件分析。
一、MultiScanner 能做什么?
先花一分钟了解这个项目,再进入架构细节。
MultiScanner 的核心价值是:一次提交样本,自动跑完一整套分析工具,并聚合输出结果。这些工具可以是自研的 Python 脚本、远程 Web API,或是运行在其他机器上的软件(杀毒扫描、沙箱引爆、元数据提取、YARA 签名匹配等),它们以"模块"的形式接入框架,通过配置文件即可启用或禁用。
如上图所示(源自 docs/overview.rst),恶意样本进入 MultiScanner 后,可以同时接受自动化工具、人工工具、元数据标注、数据分析四类处理,最终产出报告并支持外部查询。分析结果在工具之间、样本之间是互相关联的——这是它能做样本聚类、异常检测等高级分析的前提。
二、七大组件全景图:一张图看懂 MultiScanner 分布式架构
官方架构文档(docs/arch.rst)将整个系统划分为七大组件:
对照架构图,逐一拆解:
| # | 组件 | 技术选型 | 职责 |
|---|---|---|---|
| 1 | Web 前端 | Flask + Bootstrap + jQuery | 美观的交互界面,本质是 REST API 的"包装" |
| 2 | REST API | Flask + Apache | 对外服务的统一入口,屏蔽底层存储查询的复杂度 |
| 3 | 任务队列 | Celery + RabbitMQ | 分布式任务调度,把扫描任务分发给 Worker |
| 4 | 任务跟踪数据库 | PostgreSQL | 记录样本、扫描耗时、任务状态(pending / complete / failed) |
| 5 | 分布式文件系统 | GlusterFS | 存放原始样本,各组件通过 FUSE 挂载共享 |
| 6 | Worker 工作节点 | Celery 客户端 + MultiScanner | 真正执行扫描的"干活的机器" |
| 7 | 报告存储 | Elasticsearch | 存储扫描报告,支持跨全量报告的高性能全文检索 |
几个值得注意的设计决策:
- 为什么选 GlusterFS 而不是 HDFS?因为使用场景是"存储海量小样本",GlusterFS 在这种场景下性能更优。
- Worker 与 GlusterFS 节点同机部署(co-locate),以减少 Worker 拉取样本时的网络开销。
- Web 前端和 REST API 完全等价:界面上能看到的一切数据,都可以通过 REST API 拿到,方便自动化集成。
三、完整工作流:一个样本从提交到出报告的 7 步
架构图讲清了"有谁",工作流图讲清了"怎么走"。
一次完整的扫描流程如下:
- 用户提交样本:通过 Web UI 拖拽上传,或直接调用 REST API;
- 前端做三件事:
- 把文件存入 GlusterFS(步骤 2a);
- 把任务塞进 Celery 队列(步骤 2b);
- 在 PostgreSQL 中登记一条任务记录(步骤 2c);
- Worker 节点接力:
- 从 Celery 队列拉取任务(3a);
- 凭 SHA256 值从 GlusterFS 取回对应样本文件(3b);
- 调用 multiscanner/ms.py 中的
multiscan()执行分析(3c); - 生成 JSON 报告写入 Elasticsearch(3d);
- 回写 PostgreSQL,把任务状态更新为 "complete"(3e);
- 用户查看报告:Web UI 根据任务 ID 查出报告 ID,再从 Elasticsearch 拉取完整报告(4a/4b)。
💡 关键设计:文件走 GlusterFS、任务走 Celery、报告走 Elasticsearch,三者解耦。每个通道都独立可扩展,这正是分布式系统的核心思想。
四、Celery 任务队列:Worker 节点如何高效消费任务
Celery 的 Worker 实现在 multiscanner/distributed/celery_worker.py。这里有两个新手容易忽略的亮点:
4.1 批量扫描提升吞吐
Worker 不会"来一个扫一个",而是攒够 100 个样本或等待 60 秒(先到为准)再开扫(两个阈值均可配置)。批量处理显著提升了 Worker 在规模化场景下的性能。类似的批量逻辑也存在于独立分布式 Worker multiscanner/distributed/distributed_worker.py 的batch_size/wait_seconds参数中。
4.2 失败自动回写状态
Worker 自定义了MultiScannerTask基类并注册了on_failure回调:一旦扫描失败,自动把任务状态更新为 "Failed" 并记录到任务跟踪数据库,用户在前端即可看到失败原因,无需人工排查。
此外,Celery 的定时任务还承担了运维职责:每天凌晨 2 点运行 ssdeep 相似度对比分析(见 multiscanner/analytics/ssdeep_analytics.py),凌晨 3 点滚动清理旧的 metricbeat 索引。
五、Elasticsearch 报告存储:架构的"真正的力量所在"
官方文档原话:"This is where the true power of this system lies."(这正是本系统真正的力量所在。)
ES 存储模块位于 multiscanner/storage/elasticsearch_storage.py,默认索引为multiscanner_reports。它带来的能力是:
- 全量报告的高性能全文检索——在任意字段(哈希、签名、模块输出)中搜索;
- 样本间快速跳转(pivoting)——比如找出所有共享同一 Cuckoo 签名的样本;
- 数据分析(Analytics)——样本聚类、离群样本发现、工具盲区分析等,入口就在 Web 界面的 Analytics 页面(实现见 multiscanner/analytics/)。
配合 multiscanner/storage/ 下的统一存储抽象层(storage.py定义了 Storage 基类),还可以替换为 MongoDB、SQL 或纯文件存储,灵活适配不同部署环境。
六、上手体验:用 Docker 快速跑通这套架构
想在本地体验七大组件协同?官方提供了 Docker Compose 一键方案(配置见 docker-compose.yml 与 docker_utils/Dockerfile):
$ git clone https://gitcode.com/gh_mirrors/mu/multiscanner $ cd multiscanner $ docker-compose up等待各服务就绪后,访问http://localhost:8000即可看到文件提交页面。拖入样本、点击 "Scan it!",随后你就能在分析页面看到各模块的聚合报告。🎉
注意:Docker 方式适合体验,生产部署请参考安装文档 docs/install.rst。
七、架构小结:MultiScanner 给分布式系统设计带来的启示
- 职责单一:队列管调度、数据库管状态、文件系管样本、ES 管报告,任何一个组件都可以独立扩容;
- 哈希寻址:样本以 SHA256 命名存放在 GlusterFS,天然去重,Worker 凭哈希取文件,避免重复传输;
- 批量优先:攒批扫描 + 节点就近部署,用两个简单策略换取可观的性能提升;
- 接口等价:Web UI 的每个功能都有 REST API 对应,方便自动化与二次开发(详见 docs/use/rest-api.rst 与 Python API docs/use/python-api.rst)。
如果你想深入扩展自己的分析模块,推荐阅读 docs/custom/analysis-module.rst 和模块清单 multiscanner/modules/——从 Antivirus 到 Metadata、从 Detonation 到 MachineLearning,框架已内置了丰富的模块类别可供参考。🚀
【免费下载链接】multiscannerModular file scanning/analysis framework项目地址: https://gitcode.com/gh_mirrors/mu/multiscanner
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考