sierengowskisierengowski-cpu/Meli
GitHub: sierengowskisierengowski-cpu/Meli
Meli 是一个集实时蜜罐监控、主动欺骗和威胁情报于一体的桌面与Web应用。
Stars: 0 | Forks: 0
# Meli — 蜜罐指挥中心
**v2.9.0** — Meli 现针对相同的 Python 数据采集管线**提供了两个完整的前端**:
- 🐝 **Web 指挥中心**(v2.9 新增) — 位于 `webui/` 的 React + Vite 单页应用,由 `meli-web`(FastAPI + uvicorn)在 `http://127.0.0.1:17655/` 提供服务。包含 17 个仪表盘视图:实时 KPI 磁贴、严重性分布、24小时攻击强度图、顶级攻击者排行榜、蜜罐容量仪表、蜜罐集群状态、攻击者/事件/凭证/命令/负载/会话/服务/警报(带一键确认)/报告/僵尸网络/IP 信誉查询/设置向导。
- 🖥️ **GTK4 桌面应用**(原生) — 完整的原生 Linux 体验,带有 Cairo 双耳细颈瓶、Labyrinth 诱捕控制及 16 个窗口视图。
两个前端都读取由 Meli 数据采集守护进程写入的同一个 SQLite 数据库,因此 Cowrie / Dionaea / Conpot / Heralding / Endlessh / Labyrinth 捕获的事件会自动在所有界面中显示。
**一键启动**(无需安装到 `/opt`):
```
./run.sh
```
此命令会引导创建一个 `.venv`,安装 Python 依赖,在 `webui/` 中运行 `npm install && npm run build`,然后在端口 `17655` 上启动 `meli-web` 并打开浏览器。添加 `--native` 可使用无边框的 Electron 窗口,或使用 `--no-open` 运行无界面的服务器。
要进行完整的系统安装(systemd 用户服务、桌面快捷方式、`/opt/meli`),请改用 `./install.sh` — 阶段 4b 构建 React webui,阶段 4c(`--with-electron`)安装 Electron 外壳。
**v2.2.2** — 一款原生 **GTK4 + libadwaita** Linux 桌面应用程序,用于实时蜜罐监控、威胁情报与主动诱骗。专为安全研究人员、SOC 分析师、家庭实验室运维人员以及任何运行 Cowrie、Heralding、Dionaea 或自定义蜜罐基础设施的用户构建。
**作者:** Joseph Sierengowski
**许可证:** MIT
**平台:** Linux(COSMIC、GNOME 及其他 GTK4 桌面环境)
**仓库:** [github.com/sierengowskisierengowski-cpu/Meli](https://github.com/sierengowskisierengowski-cpu/Meli)
## Meli 与众不同之处
大多数蜜罐仪表盘是构建在数据库之上的 Web 应用程序。Meli 则不同。它是一个真正的原生桌面应用程序:数据采集守护进程和 GUI 是独立的进程,它们仅通过 SQLite 和 MQTT 进行通信。关闭窗口后,守护进程仍在继续运行,分类事件、触发警报并写入富化结果。GUI 只是一个阅读器,而非必需组件。
第二个不同之处在于,Meli 自带诱骗引擎 — **Labyrinth** — 而不仅仅消费来自第三方蜜罐的日志。Labyrinth 是一个从头构建的双协议(SSH 和 Telnet)诱捕陷阱,与现有的数据采集管线并行运行。一个陷入 Labyrinth 的会话会自动填充实时日志、命令视图、会话视图以及仪表盘上的双耳细颈瓶,因为每一次按键都通过相同的采集管线以标准的 Cowrie 格式事件发出,其他所有数据也是如此。
标志性的视觉元素是 **双耳细颈瓶**:一个位于仪表盘中央的 Cairo 绘制的希腊花瓶,随着攻击累积而填充琥珀色蜂蜜,新事件到达时会脉冲发光,当容器满溢时会滴落。它既是装饰性的,也具有实用目的 — 一眼就能判断蜜罐是安静、活跃还是正遭受围攻。
## 功能特性
### 16 个仪表盘视图
| 视图 | 描述 |
|------|------|
| 仪表盘 | 实时统计卡片、严重性分布、顶级攻击者、近期事件、双耳细颈瓶 |
| 实时日志 | 带有暂停、筛选和导出功能的实时 MQTT 事件流 |
| 地理位置地图 | 显示攻击密度的世界地图(通过 WebKitGTK 使用 Leaflet.js)+ 国家表格 |
| 攻击者 | 可排序的 IP 表格,带有完整的富化配置文件抽屉 |
| 凭证 | 跨所有蜜罐捕获的用户名/密码对,支持字典导出 |
| 命令 | 认证后命令分析,带意图分类 |
| 负载 | 捕获的恶意软件文件,支持 VirusTotal 哈希查询 |
| 服务统计 | 按蜜罐细分,附带健康状态 |
| 时间线 | 攻击量柱状图,可配置时间段(1小时 / 24小时 / 7天 / 30天 / 90天) |
| IP 信誉 | 单 IP 跨所有富化服务查询 |
| 僵尸网络检测 | 协调攻击集群分析(共享凭证/命令/哈希) |
| 警报规则 | CRUD 规则编辑器 + 完整的警报历史记录,带一键确认功能 |
| 报告 | 生成和浏览 PDF / Markdown / JSON / CSV 报告 |
| 设置 | 所有子系统的完整配置面板 |
| Labyrinth 会话 | 实时诱捕状态、粘性 IP 名册和最近完成的会话表格 |
| Labyrinth 回放 | 带有可变速度控制(¼× / 1× / 2× / 8× / 即时)的会话回放功能 |
### Labyrinth — 主动诱骗陷阱
Labyrinth 是 Meli 内置的 SSH 和 Telnet 蜜罐。它接受每一个传入的登录(以收集凭证),将攻击者放入一个程序化生成的虚假 shell 中,并且绝不让他们接触到真实环境。
**协议支持:**
- **SSH** — 基于 paramiko 的有界线程池;逼真的 MOTD、`last login` 横幅、PTY 协商
- **Telnet** — 基于 asyncio;每个连接一个协程,带有 RFC 854 协商(WILL ECHO / SUPPRESS-GO-AHEAD)
- 两种协议共享一个单一的鸭子类型会话接口,因此所有命令处理程序在两种协议上的工作方式完全相同
**虚假环境:**
- 每个会话种子生成的程序化文件系统 — 两个攻击者比对笔记会看到略微不同的目录树
- 74+ 个虚假 shell 命令处理程序:`ls`, `cat`, `wget`, `curl`, `chmod`, `busybox`, `ps`, `id`, `uname`, `netstat`, `ip`, `crontab`, `systemctl` 等
- 逼真的 Debian/Ubuntu 文件树,包括 `/etc/passwd`, `/proc/cpuinfo`, `/root/.bash_history`, `/root/.aws/` 以及其他高价值诱饵路径
**子系统:**
| 子系统 | 描述 |
|--------|------|
| **botdetect** | 基于时序和命令信号的加权机器人/人类评分(0–100);权重根据真实的 Mirai/Gafgyt 样本调整;每个会话可审计的完整信号列表 |
| **金丝雀令牌** | 注入虚假文件系统的诱饵文件;任何对金丝雀路径的 `cat` 操作都会立即触发一条 CRITICAL 级别的警报,附带会话、IP 和路径上下文 |
| **绊线** | 正则表达式规则,当观察到恶意命令(下载器、持久化机制、权限提升)时,提高机器人评分并提升事件严重性 |
| **会话回放** | 每个会话都以追加写入的 JSONL 文件记录;Labyrinth 回放视图可以以可变速度(带完整传输控制)播放 |
| **回放导出** | 可将任何会话导出为兼容 asciinema 的 JSON 文件,供离线审阅或共享 |
| **Polaroid** | 自动为高价值会话(机器人评分 ≥ 阈值或任何金丝雀触发)向配置的通知渠道发布一行攻击者摘要 |
| **Cohort** | 通过命令序列指纹对会话进行聚类,以分组僵尸网络变种并识别协调攻击活动 |
| **粘性** | 跨重启的 IP 跟踪 — 粘性名册持久保存访问次数、最后见到的时间戳和累积的机器人评分,因此返回的 IP 会被立即识别 |
| **阻止列表** | 以 fail2ban、iptables、nftables、ufw 或纯 CIDR 格式导出已确认的恶意 IP,用于立即执行防火墙规则 |
| **嘲讽引擎** | 运营者可配置的揭示强度:`off`(静默诱捕)、`subtle`(会话记录 30 秒后的提示)或 `full`(退出时明确揭示为诱捕陷阱并附带会话摘要) |
| **每日摘要** | 24 小时 Markdown(+ 可选 PDF)摘要:最活跃的 IP、所有金丝雀触发事件、新的聚类、绊线命中计数;向通知渠道发送简报 |
所有 Labyrinth 事件都通过 Meli 的标准数据采集管线,因此实时日志、命令视图、攻击者表格以及仪表盘上的双耳细颈瓶都能反映 Labyrinth 的活动,无需任何特殊处理。
### Atrium — 信息亭 / 墙挂显示器模式
Atrium 是一种可选的全屏可视化模式,专为墙挂显示器设计。它采用惰性导入,因此对正常的 Meli 操作零开销 — 如果你不调用它,它就不会被加载。
**三种启动路径:**
1. 主窗口的侧边栏按钮
2. F12 键盘快捷键
3. `meli --kiosk` 命令行标志
**显示布局(目标分辨率 1920×1080,可缩放至任意尺寸):**
- **雷达扫描** — 动画扫描效果,带有代表活动会话的光点
- **双耳细颈瓶** — 与仪表盘相同的 Cairo 蜜罐部件,以 3 倍比例渲染
- **终端流** — 滚动显示的实时会话活动日志(连接、认证尝试、命令、金丝雀触发)
- **24 小时热力图** — 底部栏显示以 15 分钟为间隔的攻击强度
- **时钟栏** — UTC 时间、实时/空闲状态、会话计数
极光渐变背景、会话开启/关闭时的柔和音频提示以及红色金丝雀触发闪烁覆盖层,均在首次启动时由标准库 wave/math 合成生成(仓库中无二进制音频资源)。鼠标光标在 3 秒后自动隐藏。
无论 Atrium 是否运行,Meli 的正常操作(数据采集守护进程、所有 16 个视图、警报路由)都完全不受影响。
### 蜜罐解析器(7个)
| 解析器 | 处理对象 |
|--------|----------|
| **Cowrie** | SSH/Telnet — 所有事件 ID:`cowrie.login.failed`、`cowrie.login.success`、`cowrie.command.input`、`cowrie.session.file_download` 等 |
| **Heralding** | 多服务凭证捕获(SSH、FTP、RDP、VNC、POP3、IMAP、SMTP) |
| **Dionaea** | 恶意软件捕获(SMB、HTTP、MySQL、FTP、SIP、TFTP) |
| **HTTP Honeypot** | Snare/Tanner + 自定义 nginx JSON 日志格式 |
| **Glastopf** | Web 应用蜜罐 |
| **Mailoney** | SMTP 探测蜜罐 |
| **通用 JSON** | 标准 Meli 格式 + 启发式字段映射回退 |
### 富化服务(6个)
| 服务 | 类型 | 说明 |
|------|------|------|
| **GeoLite2** (MaxMind) | 离线 | 城市 + ASN;无单次查询成本;需要免费的 MaxMind 账户下载数据库 |
| **AbuseIPDB** | API 密钥 | 滥用置信度评分(0–100%)、报告数量、最后报告日期 |
| **GreyNoise** | API 密钥 | 针对大规模扫描器 IP 的噪声/恶意/良性分类 |
| **VirusTotal** | API 密钥 | IP 信誉 + 文件哈希恶意软件扫描 |
| **Shodan** | API 密钥 | 开放端口、服务横幅、CVE 匹配 |
| **IPInfo** | API 密钥 | ASN、组织、VPN/代理/Tor 检测 |
所有结果在 SQLite 中缓存 24 小时(可配置 TTL)。
### 警报系统
**6 个通知渠道:** 桌面(libnotify)、Discord(Webhook)、Slack(Webhook)、Telegram(机器人)、SMTP 邮件、HTTP Webhook
- 每条规则可配置冷却时间、活跃时段和严重性阈值
- 通过 PipeWire/ALSA(`paplay` / `aplay`)按严重性级别播放警报声音
- 完整的警报历史记录,带一键确认功能
### 安全性
- **主密码** — 使用 Argon2id KDF(64 MB 内存,3 次迭代)进行密钥派生;使用 bcrypt 存储验证信息
- **TOTP 双因素认证** — 兼容 Google Authenticator、Authy 及任何 TOTP 应用
- **渐进式锁定** — 3 次失败尝试后锁定 60 秒,6 次失败后锁定 5 分钟;超过硬限制需重启
- **Ctrl+L** — 即时锁定;可配置空闲自动锁定超时
- **静态 Fernet 加密** — 对 API 密钥和敏感配置字段使用 AES-128-CBC 加密
- 数据库和配置文件创建时权限设为 `chmod 600`;配置目录权限设为 `chmod 700`
### 报告
- 时间段:每日、每周、每月、自定义日期范围
- 格式:**PDF**(ReportLab)、**Markdown**、**JSON**、**CSV**
- Jinja2 报告模板(可自定义)
- 定时自动生成
### 数据采集方法
- **MQTT** — 订阅 `meli/events/ingest`(端口 1883 上的 Mosquitto 代理)
- **HTTP POST** — `POST http://127.0.0.1:17654/api/v1/events/ingest`,携带 Bearer 令牌
计划但尚未实现的数据采集方法,请参见[路线图](#roadmap)。
## 架构
```
┌──────────────────────────────────────────────────────────────────┐
│ External Honeypots (Cowrie / Heralding / Dionaea / …) │
│ → publish JSON events via MQTT or HTTP POST │
└──────────────────────────┬───────────────────────────────────────┘
│
┌──────────────────────────▼───────────────────────────────────────┐
│ Labyrinth Tarpit (meli/labyrinth/) │
│ SSH (paramiko / thread pool) + Telnet (asyncio) │
│ → emits Cowrie-formatted events → same ingest pipeline below │
└──────────────────────────┬───────────────────────────────────────┘
│
┌────────────▼────────────┐
│ meli-ingest │ systemd user service
│ daemon.py │ MQTT consumer + HTTP server
└────────────┬────────────┘
│
┌─────────────────▼─────────────────────┐
│ processor.py │
│ parse → classify → store → enrich │
└──────────┬────────────────┬────────────┘
│ │
┌──────────▼──────┐ ┌──────▼──────────┐
│ SQLite DB │ │ Alert Engine │
│ (SQLAlchemy) │ │ + 6 Notifiers │
└──────────┬──────┘ └──────────────────┘
│
┌──────────▼──────┐
│ GTK4 UI │ Main thread only
│ (16 views) │ Reads DB, subscribes MQTT
│ [opt: Atrium] │ Fullscreen kiosk on demand
└─────────────────┘
```
数据采集守护进程和 GUI 是独立的进程。GUI 订阅 `meli/events/processed` 以获取实时日志,并读取数据库以获取所有其他视图。捕获和分类在 GUI 窗口关闭后继续进行。
## 安装
完整说明请参见 [docs/INSTALL.md](docs/INSTALL.md)。
**快速开始(Arch Linux):**
```
git clone https://github.com/sierengowskisierengowski-cpu/Meli
cd Meli
sudo ./install.sh --phase 1 # system packages: GTK4, PyGObject, Mosquitto
./install.sh # Python venv, app files, desktop integration, services
meli # launch
```
**快速开始(Ubuntu 24.04+):**
```
git clone https://github.com/sierengowskisierengowski-cpu/Meli
cd Meli
sudo ./install.sh --phase 1
./install.sh
meli
```
安装程序运行 9 个阶段:系统软件包 → Python venv → Python 依赖 → 应用文件 → 桌面集成 → systemd 服务 → Mosquitto 配置 → 用户数据目录 → 数据库初始化。
## 连接蜜罐
### 通过 MQTT 连接 Cowrie
在 `etc/cowrie.cfg` 中:
```
[output_mqtt]
enabled = true
host = 127.0.0.1
port = 1883
topic = meli/events/ingest
qos = 1
```
### 通过 HTTP POST 连接任意蜜罐
```
curl -X POST http://127.0.0.1:17654/api/v1/events/ingest \
-H "Authorization: Bearer YOUR_INGEST_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"network": {"source_ip": "1.2.3.4", "destination_port": 22},
"honeypot": {"type": "cowrie"},
"action": {"type": "login_attempt",
"details": {"username": "root", "password": "toor"}},
"timestamp": "2024-01-15T12:00:00Z"
}'
```
数据采集令牌会在您添加的每个蜜罐源中自动创建(设置 → 蜜罐源)。
解析器特定的配置,请参见 [docs/HONEYPOT-INTEGRATION.md](docs/HONEYPOT-INTEGRATION.md)。
## 开发
```
git clone https://github.com/sierengowskisierengowski-cpu/Meli
cd Meli
# 系统依赖(GTK4, PyGObject, Mosquitto)
sudo ./install.sh --phase 1
# Python 开发环境
python3 -m venv --system-site-packages .venv
source .venv/bin/activate
pip install -e .
# 启动 GUI
python -m meli
# 仅启动数据摄取守护进程(无 GUI)
python -m meli --daemon ingest
# 启动 Atrium kiosk 模式
python -m meli --kiosk
# 运行测试套件
python -m pytest tests/ -v
```
### 项目结构
```
Meli/
├── meli/ # Python package
│ ├── __main__.py # CLI entry point (meli / meli --daemon / meli --kiosk)
│ ├── app.py # Adw.Application subclass
│ ├── auth.py # Master password, TOTP, lockout
│ ├── config.py # YAML config singleton
│ ├── event_bus.py # In-process publish/subscribe
│ ├── alerts/ # Alert engine + 6 notifiers
│ │ └── notifiers/ # desktop, discord, email_smtp, slack, telegram, webhook
│ ├── classification/ # Severity rules engine + default_rules.yaml
│ ├── database/ # SQLAlchemy models, migrations, backup
│ ├── enrichment/ # abuseipdb, geolocation, greynoise, ipinfo, shodan, virustotal
│ ├── ingest/ # MQTT + HTTP daemon + parsers/
│ │ └── parsers/ # cowrie, dionaea, generic_json, glastopf, heralding, http_honeypot, mailoney
│ ├── labyrinth/ # Native SSH+Telnet tarpit
│ │ ├── daemon.py # LabyrinthDaemon — top-level orchestrator
│ │ ├── ssh_server.py # paramiko-based SSH listener + SSHSession
│ │ ├── shell.py # asyncio Telnet LabyrinthSession
│ │ ├── filesystem.py # Per-session fake filesystem (FakeFS)
│ │ ├── commands.py # 74 fake shell command handlers
│ │ ├── taunts.py # Taunt engine (off / subtle / full)
│ │ ├── host_key.py # RSA host key persistence
│ │ ├── sink.py # Ingest pipeline bridge
│ │ ├── botdetect.py # Bot-vs-human scoring
│ │ ├── canary.py # Bait-file canary tokens
│ │ ├── tripwire.py # Regex-based severity escalation
│ │ ├── replay.py # Per-session JSONL replay recorder
│ │ ├── replay_export.py # Asciinema-format export
│ │ ├── polaroid.py # Auto-posted attacker summaries
│ │ ├── cohort.py # Command-sequence fingerprint clustering
│ │ ├── sticky.py # Cross-restart IP tracking
│ │ ├── blocklist.py # Firewall-rule export
│ │ └── digest.py # Daily Markdown + PDF digest service
│ ├── reports/ # PDF/MD/JSON/CSV generation
│ └── ui/ # GTK4 application UI
│ ├── app.py # Window, sidebar, stack navigation
│ ├── atrium.py # Fullscreen kiosk display (lazily imported)
│ ├── dialogs/ # Change-password and setup wizard dialogs
│ ├── widgets.py # HoneyPotWidget (Cairo amphora) and shared widgets
│ └── views/ # 16 views (see table above)
├── tests/ # pytest suite
├── docs/ # Documentation
├── assets/
│ ├── icons/meli.svg # Application icon
│ └── sounds/ # Alert sound files
├── install.sh # 9-phase installer (Arch / Ubuntu / Fedora)
├── uninstall.sh # Uninstaller (preserves user data)
├── pyproject.toml # Build configuration
├── requirements.txt # Python dependencies
├── meli.desktop # XDG desktop entry
├── meli-ingest.service # systemd user service
├── meli-labyrinth-digest.service # systemd oneshot for daily digest
├── meli-labyrinth-digest.timer # systemd timer (daily at 07:00)
└── PKGBUILD # Arch Linux package
```
## 已知限制
- **设置 → 配置 2FA 按钮** — TOTP 配置对话框尚未实现。可以通过首次运行的设置向导配置 TOTP。
- **设置 → 添加蜜罐按钮** — 内联的添加蜜罐对话框尚未实现。可以通过首次运行的设置向导添加蜜罐源。
- **地理位置地图** — Leaflet.js 标记层部分实现;地图已渲染,但不会放置按国家的攻击标记。
- **日志文件监听** — 基于 inotify 的直接日志解析尚未实现。请参见[路线图](#roadmap)。
## 路线图
计划但尚未实现的功能:
- 日志文件监听器(基于 inotify,无需 MQTT/HTTP)
- 网络 PCAP 分析模式
- 额外的解析器:T-Pot、HoneyTrap、OpenCanary
- UI 中的 CIDR 和地理围栏阻止列表
- YubiKey 硬件双因素认证
- PostgreSQL 后端选项
- 报告调度 UI 和邮件发送
- STIX 2.1 / TAXII 2.1 导出
## 许可证
MIT 许可证 — © Joseph Sierengowski
完整文本请参见 [LICENSE](LICENSE)。
标签:AV绕过, Conpot, Dionaea, Electron, Endlessh, FastAPI, GTK4, Heralding, Labyrinth, libadwaita, Linux桌面应用, Python, React, Shellcode执行, SOC分析, SQLite, Syscalls, Vite, Windows安全, 仪表盘, 告警管理, 多前端支持, 威胁情报, 安装脚本, 家庭实验室, 开发者工具, 攻击分析, 无后门, 系统服务, 网络安全, 蜜罐监控, 蜜罐管理, 计算机取证, 逆向工具, 隐私保护