0zzy-tech/Ai-pot

GitHub: 0zzy-tech/Ai-pot

轻量级 AI 蜜罐,伪装 13 种 AI API 实时捕获并分类请求,赋能威胁监测与研究。

Stars: 0 | Forks: 0

# AI 蜜罐 一个轻量级蜜罐,同时伪装成 **13 种不同的 AI API 服务器**,通过实时仪表板捕获并分类每个请求,并展示全局攻击地图。 设计用于在 Raspberry Pi 或任何 Ubuntu 服务器上运行。提供多架构 Docker 镜像(`amd64` · `arm64` · `arm/v7`)。 ## 仪表板预览 ``` ┌─────────────────────────────────────────────────────────────────────┐ │ 🛡 AI HONEYPOT MONITOR ⬇ Threat Report ● LIVE │ ├──────────┬──────────┬──────────┬──────────┬──────────┬──────────────┤ │ Total │ Last 24h │ Critical │ High │ Medium │ Unique IPs │ │ 14,832 │ 1,204 │ 87 │ 342 │ 891 │ 2,341 │ ├──────────────────────────────┬──────────────────────────────────────┤ │ │ 🔍 Search ⬇ Export CSV [Clear] │ │ 🌍 World Map ├──────────────────────────────────────┤ │ (risk-coloured pins) │ Time IP* Risk Ctry │ │ │ 14:32:01 185.220.x.x C2 ANOMALY RU │ │ │ 14:31:58 103.21.x.x TOR GEORISK CN │ │ │ * click IP → session drawer │ │ │ * click row → modal j/k/Enter/b │ ├──────────┬───────────────────┴──────────────────────────────────────┤ │ Risk Pie │ Category Bar │ 24-Hour Timeline │ ├──────────┴──────────────────────┴───────────────────────────────────┤ │ 📈 7-Day Trend (stacked CRIT/HIGH/MED/LOW per day) │ │ 🕐 Hour-of-Day Heatmap (7×24 grid — when do attacks peak?) │ ├─────────────────────────────────────────────────────────────────────┤ │ Simulated Platforms (toggle to enable/disable · TRAP to tarpit) │ │ 🦙 Ollama [ON][—] 🤖 OpenAI [ON][TRAP] 🧠 Anthropic [OFF][—] │ ├─────────────────────────────────────────────────────────────────────┤ │ 🔍 Intelligence │ │ Webhook Alerts: ✓ Active · 1 URL · Format: slack · CRITICAL,HIGH │ │ Canary Token: sk-pot-a1b2c3d4e5f6g7h8 [Copy] │ │ Deception URL: http://host/track/abc123 [Copy] │ │ Feodo Feed: ✓ Active · 8,234 C2 IPs · refreshed 04:00 │ │ Detected IPs: 185.220.x.x · 103.21.x.x (click to open drawer) │ │ ThreatFox Feed: ✓ Active · 12,847 IOCs · refreshed 04:00 │ ├─────────────────────────────────────────────────────────────────────┤ │ 🔬 IP Session Drawer (click any IP) │ │ IP: 185.220.101.x Hostname: exit-node.tor-relay.example.com │ │ ISP: Frantech Solutions Country: Netherlands / Amsterdam │ │ AbuseIPDB: 98/100 GreyNoise: MALICIOUS — Tor exit node │ │ [DATACENTER] [TOR EXIT] [ThreatFox: Cobalt Strike] [C2] │ ├─────────────────────────────────────────────────────────────────────┤ │ 🏆 Top Attackers │ │ Top IPs: 1. 185.220.x.x (RU) 341 req CRITICAL 2. … │ │ Top Countries: 1. China 38.2% 2. Russia 21.1% 3. US 9.4% │ ├─────────────────────────────────────────────────────────────────────┤ │ 🚫 Blocked IPs [3] Auto-block: on │ │ 185.220.x.x auto: 3 criticals in 300s 2026-04-17 [Unblock] │ ├─────────────────────────────────────────────────────────────────────┤ │ ✅ Allowed IPs [1] Whitelisted — never logged or blocked │ │ 192.168.1.10 my home IP 2026-04-19 [Remove] │ ├─────────────────────────────────────────────────────────────────────┤ │ 🔎 Custom Detection Rules [2] Operator regex patterns │ │ "Crypto miner" xmrig|stratum\+ CRITICAL [ON] [Delete] │ │ Name / Pattern / Risk ▾ [Add Rule] │ ├─────────────────────────────────────────────────────────────────────┤ │ 🤖 ML Intelligence (collapsible) │ │ Model Status: ✓ Trained · 2,341 samples · last: 2026-04-19 14:00 │ │ Composite baseline: p10=0.08 · p50=0.21 · p90=0.54 │ │ Anomaly Detection: 12 anomalies in last 24h (Isolation Forest) │ │ Bot Detection: 8 high-confidence bots ≥80% (Random Forest) │ │ Attack Clusters: 3 active clusters (DBSCAN) │ │ Cluster 0: 12 IPs · CRITICAL Cluster 1: 7 IPs · HIGH │ │ 🌍 Geo Risk: CN 89% · RU 76% · IR 71% · KP 68% · BR 55% │ │ Top ASNs: AS4134 91% · AS1234 78% │ ├─────────────────────────────────────────────────────────────────────┤ │ ABOUT ▾ (collapsible — built by Ozzytech · Martyn Oswald) │ └─────────────────────────────────────────────────────────────────────┘ ● = high AbuseIPDB score · C2 = Feodo botnet · TF = ThreatFox IOC · 📝 = note · ANOMALY/BOT/GEORISK/ML:BAND = ML flags ``` ## 功能特性 - **13 个伪造 AI 平台 API** — 每个 API 在同一端口上都能给出逼真响应 - **流式响应** — 按词逐词令牌流式传输,速度接近真实 GPU(约 25 令牌/秒) - **风险分类** — CRITICAL / HIGH / MEDIUM / LOW,配备 40+ 种攻击模式 - **增强威胁检测** — AWS/GCP/Azure 凭证泄露、SSRF、模板注入、NoSQL 注入、GraphQL 内省、Base64 编码载荷、凭证填充 - **自定义检测规则** — 通过仪表板 UI 定义正则表达式模式;可分配到任意风险等级;热加载即时生效,无需重启 - **威胁情报源集成** — [Feodo Tracker](https://feodotracker.abuse.ch/) C2 阻断列表在启动时下载并每 24 小时刷新;匹配 IP 在实时流中显示 **C2** 徽章 - **欺骗令牌** — 在情报面板中显示一个可追踪的 URL;将其嵌入伪造的模型响应中;任何访问该 URL 的攻击者都会触发 CRITICAL `deception_callback` 告警 - **邮件告警** — SMTP(stdlib,无需额外依赖)可为 CRITICAL/HIGH 事件发送 HTML 告警;可通过 `SMTP_HOST`、`SMTP_TO` 等配置 - **定时报告** — 按日或按周自动发送 HTML 威胁报告(`REPORT_SCHEDULE=daily|weekly`) - **SIEM / syslog 转发** — 以 JSON 或 CEF 格式通过 UDP 免连接转发到任意日志聚合(`SYSLOG_HOST`、`SYSLOG_FORMAT=json|cef`) - **数据保留** — 每小时自动清除超过 `MAX_REQUEST_AGE_DAYS` 天的请求(0 = 永久保留) - **Fail2ban / iptables 导出** — 每次封禁/解封时将 IP 写入 `BLOCKLIST_FILE`(纯文本或 fail2ban 格式) - **IP 封禁** — 可从仪表板/模态框/抽屉手动封禁 IP,或自动封禁反复触发 CRITICAL 的 IP - **IP 白名单** — 将自有 IP 加入白名单,使其永不进入流或触发自动封禁 - **IP 标注/打标签** — 可为任意攻击 IP 添加自由格式备注;备注会显示在会话抽屉和实时流中(📝 提示) - **CSV 导出** — 一键下载全部(或按条件过滤)的请求为 CSV;支持 `?risk=`、`?category=`、`?ip=`、`?since=` 过滤 - **ISP 与数据中心检测** — 从 ip-api.com(免费层)提取 ISP 名称和数据中心/托管标志;显示在 IP 会话抽屉 - **反向 DNS** — 对每个公网 IP 执行 PTR 查询;缓存并显示在会话抽屉(例如 `exit-node.tor.example.com`) - **ThreatFox 情报源** — [abuse.ch](https://threatfox.abuse.ch/) 恶意软件 C2 IOC 喂入;匹配已知僵尸网络基础设施时显示恶意家族名称作为徽章 - **GreyNoise 集成** — 通过社区 API 将 IP 分类为互联网扫描噪声或定向攻击;`RIOT` 标志标识已知良性基础设施(Googlebot、Shodan 等);需要免费 `GREYNOISE_API_KEY` - **Top 攻击者排行榜** — 按请求数排名的 Top 10 IP 与 Top 10 国家,实时更新 - **键盘导航** — `j`/`k` 遍历流行,`Enter` 打开请求模态框,`b` 封禁选中 IP,`Escape` 关闭模态框 - **按服务启用/禁用** — 可在仪表板中启用或禁用任意平台;更改即时生效并持久化(重启后仍保留) - **Tarpit 模式** — 可为每个服务设置延迟(默认 30 秒),在响应前浪费攻击者时间 - **Canary 令牌** — 在 `/v1/models` 中嵌入可追踪的假 API 密钥;任何重用该密钥的请求都会立即标记为 CRITICAL - **Webhook 告警** — 在 CRITICAL/HIGH 事件发生时向 Slack、Discord 或通用 JSON 端点发送 HTTP POST - **AbuseIPDB 集成** — 为每个攻击 IP 提供信誉评分与 Tor 检测(可选) - **IP 地理位置** — 通过 ip-api.com 获取国家、城市和坐标(双层缓存) - **实时仪表板** — 带风险着色标记的世界地图、请求流、图表和时间线 - **攻击情报图表** — 7 天趋势图与小时热力图,展示攻击高峰时段 - **实时 WebSocket 推送** — 通过认证 WebSocket(`?token=sha256(ADMIN_PASSWORD)`)推送实时更新,无需轮询 - **请求正文查看器** — 点击任意流式行可查看完整请求头、格式化 JSON 正文,并一键复制为 cURL - **请求搜索** — 在流中按 IP、路径、正文和国家进行全文搜索 - **每 IP 会话视图** — 点击任意 IP 打开抽屉,展示其完整请求时间线 - **威胁报告** — 一键下载自包含 HTML 报告,包含 Top IP、路径、模式和地理分布 - **Prometheus 指标** — 可选的 `/metrics` 端点,便于与 Grafana / Alertmanager 集成 - **TinyML 端侧智能** — 5 个端侧模型(Isolation Forest、DBSCAN、2× Random Forest、GeoRisk)全程在进程内运行;无需云端、无 GPU;兼容 Raspberry Pi(约 120 MB 内存开销) - **多架构 Docker 镜像** — 支持 `linux/amd64`、`linux/arm64`、`linux/arm/v7` - **轻量级** — 单异步工作进程,仅使用 SQLite,内存占用小于 512 MB(Raspberry Pi 4) ## 模拟平台 | # | 平台 | 捕获端点 | |---|---|---| | 1 | **Ollama** | `/api/generate`、`/api/chat`、`/api/pull`、`/api/tags`,以及 8 个更多端点 | | 2 | **OpenAI 兼容** | `/v1/chat/completions`、`/v1/completions`、`/v1/embeddings`、`/v1/models` | | 3 | **Anthropic Claude** | `/v1/messages`(SSE 流式)、`/v1/complete`(遗留) | | 4 | **HuggingFace TGI** | `/generate`、`/generate_stream`、`/info`、`/metrics`、`/tokenize` | | 5 | **llama.cpp** | `/completion`、`/embedding`、`/slots`、`/infill`(FIM)、`/props` | | 6 | **Text Gen WebUI** | `/api/v1/generate`、`/api/v1/chat`、`/api/v1/model`、`/api/v1/token-count` | | 7 | **Cohere** | `/v1/chat`、`/v1/generate`、`/v1/embed`、`/v1/rerank`、`/v1/classify` | | 8 | **Mistral AI** | `/v1/fim/completions`、`/v1/agents`、`/v1/agents/completions` | | 9 | **Google Gemini** | `/v1beta/models/{model}:generateContent` 加上嵌入、流式与计数 Token | | 10 | **Stable Diffusion WebUI** | `/sdapi/v1/txt2img`、`/sdapi/v1/img2img`,完整选项/进度/模型套件 | | 11 | **ComfyUI** | `/prompt`、`/system_stats`、`/queue`、`/history`、`/object_info` | | 12 | **vLLM** | `/ping`、`/version`、`/v1/tokenize`、`/v1/detokenize` | |13 | **LM Studio** | `/api/v0/models`、`/api/v0/chat/completions`、`/api/v0/embeddings`、`/api/v0/system` | | + | **LocalAI 扩展** | `/v1/audio/transcriptions`、`/v1/images/generations`、`/tts`、`/v1/backends` | ## 快速开始 ### Docker(推荐) ``` # 拉取并运行 — 在暴露到互联网之前更改 ADMIN_PASSWORD docker run -d \ --name ai-honeypot \ -p 11434:11434 \ -v honeypot-data:/data \ -e ADMIN_PASSWORD=mysecretpassword \ ghcr.io/0zzy-tech/ai-pot:latest ``` ### Docker Compose ``` git clone https://github.com/0zzy-tech/Ai-pot cd Ai-pot # 设置强密码(在暴露到互联网之前必需) ADMIN_PASSWORD=mysecretpassword docker compose up -d # 查看日志 docker compose logs -f ``` 仪表板地址:`http://:11434/__admin` ### 裸机部署(Raspberry Pi / Ubuntu) ``` git clone https://github.com/0zzy-tech/Ai-pot cd Ai-pot sudo ./setup.sh # installs venv, systemd service, opens UFW port sudo systemctl start ai-honeypot ``` 仪表板地址:`http://:11434/__admin` 默认登录:`admin` / `changeme` ### 开发环境 ``` python3 -m venv venv && source venv/bin/activate pip install -r requirements.txt python main.py # 仪表板:http://localhost:11434/__admin ``` ## 配置 所有设置均可通过环境变量(适用于 Docker)或编辑 `config.py` 进行配置。 ### 核心配置 | 变量 | 默认值 | 描述 | |---|---|---| | `PORT` | `11434` | 监听端口 — 与真实 Ollama 保持一致以增强欺骗效果 | | `ADMIN_USERNAME` | `admin` | 仪表板登录用户名 | | `ADMIN_PASSWORD` | `changeme` | **部署前请务必修改** | | `ADMIN_PREFIX` | `/__admin` | 仪表板 URL 前缀 | | `DB_PATH` | `honeypot.db` | SQLite 路径(Docker 中为 `/data/honeypot.db`) | | `MAX_REQUESTS_STORED` | `100000` | SQLite 行数上限(旧记录自动清理) | | `MAX_REQUEST_AGE_DAYS` | `0` | 自动清理超过 N 天的请求(0 = 永久保留) | | `STREAM_WORD_DELAY_SECS` | `0.04` | 每词延迟,模拟真实流式传输(~25 令牌/秒) | ### 检测阈值 | 变量 | 默认值 | 描述 | |---|---|---| | `RAPID_REQUEST_THRESHOLD` | `20` | 60 秒内超过 20 次请求 → CRITICAL | | `REPEAT_IP_THRESHOLD` | `5` | 10 分钟内超过 5 次请求 → MEDIUM | | `LARGE_BODY_THRESHOLD` | `5000` | 请求体超过此阈值 → MEDIUM | ### 地理位置 | 变量 | 默认值 | 描述 | |---|---|---| | `GEO_CACHE_TTL_HOURS` | `24` | IP 地理位置缓存时长 | ### 阻断与 Tarpit 模式 | 变量 | 默认值 | 描述 | |---|---|---| | `TARPIT_DELAY_SECS` | `30.0` | 启用 Tarpit 时的响应延迟(秒) | | `AUTO_BLOCK_ENABLED` | `false` | 自动封禁反复触发 CRITICAL 的 IP | | `AUTO_BLOCK_THRESHOLD` | `3` | 在时间窗口内触发 CRITICAL 的次数阈值 | | `AUTO_BLOCK_WINDOW` | `300` | 自动封禁的时间窗口(秒) | | `BLOCKLIST_FILE` | (空) | 封禁 IP 写入的文件路径(支持 fail2ban 或纯文本格式) | | `BLOCKLIST_FORMAT` | `plain` | `plain`(每行一个 IP)或 `fail2ban` | ### 告警通知 | 变量 | 默认值 | 描述 | |---|---|---| | `WEBHOOK_URLS` | (空) | 以逗号分隔的 Webhook URL 列表,POST 告警 | | `WEBHOOK_RISK_LEVELS` | `CRITICAL,HIGH` | 触发 Webhook 的风险等级 | | `WEBHOOK_FORMAT` | `json` | 负载格式:`slack`、`discord` 或 `json` | | `WEBHOOK_TIMEOUT_SECS` | `5.0` | Webhook 请求超时时间 | | `SMTP_HOST` | (空) | SMTP 服务器主机名(启用邮件告警) | | `SMTP_PORT` | `587` | SMTP 端口 | | `SMTP_USER` | (空) | SMTP 用户名 | | `SMTP_PASS` | (空) | SMTP 密码 | | `SMTP_FROM` | `honeypot@localhost` | 发件人地址 | | `SMTP_TO` | (空) | 收件人地址 | | `SMTP_TLS` | `true` | 使用 STARTTLS(true)或 SSL(false) | | `EMAIL_RISK_LEVELS` | `CRITICAL` | 触发邮件告警的风险等级 | | `REPORT_SCHEDULE` | (空) | `daily` 或 `weekly` — 启用定时 HTML 威胁报告 | | `REPORT_EMAIL_TO` | (空) | 定时报告收件人(默认使用 `SMTP_TO`) | ### SIEM / syslog | 变量 | 默认值 | 描述 | |---|---|---| | `SYSLOG_HOST` | (空) | Syslog 接收主机名(启用 UDP 转发) | | `SYSLOG_PORT` | `514` | UDP 端口 | | `SYSLOG_FORMAT` | `json` | 负载格式:`json` 或 `cef`(通用事件格式) | ### 集成配置 | 变量 | 默认值 | 描述 | |---|---|---| | `ABUSEIPDB_API_KEY` | (空) | [AbuseIPDB](https://www.abuseipdb.com/register) API 密钥 — 启用信誉度检查 | | `ABUSEIPDB_MAX_AGE_DAYS` | `90` | AbuseIPDB 查询使用的最大记录年龄 | | `GREYNOISE_API_KEY` | (空) | [GreyNoise](https://www.greynoise.io/) 社区 API 密钥 — 分类 IP 为噪声/恶意/良性 | | `METRICS_ENABLED` | `false` | 设为 `true` 以暴露 `/metrics`(Prometheus 文本格式) | | `METRICS_TOKEN` | (空) | 可选的 Bearer 令牌保护 `/metrics` 端点 | | `DECEPTION_ENABLED` | `true` | 生成并显示欺骗令牌 URL | ## 风险分类 | 等级 | 颜色 | 触发条件 | |---|---|---| | **CRITICAL** | 🔴 | 监狱逃逸 / 提示注入、代码执行(`exec`、`os.system`、`subprocess`)、路径遍历、SQL 注入、每秒请求 >20、**Canary 令牌重用**、**欺骗回调**、**自定义 CRITICAL 规则匹配**、AWS/GCP/Azure 凭证泄露、SSRF 尝试、模板注入(`{{...}}`、`${...}`)、NoSQL 注入(`$where`、`$eval`)、Base64 编码载荷 | | **HIGH** | 🟠 | 模型管理(`/api/pull`、`/api/push`、`/api/delete`)、扫描器 User-Agent(nikto、sqlmap、nmap、censys…)、敏感路径段(admin、secret、.env…)、GraphQL 内省、凭证填充、**自定义 HIGH 规则匹配** | | **MEDIUM** | 🟡 | 嵌入与重排序、图像生成、音频转录、IP 重复请求(>5/10 分钟)、未知模型名、请求体过大(>5 KB)、**自定义 MEDIUM 规则匹配** | | **LOW** | 🟢 | 正常推理、聊天、模型列表、枚举、**自定义 LOW 规则匹配** | ## 请求分类 | 类别 | 含义 | |---|---| | `inference` | 文本生成 / 聊天补全 | | `openai_compat` | OpenAI 兼容 API 调用 | | `anthropic` | Claude 消息 API 调用 | | `model_management` | 模型拉取、推送、删除、复制 | | `embeddings` | 向量嵌入请求 | | `rerank` | Cohere 风格排序(RAG 流水线) | | `image_generation` | Stable Diffusion / ComfyUI / DALL-E | | `audio_transcription` | Whisper / TTS 请求 | | `code_completion` | FIM(中间填充)请求 | | `model_info` | 模型元数据 / show / 属性 | | `enumeration` | 列出模型、健康检查 | | `scanning` | 未知路径 — 主动扫描 | | `attack` | 请求体中匹配到 CRITICAL 模式 | ## 每服务控制 每个模拟平台在 **Simulated Platforms** 面板中提供两个独立控制: ### 启用/禁用切换 - **禁用服务返回 `404`** — 攻击者看到的内容为空,仿佛服务不存在 - **对禁用服务的请求仍会被记录** — 蜜罐情报得以保留 - **状态持久化** — 切换状态保存在 SQLite 中,重启后仍保留 - **多标签同步** — 在一个标签页切换会通过 WebSocket 实时更新其他打开的标签页 ### Tarpit 开关(TRAP) - 启用后,响应会在 `TARPIT_DELAY_SECS`(默认 30 秒)后发送 - 浪费攻击者的时间与资源,同时不暴露蜜罐 - 对任何服务生效,包括已禁用的服务(组合效果:404 延迟 30 秒后返回) - 状态持久化并与标签页同步 ## 情报功能 ### 自定义检测规则 在 **🔎 自定义检测规则** 面板中定义正则表达式: - 输入名称、正则模式和风险等级(CRITICAL / HIGH / MEDIUM / LOW) - 规则即时编译并热加载 — 无需重启 - 可单独启用或禁用规则而不会删除 - 匹配成功的规则会为请求添加 `custom:` 标签 - 模式会在完整请求正文与头部文本上进行测试 ### 威胁情报源集成 蜜罐在启动时下载 [Feodo Tracker](https://feodotracker.abuse.ch/) 推荐的 C2 IP 阻断列表,并每 24 小时刷新(无需 API 密钥): - 匹配已知 C2 基础设施的 IP 在实时流中显示红色 **C2** 徽章 - 面板显示流统计(IP 数量、最后刷新时间) - **检测到的 C2 IP 表** — 匹配到的攻击者 IP 直接列在情报面板,含命中次数、国家、最后在线时间与最高风险等级;点击任意 IP 可打开其会话抽屉 - 查询为同步内存操作,零额外开销 ### 欺骗令牌 启动时生成唯一的会话作用域追踪 URL,并在 **情报** 面板中显示: - 复制该 URL 并嵌入伪造的模型响应(例如作为“文档链接”) - 任何访问该 URL 的攻击者会触发 CRITICAL `deception_callback` 告警 - `/track/{token}` 端点返回 1×1 透明 GIF 以便请求正常完成 - 所有回调记录到专用的 `deception_callbacks` SQLite 表 ### 邮件告警 设置 `SMTP_HOST` 与 `SMTP_TO` 即可为 CRITICAL/HIGH 事件接收 HTML 邮件告警: ``` docker run ... \ -e SMTP_HOST=smtp.gmail.com \ -e SMTP_PORT=587 \ -e SMTP_USER=you@gmail.com \ -e SMTP_PASS=app-password \ -e SMTP_TO=alerts@example.com \ -e EMAIL_RISK_LEVELS=CRITICAL \ ... ``` 使用 Python 标准库 `smtplib` — 无额外依赖。在执行器中运行,不会阻塞请求处理。 ### 定时威胁报告 设置 `REPORT_SCHEDULE=daily` 或 `REPORT_SCHEDULE=weekly` 以自动通过邮件发送 HTML 威胁报告: - 在每日首个计划小时(每日)或周一(每周)发送 - 包含与 **⬇ 威胁报告** HTML 下载相同的内容:Top IP、路径、模式、地理分布 - 需要 `SMTP_HOST` 以及 `REPORT_EMAIL_TO` 或 `SMTP_TO` ### SIEM / syslog 转发 设置 `SYSLOG_HOST` 将每个捕获事件通过 UDP 转发到日志聚合器: ``` # JSON 格式(默认) docker run ... -e SYSLOG_HOST=192.168.1.100 -e SYSLOG_PORT=514 ... # CEF(通用事件格式)— 适用于 Splunk、IBM QRadar 等 docker run ... -e SYSLOG_HOST=192.168.1.100 -e SYSLOG_FORMAT=cef ... ``` ### 数据保留 设置 `MAX_REQUEST_AGE_DAYS` 自动清除旧请求: - 每小时后台任务删除超过设定天数的记录 - 设为 `0`(默认)可永久保留数据 - 与 `MAX_REQUESTS_STORED`(硬上限)协同工作 ### Fail2ban / iptables 集成 设置 `BLOCKLIST_FILE` 在每次封禁/解封时将 IP 写入文件: ``` # 纯格式 — 每行一个 IP docker run ... -e BLOCKLIST_FILE=/data/blocked.txt ... # fail2ban 格式 — 带时间戳和原因注释 docker run ... -e BLOCKLIST_FILE=/data/blocked.txt -e BLOCKLIST_FORMAT=fail2ban ... ``` 挂载该文件到宿主机并配置 fail2ban 读取,或直接用于 `iptables`。 ### ISP 与数据中心检测 ip-api.com 免费接口返回每个攻击 IP 的 ISP 名称与 `hosting` 标志。两者均在 IP 会话抽屉中显示: - **ISP** — 运营商或托管提供商名称(例如 "DigitalOcean"、"Alibaba Cloud"、"Deutsche Telekom") - **数据中心标识** — 当 IP 属于托管或云提供商而非住宅 ISP 时显示 无需 API 密钥;与标准地理位置数据一同提取。 ### 反向 DNS 对每个新公网 IP 执行 PTR 查询(`gethostbyaddr`),并缓存地理数据。主机名显示在会话抽屉中 — 如 `exit-node.tor.example.com`、`scan.example-security.com` 等,通常可一眼识别攻击者基础设施。 ### ThreatFox 情报源集成 蜜罐在启动时下载 [ThreatFox](https://threatfox.abuse.ch/) 的 IP:port IOC 喂入,并每 24 小时刷新(无需 API 密钥): - 匹配已知恶意软件 C2 基础设施的 IP 在会话抽屉中显示红色 **ThreatFox** 徽章,并标注恶意家族(如 "Cobalt Strike"、"Mirai"、"AsyncRAT") - 启动时记录 IOC 数量与最后刷新时间 - 查询为同步内存操作,零额外开销 ### GreyNoise 分类 设置 `GREYNOISE_API_KEY` 通过 [GreyNoise](https://www.greynoise.io/) 社区 API 将每个攻击 IP 分类: - **MALICIOUS** — 定向攻击者,非全网扫描噪声 - **BENIGN** — 已知安全基础设施(Googlebot、Shodan、Censys 等) - **RIOT** 标识 — IP 属于已知良性互联网基础设施;可安全降权 - **noise** 标志 — IP 为背景扫描噪声而非定向攻击 结果缓存在 `ip_cache` 中并显示在会话抽屉。免费社区层支持每日 1,000 次查询。 ### TinyML 端侧智能 五个端侧模型全程在进程内运行 — 无云端、无 GPU、无独立服务;每请求推理微秒级。专为在 Raspberry Pi 4 上与蜜罐并行运行设计。 #### 模型 | 模型 | 算法 | 检测内容 | |---|---|---| | **异常检测** | Isolation Forest | 与你的基准流量相比看起来异常的请求 — 捕捉未被正则规则覆盖的新攻击 | | **攻击聚类** | DBSCAN | 按行为指纹对攻击 IP 分组 — 发现协同运行的多个 IP 使用相同扫描器 | | **风险增强** | Random Forest | 在 0–1 范围内连续预测风险,训练于历史 `risk_level` 标签 — 捕捉误分类请求 | | **机器人检测** | Random Forest | 基于请求时间规律、路径多样性与 User-Agent 一致性评估会话是否为自动化 | | **地理风险** | 贝叶斯字典 | 基于历史高/危比率的国家与 ASN 风险评分 — 在积累会话历史前捕获来自已知不良来源的新 IP | #### 特征向量 特征在训练与推理时通过 `ip_cache` 信誉数据增强: **每请求(15 个特征)**:正文长度、路径长度、路径深度、头部数量、小时、POST 标志、JSON 标志、认证头标志、标记模式数量、类别、C2 标志、AbuseIPDB 评分、Tor 标志、托管标志、ThreatFox 命中 **每会话(15 个特征)**:总请求数、唯一路径数、唯一 User-Agent 数、平均请求间隔、会话跨度、高/危风险比例、唯一类别数、路径多样性比值、平均正文大小、AbuseIPDB 评分、Tor 标志、托管标志、ThreatFox 命中、**时间标准差**(请求间隔标准差 — 典型的机器人检测信号;低方差 + 高请求数 = 扫描器) #### 复合威胁评分 每条请求获得 `ml_composite_score`(0–1),综合所有子模型: | 信号 | 权重 | |---|---| | 分数(Isolation Forest) | 25% | | 风险概率(Random Forest) | 35% | | 地理风险(贝叶斯国家/ASN) | 20% | 映射到 `ml_threat_band`:**LOW / MEDIUM / HIGH / CRITICAL**。ML 情报状态卡显示训练数据 `p10 / p50 / p90` 分位数校准,便于判断阈值是否适合你的流量。 #### 仪表板 可折叠的 **🤖 ML 情报** 面板展示五个卡片: - **模型状态** — 已训练 / 预热中 / 样本数 / 最后训练时间 / 复合分位数校准 - **异常检测** — 过去 24 小时内标记为异常的请求实际数量(基于训练数据计算,非占位符) - **机器人检测** — 最后训练时识别出的高置信度(≥80%)机器人会话实际数量 - **攻击聚类** — 活跃的 DBSCAN 聚类数量及每类 IP 数量 - **🌍 地理风险情报** — 按贝叶斯风险评分排序的前 5 个风险最高国家与 ASN #### 流式徽章 | 徽章 | 颜色 | 条件 | |---|---|---| | **ANOMALY** | 紫色 | 异常分数 ≥ 0.75 | | **BOT** | 蓝色 | 会话机器人概率 ≥ 80% | | **GEORISK** | 琥珀色 | 地理风险分数 ≥ 0.70(仅当无 ANOMALY 徽章时显示) | | **ML:HIGH** | 橙色 | 复合威胁分数 ≥ 0.50 | | **ML:CRITICAL** | 红色 | 复合威胁分数 ≥ 0.75 | #### 训练计划 - **冷启动**:模型初始为 `None` — 所有分数安全返回 `None`,不报错 - **首次训练**:当数据库中存在 100 条以上请求时自动触发 - **重新训练**:每 200 条新请求或每 60 分钟,以先到者为准 - **执行方式**:在线程执行器中运行 — 从不阻塞异步事件循环 - **模型版本保护**:若序列化模型的特征维度不匹配(例如从 Phase-2 版本升级前),则丢弃并自动重新训练 #### Raspberry Pi 规格 | 组件 | 内存占用 | CPU 时间(Pi 4) | |---|---|---| | scikit-learn 导入 | ~80 MB | 2 秒启动 | | 全部 5 个模型加载 | ~40 MB | — | | GeoRisk 字典(Phase 2) | < 1 MB | — | | 每请求推理 | 可忽略 | < 1 毫秒 | | 训练(1,000 条样本) | ~50 MB 峰值 | ~5 秒 | 模型保存至 `/data/ml_models/`(通过 joblib),重启后重新加载。总内存开销约 121 MB,额外启动时间约 2 秒。 API:`GET /__admin/api/ml/stats` — 返回模型状态、实际训练计数、聚类摘要、风险最高国家/ASN 列表,以及复合分位数校准。 ### Top 攻击者排行榜 **🏆 Top Attackers** 区域下方显示: - **Top IPs** — 最活跃的 10 个攻击 IP,包含国家、请求数与最高风险等级;点击任意 IP 可打开其会话抽屉 - **Top Countries** — 最活跃的 10 个源国家及请求占比与百分比 随统计刷新(每 30 秒)自动更新。 ### Canary 令牌 启动时生成唯一的假 API 密钥(`sk-pot-…`)并嵌入 `/v1/models` 响应。若攻击者复制该密钥并在后续请求中使用,分类器会立即标记为 **CRITICAL**,模式为 `canary_token_reuse`。 在仪表板的 **情报** 面板中可查看当前 Canary 令牌。 ### Webhook 告警 设置 `WEBHOOK_URLS` 即可在 CRITICAL 或 HIGH 事件发生时接收 HTTP POST 通知。支持三种负载格式: ``` # Slack docker run ... -e WEBHOOK_URLS=https://hooks.slack.com/... -e WEBHOOK_FORMAT=slack ... # Discord docker run ... -e WEBHOOK_URLS=https://discord.com/api/webhooks/... -e WEBHOOK_FORMAT=discord ... # 通用 JSON(默认) docker run ... -e WEBHOOK_URLS=https://your-endpoint.example.com/alert ... ``` 使用仪表板中的 **Send Test Alert** 按钮验证 Webhook 是否正常。 ### 威胁报告 点击仪表板页眉的 **⬇ Threat Report** 下载自包含 HTML 报告,包含: - 汇总统计(总请求数、独立 IP、风险分布) - Top 10 攻击 IP(含地理与风险数据) - Top 10 被攻击路径 - Top 15 标记的攻击模式 - 按国家划分的地理分布 ### AbuseIPDB 信誉 设置 `ABUSEIPDB_API_KEY` 为每个捕获 IP 补充社区信誉评分(0–100)与 Tor 出口节点检测。缓存每个 IP 结果,因此免费层每日 1,000 次请求限制很少触及。评分高的 IP 在实时流中显示红点,详情在 IP 会话抽屉中完整展示。 ### Prometheus 指标 设置 `METRICS_ENABLED=true` 暴露 `/metrics`(标准 Prometheus 文本格式)。可选地通过 `METRICS_TOKEN` 使用 Bearer 令牌保护。暴露指标包括: | 指标 | 描述 | |---|---| | `honeypot_requests_total` | 总捕获请求数 | | `honeypot_requests_24h` | 过去 24 小时请求数 | | `honeypot_requests_by_risk{level}` | 按风险等级统计的请求数 | | `honeypot_requests_by_category{category}` | 按类别统计的请求数 | | `honeypot_unique_ips_total` | 独立攻击 IP 数 | | `honeypot_websocket_connections` | 活动 WebSocket 连接数 | | `honeypot_service_enabled{service}` | 服务启用时为 1,禁用时为 0 | | `honeypot_service_tarpitted{service}` | 服务启用 Tarpit 时为 1 | ### IP 封禁 可从仪表板直接封禁攻击 IP: - **手动封禁** — 在请求模态框、IP 会话抽屉或封禁 IP 面板中点击“封禁 IP” - **自动封禁** — 设置 `AUTO_BLOCK_ENABLED=true`,当 IP 在 `AUTO_BLOCK_WINDOW` 秒内触发 `AUTO_BLOCK_THRESHOLD` 次 CRITICAL 时自动封禁;所有打开的仪表板标签页会弹出提示 - 被封禁 IP 会立即收到 `429 Too Many Requests` — 请求仍被记录以保留情报 - 可随时从封禁 IP 面板解封任意 IP ### IP 白名单 防止自有 IP 污染流: - 在 **✅ 允许的 IP** 面板中添加 IP(可带标签) - 允许的 IP 直接通过 ASGI 中间件 — 不记录、不地理位置查询、不自动封禁 - 持久化保存到 SQLite,并在启动时加载到内存集合,实现零开销检查 ### IP 标注/打标签 为攻击 IP 添加操作者上下文: - 打开任意 IP 的会话抽屉 → 点击备注区域添加或编辑自由文本备注 - 备注会作为 📝 提示显示在实时流、会话抽屉和请求模态框中 - 备注在重启后仍保留(保存在 `ip_notes` SQLite 表中,缓存在内存) - 保存空字符串可删除备注 ### CSV 导出 导出请求数据供离线分析(Excel、Splunk、pandas、SIEM): - 点击流面板页眉的 **⬇ Export CSV** 下载全部数据 - 支持查询过滤:`?risk=CRITICAL`、`?category=attack`、`?ip=1.2.3.4`、`?since=2024-01-01`、`?limit=50000` - 字段:`id`、`timestamp`、`ip`、`method`、`path`、`category`、`risk_level`、`country`、`city`、`user_agent`、`flagged_patterns`、`body_snippet`(前 200 字符) - 分批流式导出 — 即使导出大型数据集也不会导致内存突增 ### 键盘导航 无需鼠标即可在实时流中导航: | 按键 | 操作 | |---|---| | `j` / `↓` | 在流中选择下一行 | | `` / `↑` | 在流中选择上一行 | | `Enter` | 打开选中行的请求模态框 | | `b` | 封禁选中行的 IP | | `Escape` | 关闭模态框或抽屉 | ### WebSocket 安全 实时 `/ws` 端点采用令牌认证: - 仪表板加载时将 `sha256(ADMIN_PASSWORD)` 令牌注入页面 - 浏览器自动将 `?token=` 附加到 WebSocket URL - 无有效令牌的连接会立即关闭,WebSocket 代码 1008(Policy Violation) - 轮换 `ADMIN_PASSWORD` 会立即使所有未授权连接失效 ### 攻击情报图表 标准风险/类别/时间线图表下方包含两个附加图表: - **7 天趋势** — 过去一周按天统计的 CRITICAL / HIGH / MEDIUM / LOW 请求堆叠柱状图 - **小时热力图** — 7×24 颜色网格展示攻击高峰时段(颜色越深 = 请求越多),每 5 分钟刷新一次 ### 请求正文查看器 点击任意流式行以在模态框中查看完整请求: - **请求页** — 方法 + 路径、可展开的头部表、格式化 JSON 正文(纯文本备用) - **模式页** — 本请求匹配的所有攻击模式列表 - **复制为 cURL** — 一键生成可直接粘贴执行的 `curl` 命令 ### 请求搜索 使用流上方的搜索框按 IP 地址、URL 路径、请求正文内容或国家进行过滤;结果在 300 毫秒内呈现。 ### 每 IP 会话视图 点击任意 IP 地址打开抽屉,展示该 IP 的完整请求时间线:时间戳、方法、路径、风险等级、匹配模式。 ## Docker 细节 ### 多架构构建 GitHub Actions 工作流(`.github/workflows/docker-build.yml`)在每次推送到 `main` 时自动为三个架构构建: | 架构 | 用途 | |---|---| | `linux/amd64` | x86-64 服务器、台式机、VM | | `linux/arm64` | Raspberry Pi 4/5(64 位 OS)、AWS Graviton、苹果 Silicon | | `linux/arm/v7` | Raspberry Pi 2/3(32 位 Raspberry Pi OS) | ### 手动多架构构建 ``` docker buildx build \ --platform linux/amd64,linux/arm64,linux/arm/v7 \ -t ghcr.io/0zzy-tech/ai-pot:latest \ --push . ``` ### 镜像安全 - 以非 root 用户 `honeypot`(UID 1000)运行 - 不内嵌任何密钥 — 所有凭据通过环境变量传递 - 多阶段构建使最终镜像保持精简(约 200 MB) ## 架构 ``` Attacker │ ▼ Port 11434 ┌────────────────────────────────────────────────────────────┐ │ FastAPI Middleware (_CaptureMiddleware) │ │ 1. Read body │ │ 2. Allow-list gate — whitelisted IP? → pass (no log) │ │ 3. IP block gate — blocked IP? → 429 (still logged) │ │ 4. Service gate — disabled service? → 404 (logged) │ │ 5. Tarpit delay — if enabled for this service │ │ 6. Route to matching fake handler │ │ 7. asyncio.create_task(log_request) ← never blocks │ └───────────┬────────────────────────────────────────────────┘ │ ┌────────▼──────────────┐ │ Logger pipeline │ │ ├─ Classifier │ sync regex + canary + custom rules │ ├─ Geolocator │ async, 2-layer cache (memory + SQLite) │ ├─ Reverse DNS │ async PTR lookup in thread executor (cached) │ ├─ AbuseIPDB │ optional reputation check (cached) │ ├─ GreyNoise │ optional noise/malicious classification (cached) │ ├─ Threat feeds │ sync C2 lookup (Feodo Tracker + ThreatFox) │ ├─ ML engine │ anomaly score + bot probability (scikit-learn) │ ├─ IP notes │ attach operator note to broadcast │ ├─ Auto-block │ CRITICAL threshold check → block + broadcast │ ├─ SQLite write │ aiosqlite, single write lock │ ├─ WS broadcast │ fan-out to authenticated dashboard clients │ ├─ Webhooks │ async POST to Slack/Discord/JSON │ ├─ Email alerts │ SMTP in executor (non-blocking) │ ├─ Syslog │ UDP JSON/CEF fire-and-forget │ └─ Deception log │ /track/ callbacks → deception_callbacks table └────────┬───────────────┘ │ WebSocket (token-authenticated) ┌────────▼────────────────────────────────────────┐ │ Dashboard /__admin (HTTP Basic Auth) │ │ ├─ World map Leaflet + CartoDB │ │ ├─ Request feed live + search + CSV ⬇ │ │ ├─ Request modal body/headers/cURL │ │ ├─ IP session view drawer + note editor │ │ ├─ Charts risk/cat/24h/7d/heatmap │ │ ├─ Service panel enable + tarpit │ │ ├─ Intelligence webhooks/canary/deception│ │ ├─ Threat feed stats C2 count + last refresh │ │ ├─ Top Attackers IPs + countries leaderboard│ │ ├─ Blocked IPs manual + auto-block │ │ ├─ Allowed IPs whitelist panel │ │ ├─ Custom Rules regex CRUD + hot-reload │ │ ├─ ML Intelligence anomaly/bot/cluster panel│ │ └─ Threat report HTML download │ └─────────────────────────────────────────────────┘ Background tasks (asyncio): ├─ Feodo Tracker feed refresh (every 24 h) ├─ ThreatFox IOC feed refresh (every 24 h) ├─ ML model training loop (every 200 req or 60 min) ├─ Data retention purge (every 1 h) └─ Scheduled threat report (daily / weekly) ``` ## 服务管理 ### Docker ``` docker compose up -d # start docker compose down # stop docker compose restart # restart docker compose logs -f # live logs docker compose pull && docker compose up -d # update to latest ``` ### Systemd(裸机) ``` sudo systemctl start ai-honeypot sudo systemctl stop ai-honeypot sudo systemctl restart ai-honeypot sudo journalctl -u ai-honeypot -f ``` ## 关于 AI 蜜罐是一款轻量级、高保真欺骗平台,旨在捕获自动化扫描器、凭证窃取器以及探测暴露 AI 基础设施的定向攻击者。 它能同时伪装 13 种真实的 AI API 服务器 — Ollama、OpenAI、Anthropic、HuggingFace、Stable Diffusion 等 — 在单个端口上捕获并实时分类每个请求。 该项目源于对互联网暴露在外的 AI 端点实际收到什么的好奇。答案出乎意料:凭证填充器、机器人网络 C2 回调、监狱逃逸尝试、提示注入、大规模扫描器,以及数小时内涌入的研究人员。 所有功能在 Raspberry Pi 上运行,无需云端依赖。单个异步工作进程、SQLite 以及约 384 MB 内存即可完成。 ### 作者 **Martyn Oswald** — [0zzy-tech](https://github.com/0zzy-tech) 作为开源安全研究工具开发和维护,欢迎提交贡献、问题与想法。
标签:AI蜜罐, AMD64, AMSI绕过, API伪装, ARM64, ARMv7, C2通信, Cobalt Strike, Docker容器化, Hakrawler, Honeypot, Raspberry Pi, SEO: AI honeypot, SEO: 威胁报告, SEO: 攻击地图, SEO: 蜜罐监控, Ubuntu服务器, 人工智能安全, 低资源部署, 入侵分析, 内存执行, 合规性, 地理可视化, 多协议模拟, 多架构镜像, 威胁检测, 开源蜜罐, 异常检测, 攻击地图, 攻击溯源, 攻击诱捕, 日志采集, 物联网安全, 自定义请求头, 请求拦截, 边缘计算, 逆向工具