jclee941/blacklist

GitHub: jclee941/blacklist

一个基于 Python 的威胁情报聚合管理平台,将多源 IP/域名/URL 黑名单规范化后自动部署到 Fortinet 等安全设备。

Stars: 0 | Forks: 1

# Blacklist 服务管理 ![Python](https://img.shields.io/badge/Python-3.11%2B-3776AB?logo=python&logoColor=white) ![Ruff](https://img.shields.io/badge/lint-Ruff-D7FF64?logo=ruff&logoColor=black) ![mypy](https://img.shields.io/badge/types-mypy-2A6DB2) ![Container](https://img.shields.io/badge/container-Docker%20%2F%20Compose-2496ED?logo=docker&logoColor=white) ![Commit](https://img.shields.io/badge/commits-Commitlint-F8C445?logo=conventionalcommits&logoColor=black) ## 一句话简介 · One-liner 这是一个基于 Python 的集成管理平台,从多个外部威胁情报源收集、规范化 IP、域名和 URL,整合到中央黑名单后,自动部署到 Fortinet 等外部安全设备中。它以 Jinja2 Web 控制台、REST API 和 WebSocket 实时通道作为统一入口。 一个 Python 平台,聚合外部威胁情报源,将条目规范化至中央黑名单,并通过 REST API 和 WebSocket 将生成的地址对象推送到 Fortinet 类设备,通过 Jinja2 Web 控制台对外提供服务。 ## 状态 · 运营概览 | 项目 / Item | 值 / Value | 备注 / Notes | | --- | --- | --- | | 默认端口 / Default port | `2542` | 通过 `PORT` 环境变量修改 | | 默认 ENV / Default env | `development` | 切换至 `ENV=production` | | Python | `3.11+` | `pyproject.toml` 中的 `target-version = "py311"` | | 容器 / Container | Docker + Compose | `deploy/docker-compose.yml` | | 环境变量文件 / Env file | `deploy/.env` | Compose 自动注入 | | 本地入口 / Local entry | `app/run_app.py` | `python app/run_app.py` | | 容器入口 / Container entry | `app/entrypoint.sh` | 在 `app/Dockerfile` 中调用 | | 部署前验证 / Pre-deploy check | `app/deployment_validation.py` | `make verify` | | 行长度 / Line length | 120 | Ruff | | 结构化日志 / Structured logging | `app/utils/structured_logging.py` | JSON 输出 | | 日志轮转 / Log rotation | `app/utils/log_rotation_manager.py` | 基于大小/时间策略 | | 生产就绪 / Production-ready? | 运营验证阶段 | 内部 PoC → 逐步推广 | ## 简明流程 · 运营流程 1. **收集 (Collection)** — 定期或手动从外部威胁情报源获取 IP / Domain / URL 条目。 (`app/core/routes/api/collection/`) 2. **规范化 (Normalization)** — `app/core/routes/api/blacklist/core.py` 对条目进行格式和重复检查后,将其合并到中央黑名单。 3. **管理 (Management)** — `app/core/routes/api/blacklist/management.py` 和 `batch.py` 处理批量添加、删除和 TTL 过期。 4. **部署 (Deployment)** — `app/core/routes/api/fortinet/core.py` 将地址对象推送到 Fortinet 设备。 5. **监控 (Observability)** — `app/core/monitoring/` 中的指标和错误计数器以及 `dashboard.html` 负责状态可视化,并通过 WebSocket 发送通知。 6. **认证 (Auth)** — `app/core/auth/` 中的 JWT/装饰器/中间件控制所有路由的授权。 英文摘要:从情报源收集 → 规范化并合并到中央黑名单 → 结合 TTL 进行批量管理 → 推送到 Fortinet → 通过指标/仪表盘监控 → 在整个技术栈中强制执行认证。 ## 包内容 · 组件构成 | 领域 / Area | 路径 / Path | 角色 / Role | | --- | --- | --- | | App bootstrap | `app/run_app.py`, `app/entrypoint.sh`, `app/Dockerfile` | 本地/容器执行入口 | | 部署前检查 | `app/deployment_validation.py` | 部署前环境与机密验证 | | Core | `app/core/app.py`, `app/core/config.py`, `app/core/dashboard.py`, `app/core/testing_app.py` | 应用工厂、配置与仪表盘聚合 | | Auth | `app/core/auth/` | JWT 签发/验证,`@require_*` 装饰器,请求中间件 | | Monitoring | `app/core/monitoring/` | 缓存、错误和系统指标收集器 | | Web routes | `app/core/routes/web_routes.py` | Jinja2 页面路由 | | API routes | `app/core/routes/api_routes.py`, `app/core/routes/api/` | REST API blueprint 注册 | | Collection API | `app/core/routes/api/collection/` | 源注册、凭证、同步、触发器和历史 | | Blacklist API | `app/core/routes/api/blacklist/` | 合并、批处理、管理和系统状态 | | Fortinet API | `app/core/routes/api/fortinet/core.py` | 设备注册与地址对象部署 | | Proxy / WS | `app/core/routes/proxy_routes.py`, `app/core/routes/websocket_routes.py`, `app/core/routes/system_routes.py` | 代理、实时通道和系统 endpoint | | Templates | `app/templates/`, `app/templates/monitoring/dashboard.html` | 登录、主页、收集、集成、会话、设置和仪表盘 UI | | Utils | `app/utils/structured_logging.py`, `app/utils/log_rotation_manager.py` | JSON 日志与日志轮转 | ## 首选阅读文件 · 先读这部分 1. `app/run_app.py` — 本地运行和应用工厂入口。 2. `app/core/config.py` — 环境变量、默认端口和 ENV 模式定义。 3. `app/core/app.py` — blueprint 注册顺序和中间件链。 4. `app/core/auth/decorators.py` — 路由保护模式和权限矩阵。 5. `app/core/routes/api/collection/sync.py` — 威胁情报同步核心逻辑。 6. `app/core/routes/api/blacklist/core.py` — 合并与规范化策略。 7. `app/core/routes/api/fortinet/core.py` — Fortinet 推送协议。 8. `app/deployment_validation.py` — 部署前的检查场景。 9. `Makefile` — 日常运营命令集合。 10. `AGENTS.md` (根目录) — 代码库运营规约。 ## API 与入口点 · Endpoint ### Web 控制台 (Jinja2) | Path | Template | 描述 / Description | | --- | --- | --- | | `/` | `app/templates/index.html` | 登录后的主仪表盘 | | `/collection` | `collection.html` | 收集任务与源状态 | | `/collection/logs` | `collection_logs.html` | 收集日志流 | | `/integrations` | `integrations.html` | Fortinet 等外部系统连接 | | `/sessions` | `sessions.html` | 活动会话/token 管理 | | `/settings` | `settings.html` | 环境、账户和 TTL 设置 | | `/monitoring/dashboard` | `monitoring/dashboard.html` | 指标与错误可视化 | ### REST API (blueprint: `app/core/routes/api/`) | Prefix | 模块 / Module | 角色 / Role | | --- | --- | --- | | `/api/auth` | `auth_routes.py` | 登录、token 刷新和登出 | | `/api/analytics` | `analytics.py` | 聚合与报告 | | `/api/dashboard` | `dashboard_api.py` | 仪表盘摘要卡片 | | `/api/database` | `database_api.py` | 数据库状态与迁移触发 | | `/api/migration` | `migration.py` | schema 迁移 | | `/api/settings` | `settings_api.py` | runtime 配置查询/修改 | | `/api/system` | `system_api.py` | 健康、信息与模式 | | `/api/core` | `core_api.py` | 核心功能网关 | | `/api/error-metrics` | `error_metrics_api.py` | 错误计数器暴露 | | `/api/fortinet` | `fortinet_register.py` | Fortinet 设备注册与注销 | | `/api/ip-management` | `ip_management_helpers.py` | IP 辅助工具 | | `/api/monitoring/metrics` | `monitoring/metrics.py` | 指标暴露(Prometheus 友好) | | `/api/collection/*` | `collection/*.py` | 源、凭证、同步、触发、历史与状态 | | `/api/blacklist/*` | `blacklist/*.py` | 合并、批处理、管理与系统 | ### 实时通信 | Endpoint | Module | 备注 | | --- | --- | --- | | WebSocket `/ws/*` | `app/core/routes/websocket_routes.py` | 推送收集进度与部署结果 | ## 快速开始 · 快速上手 ### 1. 前置条件 / Prerequisites - Python 3.11+ - Docker / Docker Compose(如需容器执行) - `deploy/.env`(由 Compose 自动加载) ### 2. 本地直接运行 / Local (no container) ``` git clone blacklist-service cd blacklist-service python -m venv .venv source .venv/bin/activate pip install -r app/requirements.txt cp deploy/.env.example deploy/.env # 필요 시 시크릿 채우기 export PORT=2542 export ENV=development python app/run_app.py # → http://localhost:2542 ``` ### 3. 容器运行 / Docker Compose ``` make setup-hooks # 1회: pre-commit + husky make dev # 빌드 + 핫리로드 개발 환경 make dev-no-build # 기존 이미지로 빠르게 기동 make dev-prod # 운영 모드에 가까운 빌드 make logs # tail 로그 make health # 헬스 체크 ``` ### 4. 部署前验证 / Pre-deploy verification ``` make verify # 전체 검증 make verify-lint # Ruff make verify-types # mypy make verify-secrets # 시크릿 누출 점검 make verify-pre-commit make verify-quick make verify-all ``` ### 5. 发布 / Release ``` make release-dry # 시뮬레이션 (CHANGELOG, VERSION 확인) make release # VERSION bump + 커밋 + 태그 ``` ## 配置 · 环境设置 `.env` 中的主要键值(实际键值列表以 `app/core/config.py` 作为 SSoT): | Key | 默认值 / Default | 描述 / Description | | --- | --- | --- | | `ENV` | `development` | `development` / `production` | | `PORT` | `2542` | Web 监听端口 | | `DATABASE_URL` | (env) | 中央黑名单存储库 | | `JWT_SECRET` | (生产环境必填) | `app/core/auth/jwt_service.py` | | `FORTINET_BASE_URL` | (env) | Fortinet API endpoint | | `FORTINET_API_TOKEN` | (必填) | Fortinet 认证 token | | `LOG_LEVEL` | `INFO` | 结构化日志级别 | | `LOG_ROTATE_MAX_BYTES` | `10485760` | 日志轮转阈值 | | `LOG_ROTATE_BACKUPS` | `10` | 保留世代数 | ## 命令参考 · Make 命令 | Target | 目的 / Purpose | | --- | --- | | `make help` | 输出可用的 target 及说明 | | `make setup-hooks` | 安装 pre-commit + husky + commit-msg 钩子 | | `make dev` | 启动开发环境(构建 + 热重载) | | `make dev-no-build` | 使用现有镜像快速启动 | | `make dev-prod` | 构建生产模式(无覆盖) | | `make dev-app` | 仅重启 app 服务(快速迭代) | | `make build` | 构建镜像 | | `make up` / `make down` | 启动/停止 Compose | | `make logs` | tail 日志 | | `make restart` | 重启 | | `make health` | 健康检查 | | `make clean` | 清理本地产物 | | `make test` | pytest(unit / integration / security / db / api 标记) | | `make deploy` | 部署序列 | | `make verify` / `verify-lint` / `verify-types` / `verify-secrets` / `verify-pre-commit` / `verify-quick` / `verify-all` | 验证集合 | | `make release` / `make release-dry` | 发布(VERSION + CHANGELOG + tag) | ## 本地开发 · 本地开发 - **Lint**: `ruff check app/`(行长 120,`py311`)。 - **类型**: `mypy` (`mypy.ini`)。 - **测试**: `pytest`(基于 `app/tests`,标记:`unit` / `integration` / `security` / `db` / `api`)。 - **提交**: Conventional Commits,通过 `commitlint.config.js` 强制执行。 - **Pre-commit**: Python lint/类型/机密扫描;前端使用 `frontend/` 中的 husky 执行 ESLint / Prettier。 - **热重载**: `make dev` 启用卷挂载(volume mount)+ 应用自动重启。 ## 架构 · 架构 ### 分层概述 | Layer | 职责 / Responsibility | 核心模块 | | --- | --- | --- | | Edge | HTTP/WS 接收,认证/授权,速率限制 | `app/core/auth/middleware.py`, `app/core/routes/web_routes.py` | | UI | Jinja2 页面渲染 | `app/templates/`, `monitoring/dashboard.html` | | API | REST endpoint,请求验证 | `app/core/routes/api_routes.py`, `api/*` | | Domain | 收集、黑名单和 Fortinet 领域逻辑 | `api/collection/`, `api/blacklist/`, `api/fortinet/` | | Infra | 数据库,外部 HTTP,指标 | `core/monitoring/`, `app/utils/`, `core/config.py` | | Ops | 部署、验证、日志轮转 | `deployment_validation.py`, `utils/log_rotation_manager.py` | ### 请求流程 · 典型流程 1. 客户端调用 `POST /api/collection/{id}/sync`。 2. `web_routes` → `middleware` 验证 JWT(`auth/decorators.py`)。 3. `collection/sync.py` 从 `collection/credentials.py` 加载源凭证。 4. 获取外部信息流并规范化 → 合并至 `blacklist/core.py`。 5. 结果事件记录至 `monitoring/metrics.py`,由 `websocket_routes.py` 推送给订阅者。 6. `fortinet/core.py` 将变更部署至 Fortinet → 将结果保存至 `/api/fortinet` 历史记录。 7. `dashboard_api.py` 将摘要反映到 `/monitoring/dashboard`。 ## 测试 · 测试 ``` # 全部 pytest # 按 marker pytest -m unit pytest -m integration # 외부 서비스 필요 pytest -m security pytest -m db pytest -m api ``` 将应用 `pyproject.toml` 中的 `addopts = "-v --tb=short"`。新测试请遵循 `app/tests/` 下的 `test_*.py` 命名约定。 ## 生产就绪 · 运营准备度 | 领域 / Area | 状态 / Status | | --- | --- | | 认证 / Auth | JWT + 装饰器/中间件已应用 | | 日志 / Logging | JSON 结构化 + 轮转 | | 指标 / Metrics | 暴露缓存、错误和系统计数器 | | 部署 / Deploy | 基于 Compose,提供验证脚本 | | 文档 / Docs | 本 README + `CHANGELOG.md` + `AGENTS.md` | | 运营阶段 / Stage | 内部 PoC → 逐步推广(Production-ready:验证中) | ## 维护者 · 负责人 - `OWNERS` 文件是代码所有权和审查者的 SSoT。 - 运营/发布决策由 `OWNERS` 中的 primary / secondary 组做出。 - 外部贡献流程遵循 `CONTRIBUTING.md`。 ## 更多文档 · 补充文档 | 文档 / Doc | 路径 / Path | 内容 / Contents | | --- | --- | --- | | 变更日志 / Changelog | `CHANGELOG.md` | 发行说明,迁移指南 | | 贡献指南 / Contributing | `CONTRIBUTING.md` | PR 流程,编码规约,审查 SLA | | 代码库规约 / Codebase rules | `AGENTS.md`(根目录) | 代理/审查者运营规则 | | 应用模块规约 / App rules | `app/AGENTS.md` | `app/` 目录下规约 | | 核心规约 / Core rules | `app/core/AGENTS.md` | 核心层规约 | | 许可证 / License | `LICENSE` | 许可证全文 | | 版本 / Version | `VERSION` | 当前语义版本 | | 健康检查 | `GET /api/system/health`(路由:`system_api.py`) | liveness/readiness | ## 帮助 · 帮助 - Bug 报告/功能请求:请使用仓库的 issue 追踪器。 - 安全问题:请私下联系 `OWNERS` 中的负责人。 - 内部聊天:在运营团队频道中搜索 `blacklist-service`。 - 详细运营程序:请遵循 `CHANGELOG.md` 中的迁移条目和 `app/AGENTS.md` 中的 runbook。
标签:Docker, Python, REST API, 威胁情报, 安全规则引擎, 安全运营, 安全防御评估, 开发者工具, 扫描框架, 无后门, 版权保护, 自定义脚本, 自定义请求头, 请求拦截, 逆向工具, 黑名单管理