antonizick/Citadel
GitHub: antonizick/Citadel
一款结合 AI 驱动的主题监控与 IOC 追踪的自托管威胁情报平台,实现自动化搜索、智能摘要生成与多渠道报告分发的一体化工作流。
Stars: 0 | Forks: 0
# Nx-Citadel
**自托管智能监控平台。** 追踪主题、人物、技术和可信来源——由 AI 驱动的搜索、摘要和分发功能提供支持。
Nx-Citadel 定期运行 Web 搜索,将结果提供给 LLM (Anthropic Claude),生成执行摘要,并通过 Email、Slack、SMS 或 Discord 进行分发。它还维护着一个从公开威胁情报源提取的 IOC (Indicators of Compromise,妥协指标) 数据库。
## 功能
- **兴趣监控** — 定义主题(人物、公司、技术、事件、自定义术语)。每个主题按设定的计划运行,搜索网络并生成 AI 摘要报告。
- **可信资源监控** — 指向任何 URL(网站、RSS 源、X/Twitter 个人资料)。AI 使用可配置的 prompt 提取并结构化过去 48 小时内的资讯。
- **执行摘要报告** — 将多个兴趣报告综合成跨主题简报,并按独立计划运行。
- **IOC 追踪** — 每日自动从 Feodo Tracker、URLhaus、MalwareBazaar 和 OpenPhish 获取数据。支持带严格验证的批量 CSV 上传。
- **多渠道分发** — Email (SMTP/Gmail)、Slack webhook、SMS (Twilio)、Discord webhook。支持按兴趣单独配置。
- **基于角色的访问** — user / manager / admin 角色,具备会话认证和 TOTP MFA 功能(manager/admin 首次登录时强制启用)。
- **完整备份与恢复** — 通过 UI 进行基于 ZIP 的完整备份和粒度化备份。
- **自动更新** — 通过 SSE 流实现一键更新,保留所有用户数据。
- **深色/浅色主题** — 默认深色模式,切换状态持久化至 localStorage。
## 快速开始
### 前置条件
- Linux 下的 **Python 3.10+**
- **Anthropic API key** (用于 Claude LLM)
- 可选:SMTP 配置信息、Twilio 账号、Slack/Discord webhook、Brave Search 或 SerpAPI key
### 本地运行
```
# 1. Clone 并创建 virtual environment
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
# 2. 启动 server (端口 8000)
python run.py
# 3. 打开 http://localhost:8000
# 默认 login: admin / admin
```
### 作为后台服务运行
```
# 开发 (带 PID 跟踪)
bash StartCitadel.sh
# 停止
bash StopCitadel.sh
# 生产 (systemd)
sudo cp citadel.service /etc/systemd/system/
sudo systemctl enable --now citadel
```
### 在服务器上安装
```
curl -fsSL https://www.antonizick.com/nxcitadel/get.sh | sudo bash
```
选项:`--port 9000`、`--dir /opt/nxcitadel`、`--user nxcitadel`
## 架构
```
┌─────────────────────────────────────────────────────────────────────────────┐
│ CLIENT (Browser) │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ SPA (index.html + app.js + main.css) │ │
│ │ • Tabbed navigation (Dashboard / Interests / Resources │ │
│ │ / Summary Reports / IOCs / Settings / Admin / Logs) │ │
│ │ • Axios → /api/* • Auth via session cookies │ │
│ │ • Theme toggle (dark/light, localStorage) │ │
│ │ • SSE tail (admin self-update stream) │ │
│ └─────────────────────────────────────────────────────────┘ │
└────────────────────────────────┬────────────────────────────────────────────┘
│ HTTPS (behind reverse proxy)
▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ NX-CITADEL APPLICATION SERVER │
│ FastAPI + uvicorn :8000 (0.0.0.0) │
│ │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ Lifespan (startup/shutdown) │ │
│ │ • setup_logging() • _seed_admin() • APScheduler start │ │
│ │ • IOC maintenance cron (02:00 UTC) • IOC collection cron (03:00) │ │
│ │ • Per-interest / per-resource / per-summary schedule reload │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ auth │ │interests │ │resources │ │summary │ │ iocs │ │
│ │_router │ │ (router) │ │ (router) │ │_reports │ │ (router) │ │
│ │ │ │ │ │ │ │ (router) │ │ │ │
│ │ /login │ │ CRUD │ │ CRUD │ │ CRUD │ │ CRUD │ │
│ │ /api/ │ │ run │ │ run │ │ run │ │ bulk CSV │ │
│ │ auth/* │ │ reports │ │ reports │ │ reports │ │ config │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ users │ │ settings │ │ logs │ │ admin │ │ioc_config │ │
│ │ (router) │ │ (router) │ │ (router) │ │ (router) │ │ (router) │ │
│ │ │ │ │ │ │ │ │ │ │ │
│ │ CRUD │ │ CRUD │ │ tail │ │ backup │ │ source │ │
│ │ MFA reset│ │ test LLM │ │ archive │ │ restore │ │ sync │ │
│ │ │ │ test SMS │ │ │ │ build-pkg│ │ status │ │
│ │ │ │ test email│ │ │ │ reset │ │ │ │
│ │ │ │ test disc│ │ │ │ │ │ │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ Auth Middleware (main.py) │ │
│ │ • Session cookie validation (12h TTL) • bcrypt password check │ │
│ │ • TOTP MFA enforcement (manager/admin) • bypass /login, /static │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌────────────────┐ ┌─────────────────────────────────┐
│ SERVICES │ │ SERVICES │ │ SERVICES │
├───────────────┤ ├───────────────┤ ├──────────────────────────────┤
│ ai_service │ │ search_service │ │ scheduler_service │
│ │ │ │ │ │
│ • summarize_ │ │ • search_multi │ │ • run_interest() │
│ results() │ │ • search_web() │ │ • run_resource() │
│ • summarize_ │ │ • search_trusted│ │ • run_summary_report() │
│ resource() │ │ _resource() │ │ • _build_trigger() │
│ │ │ (DDG/Brave/Serp)│ │ • reload_all_schedules() │
│ SYSTEM_PROMPT: │ │ │ │ │
│ "use only │ │ OUTPUT CHANNELS:│ │ ioc_collector │
│ provided │ │ deliver_outputs │ │ │
│ results, cite │ │ • email (aiosmtp)│ │ • Feodo Tracker │
│ every claim" │ │ • slack webhook │ │ • URLhaus │
└───────┬────────┘ │ • sms (Twilio) │ │ • MalwareBazaar │
│ │ • discord wh │ │ • OpenPhish │
│ └────────┬────────┘ └────────────────┬────────────┘
│ │ │
▼ ▼ ▼
┌──────────────────────────────────────────────────────────────────────────────────┐
│ OUTPUT LAYER │
│ │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ output_service / summary_service │ │
│ │ │ │
│ │ deliver_outputs(): │ │
│ │ 1. save report (.md → data/reports//) │ │
│ │ 2. deliver to channels (email/slack/sms/discord) │ │
│ │ 3. enrich with recent resource reports (data/resource_reports/) │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ logger_service │ │
│ │ • setup_logging() → logs/citadel.log (daily rotation) │ │
│ │ • log_user_action() │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────────────────────────────┐
│ STORAGE LAYER │
│ (markdown files with YAML frontmatter — no DB) │
├──────────────────────────────────────────────────────────────────────────────────┤
│ │
│ markdown_store.py ──→ Generic CRUD for .md + frontmatter │
│ ioc_store.py ──→ IOC-specific + dedup + maintenance │
│ user_store.py ──→ User CRUD │
│ │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ data/interests/ ──→ .md (watch topic defs) │ │
│ │ data/reports// ──→ .md (generated reports) │ │
│ │ data/resources/ ──→ .md (trusted resource monitors) │ │
│ │ data/resource_reports// ──→ .md (resource reports) │ │
│ │ data/summary_reports// ──→ defs + generated reports │ │
│ │ data/iocs/ ──→ ips.md, domains.md, urls.md, hashes.md │ │
│ │ data/users/ ──→ User accounts (bcrypt) │ │
│ │ data/config/ ──→ settings.yaml, ioc_sources.yaml, │ │
│ │ ioc_sync_status.yaml │ │
│ │ logs/ ──→ citadel.log + daily archives (.gz) │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
└────────────────────────────────────────────────────────────────────────────────┘
┌──────────────────────────────────────────────────────────────────────────────────┐
│ EXTERNAL INTEGRATIONS │
├─────────────────────┬──────────────┬──────────────┬─────────────────┬────────────┤
│ Anthropic │ DuckDuckGo │ aiosmtplib │ Twilio │ Discord │
│ Claude API │ Brave API │ (email) │ (SMS) │ webhook │
│ │ SerpAPI │ │ │ │
│ • AI summarization │ │ │ │
│ • SYSTEM_PROMPT │ │ │ │
│ enforcement │ │ │ │
└───────────────┴──────────────┴──────────────┴──────────────┴───────────────┘
```
**关键数据流:**
1. **兴趣运行 pipeline**:`scheduler_service.run_interest()` → `search_service.search_multi()` (DDG/Brave/SerpAPI) → `ai_service.summarize_results()` (Anthropic Claude) → `output_service.deliver_outputs()` → 保存报告 + 可选分发渠道。摘要会结合 `data/resource_reports/` 中最近的受信资源报告进行丰富。
2. **资源监控 pipeline**:`run_resource()` → 使用 `[SOURCE]` 替换渲染 prompt → `search_multi()` → `summarize_resource()` → `deliver_resource_outputs()` → 保存至 `data/resource_reports//`。
3. **执行摘要 pipeline**:`run_summary_report()` → 收集所有兴趣报告 → LLM 综合 → 通过配置的渠道分发。
4. **IOC pipeline**:计划收集任务(每日 UTC 03:00)从 Feodo Tracker、URLhaus、MalwareBazaar、OpenPhish 拉取数据 → 去重后存入 `ioc_store` → 日常维护任务(每日 UTC 02:00)清理过期/低优先级条目。
5. **认证流程**:Session cookies(12 小时 TTL) → bcrypt 密码 + TOTP MFA(对 manager/admin 强制启用) → `main.py` 中的 middleware 保护所有 `/api/*` 路径(auth 路径除外)。
### 目录结构
```
nxcitadel/
├── app/ # Application code
│ ├── main.py # FastAPI entry point, auth middleware
│ ├── auth.py # Sessions, bcrypt, TOTP
│ ├── models.py # Pydantic models
│ ├── config.py # settings.yaml loader
│ ├── routers/ # API endpoints (CRUD, run, reports)
│ ├── services/ # Business logic (AI, search, scheduler, IOC)
│ └── storage/ # Markdown CRUD layer
├── data/ # All user data (markdown + YAML)
│ ├── interests/ # Watch topic definitions
│ ├── resources/ # Trusted resource monitor definitions
│ ├── reports/ # Generated interest reports
│ ├── resource_reports/ # Generated resource monitor reports
│ ├── summary_reports/ # Summary report definitions + generated reports
│ ├── iocs/ # IOC data (ips, domains, urls, hashes)
│ ├── users/ # User accounts
│ └── config/ # settings.yaml, ioc_sources.yaml
├── templates/index.html # SPA shell (Jinja2)
├── static/ # CSS + JS + assets
├── deploy/ # Install script, build scripts, packages
├── logs/ # Application logs (daily rotation)
├── run.py # Dev entry point
├── requirements.txt # Python dependencies
└── citadel.service # Systemd unit file
```
## 配置
所有设置均位于 `data/config/settings.yaml` 中。可通过 Settings UI 创建或手动创建:
```
llm:
provider: anthropic
api_key: sk-ant-...
model: claude-sonnet-4-6
search:
provider: duckduckgo # duckduckgo | brave | serpapi
max_results: 10
brave_api_key: ""
serpapi_key: ""
email:
smtp_host: smtp.gmail.com
smtp_port: 587
smtp_user: you@gmail.com
smtp_password: your-app-password
from_address: you@gmail.com
use_tls: true
slack:
default_webhook: ""
discord:
default_webhook: ""
sms:
provider: twilio
account_sid: ""
auth_token: ""
from_number: ""
system_state: production # set to "dev" to suppress scheduled LLM calls
```
### 开发模式
在活跃开发期间,将 `system_state` 设置为 `dev` 可阻止所有计划任务的触发。手动运行(UI 中的 "Run" 按钮)仍可正常使用。可通过 API 切换:
```
POST /api/admin/system-state {"system_state": "dev"}
GET /api/admin/system-state
```
## 调度
每个兴趣、资源和摘要报告都有各自的调度计划:
```
schedule:
type: interval # interval | weekly | cron | manual
interval_value: 1
interval_unit: days # minutes | hours | days | weeks
run_time: "20:00" # HH:MM UTC (weekly type)
days_of_week: [0,1,2] # 0=Mon … 6=Sun (weekly type)
cron_expression: "0 20 * * *" # (cron type)
```
系统任务(始终处于激活状态):
- **IOC 维护** — 每日 UTC 02:00,清理过期条目
- **IOC 收集** — 每日 UTC 03:00,拉取所有已启用的源
## API
运行时可通过 `http://localhost:8000/docs` 查看基于 OpenAPI 的完整 API 文档。除 `/login`、`/health`、`/static/*` 和 `/api/auth/*` 外,所有 endpoint 均需进行会话认证。
| Router | Prefix | 用途 |
|---|---|---|
| `auth_router` | (无) | 登录页面、MFA、登出、`/api/auth/me` |
| `interests` | `/api/interests` | CRUD、运行、报告、活动 |
| `resources` | `/api/resources` | CRUD、运行、报告 |
| `summary_reports` | `/api/summary-reports` | CRUD、运行、报告文件 |
| `iocs` | `/api/iocs` | IOC CRUD、统计、批量 CSV 上传 |
| `ioc_config` | `/api/ioc-config` | Feed 源配置、同步状态、手动拉取 |
| `users` | `/api/users` | User CRUD、MFA 重置 (admin) |
| `settings` | `/api/settings` | Settings CRUD、测试 endpoint (LLM、Email、SMS、Discord) |
| `logs` | `/api/logs` | 最新日志、归档列表 |
| `admin` | `/api/admin` | 备份/恢复、构建包、自更新、恢复出厂设置 |
## 开发
```
# 创建 venv
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
# 启动 (前台,无 reload)
python run.py
# 启动 (后台,带 PID 跟踪)
bash StartCitadel.sh
# 停止
bash StopCitadel.sh
# 查看 logs
tail -f logs/citadel.log
```
本项目没有测试套件、代码检查工具、类型检查器或格式化工具。验证过程为手动——启动服务器并操作 UI 或 API。
## 部署
### 构建包
```
bash deploy/build_package.sh
# → deploy/nxcitadel-.tar.gz
# → deploy/nxcitadel-latest.tar.gz (symlink)
```
或通过 UI 操作:Admin panel → **Build Package** → **Download Package**。
### 在任意 Linux 服务器上一行命令安装
```
curl -fsSL https://www.antonizick.com/nxcitadel/get.sh | sudo bash
```
### 自更新(通过应用内部)
Admin panel → **Update** — 下载最新包,备份数据,通过 rsync 解压,重新安装依赖并重启服务。所有过程均通过 SSE 流式传输。
### 生产环境建议
- 在反向代理 (nginx, Caddy) 之后运行以处理 HTTPS 终止
- 无内置速率限制——请在代理层添加
- 立即更改默认的 `admin / admin` 凭据
- 在所有账号上启用 MFA
## 安全
- 有效期为 12 小时的 Session cookie
- 使用 bcrypt 哈希的密码
- 对 manager/admin 角色强制要求 TOTP MFA(5 分钟待处理验证过期时间)
- 管理员可被标记为 `mfa_exempt` (免 MFA)
- Auth middleware 在所有路径上运行,除了 login、health、static 和 auth API
- 首次启动时初始化默认管理员——**请立即更改密码**
## 许可证
有关许可证详细信息,请参阅代码仓库。
标签:AI摘要, Anthropic, APScheduler, AV绕过, CIS基准, Claude, CSV导入, CVE检测, Discord集成, ESC4, FastAPI, Feodo Tracker, HTTP/HTTPS抓包, IOC追踪, MalwareBazaar, MFA多因素认证, OpenPhish, OSINT, Python, RBAC, RSS监控, Slack集成, SSE, TOTP, Twilio短信, URLhaus, Webhook, Web监控, 力导向图, 多渠道通知, 失陷指标, 威胁情报, 威胁监控, 实时处理, 开发者工具, 开源情报收集, 态势感知, 情报共享, 情报平台, 数据备份, 无后门, 明网监控, 暗网情报, 网络安全, 自动化报告, 自托管, 角色权限控制, 逆向工具, 邮件通知, 隐私保护