docs: 收尾同步——waf/smtp README、项目画像、测试套件与遗留模块标注

- waf/smtp README: 链路改 ca:8443 → gateway:8445,启动描述改 services.yaml
- profile/evaluation: 拓扑/请求链路/端口表/模块表同步,口径漂移项标记已解决
- tests/blackbox: README 与 config.py 标注测试条目→生产服务映射(保留历史条目名)
- static/dnfs/db/captcha/confs README 顶部加"已废弃"标注
This commit is contained in:
qing committed 2026-08-10 12:35:45 +00:00
1 parent ad5d91c47a
commit 2817dbbab2
11 files changed
+90 -73

No files matched your search

+2
View File
@@ -1,5 +1,7 @@
# CAPTCHA 验证码服务
> **已废弃**:生产已由 [captcha2](../captcha2/)(C++20 重写)平替,不再部署;本 README 为历史说明。
一个轻量级的图片验证码服务,基于自研 [pymsg](../pymsg/) 协议(TCP 长度前缀帧 + JSON),配合 Pillow 生成验证码图片。提供图片生成、Token 校验、健康检查三个路由,由 `gateway` 经 pymsg 调用并代理给浏览器。
服务由 `core`(PMC)的 `init.txt` 拉起,监听 `127.0.0.1:8009`(TCP),仅允许本机/内网调用。
+2
View File
@@ -1,5 +1,7 @@
# confs 统一配置服务(pymsg RpcServer/TCP)
> **已废弃**:配置分发已内嵌进 [core](../core/)(ConfsTask,--confs 8010),仅 `confs/configs/gateway.ini` 仍由其分发;本 README 为历史说明。
集中存放各微服务的配置文件,通过 pymsg RPC 协议分发给内部服务,替代各服务本地散落的 ini/json/yaml 配置,实现配置的统一管理与下发。
服务由 `core`(PMC)的 `init.txt` 拉起,监听 `127.0.0.1:8010`(TCP),仅允许本机调用。
+2
View File
@@ -1,5 +1,7 @@
# 通用数据库服务 db(pymsg/TCP + SQLAlchemy Core)
> **已废弃**:生产已由 [db2](../db2/)(C++20 重写)平替,不再部署;本 README 为历史说明。
一个安全的数据库访问服务。各业务服务通过自研 pymsg 协议(TCP 长度前缀帧 + JSON)发送结构化查询意图,db 翻译为 SQL 执行,全程参数绑定,业务侧无需直连数据库、无需手写 SQL。
## 功能特点
+2
View File
@@ -1,5 +1,7 @@
# dnfs — 树状网络文件系统
> **已废弃**:生产已由 [dnfs2](../dnfs2/)(C++20 重写)平替,不再部署;本 README 为历史说明。
Dendrachy Network File-System,基于父子关系(pid)组织的树状节点服务。
监听 `127.0.0.1:8006`,提供节点的增删改查,支持以 Base64 编码形式在 `content` 中存储文件数据。所有写操作需携带由 gateway 签发的 Token。
+2 -2
View File
@@ -18,14 +18,14 @@
2. **WAF 实际不拦截**:定位"唯一对外入口 + coraza",但 `waf/rules/local/custom.conf` 的 6 条 SecRule 全被注释、无 `crs/` 目录 → 实际仅 TLS 终止 + 响应头,SQLi/XSS/命令注入零防护。
3. **core 本地 root RCE**:`parse_data_from_mq` 对 list/kill/exec 未鉴权即经 `/bin/sh -c` 执行,且 core 以 root 运行。这是致命项却被标 `human_review_pending`。
4. **内部零信任缺失**:pymsg 无握手/无鉴权/明文无 TLS,db `execute` 接受任意 action/table/where,完全依赖 127.0.0.1 隔离。
5. **端口口径漂移**:MODULES.md 记 gateway:8443,README 记 8445,未同步。
5. ~~**端口口径漂移**:MODULES.md 记 gateway:8443,README 记 8445,未同步~~ → ✅ 2026-08-10 已统一(ca:8443 → gateway:8445,含 MODULES.md/ARCHITECTURE.md/各模块 README)。
6. **密钥变量静默失效**:`.env.example` 写 `OPENAI_API_KEY`,代码读 `DEEPSEEK_API_KEY`。
7. **质量债**:v1/v2 双实现(db/db2、dnfs/dnfs2、pymsg/libmsg…)并存,无单元测试、无 CI(无 `.github/workflows`),回归与语义漂移风险高。
8. **部署半成品**:docker-compose 仅纳 3 服务,生产以 systemd 为准——容器化链路不完整。
## 缺证项(需人工复核)
- 3 高危是否在 2026-08-08 之后的提交中已修复(研究报告基于快照,文档未给代码证据)。
- docker-compose 补全状态、MODULES.md 端口同步状态。
- docker-compose 补全状态;~~MODULES.md 端口同步状态~~(✅ 2026-08-10 已同步)。
## 优先级建议(收口路径)
- P0:启用 WAF 规则 + 补 `crs/`(直击高危 1)。
+35 -33
View File
@@ -11,8 +11,8 @@
本文档将 Blackbird(仓库名 `micro_servers`,框架名 **UniServe Framework**)过去分散在 40+ 篇说明、审计与报告中的信息,整合为一份可按章节查阅的项目资料。
- **事实边界**:所有模块职责、端口、协议描述以主 `README.md`(2026-08-10 口径,已含 `ca` 中央认证模块)为准;安全发现以 `blackbird_research_report.md`(2026-08-08 快照)与 `docs/security/` 逐模块审计为准。
- **口径差异提醒**:`docs/MODULES.md` 仍记 `gateway:8443`,属 `ca` 认证前置化之前的旧口径;当前拓扑为 `waf:443 → ca:8443 → gateway:8445`,以主 `README.md` 为准。
- **事实边界**:所有模块职责、端口、协议描述以主 `README.md`(2026-08-10 口径,已含 `ca` 中央认证模块与 `services.yaml` 编排)为准;安全发现以 `blackbird_research_report.md`(2026-08-08 快照)与 `docs/security/` 逐模块审计为准。
- **口径说明**:当前拓扑为 `waf:443 → ca:8443 → gateway:8445 → 内部服务`;编排清单为 `core/services.yaml`(2026-08 起 init.txt 已废弃)。
- **质量状态约定**:基于文档推断与整合的结论标记为 `advisory`;涉及"代码是否已修复某高危项"的判断标记为 `human_review_pending`,因其需对照最新提交逐文件核验。
---
@@ -28,7 +28,7 @@ Blackbird 是一套 **DIY 的轻量级"进程托管式微服务"框架**,用 C
- **能力拆分但重量极轻**:保留微服务"拆分、统一入口、安全分层、可观测"的真正收益,砍掉服务注册发现、容器编排、消息总线等重型组件。
- **你完全掌控**:数据自托管、代码 MIT 开源,不绑定任何云厂商。
- **多语言自由组合**:核心用 C++(性能/系统),胶水与业务用 Python(效率),边缘网关用 Go(coraza 生态),硬件控制用仓颉(树莓派)。
- **进程托管式编排**:一个 `core` 进程当"保姆",读 `init.txt` 拉起并守护所有子服务。
- **进程托管式编排**:一个 `core` 进程当"保姆",读 `services.yaml` 拉起并守护所有子服务。
### 1.3 适用对象
@@ -53,7 +53,7 @@ Blackbird 是一套 **DIY 的轻量级"进程托管式微服务"框架**,用 C
### 2.1 UniServe 架构定义
以 `core`(C++20)为统一宿主进程,读取 `init.txt` 并经 shell 拉起多语言微服务。各服务通过内部 HTTP 对外暴露业务能力,通过 `pymsg/TCP`(自研 RPC)做数据访问与日志汇聚。
以 `core`(C++20)为统一宿主进程,读取 `services.yaml` 声明式配置并经 shell 拉起多语言微服务。各服务通过内部 HTTP 对外暴露业务能力,通过 `pymsg/TCP`(自研 RPC)做数据访问与日志汇聚。
### 2.2 当前拓扑(含 ca 认证前置化)
@@ -61,41 +61,42 @@ Blackbird 是一套 **DIY 的轻量级"进程托管式微服务"框架**,用 C
┌──────────────────────────────────────────────┐
│ core (PMC / Nidus) │
│ 进程托管服务 · 监听 :5200 (HTTP 管理接口) │
│ 读取 init.txt 拉起并守护下列子进程 │
│ 读取 services.yaml 拉起并守护下列子进程 │
│ 内嵌 confs :8010 (仅 gateway.ini 分发) │
└───────────────┬──────────────────────────────┘
│ 启动 / 守护
┌──────────────┬──────────────┼──────────────┬──────────────────┬──────────────┐
▼ ▼ ▼ ▼ ▼ ▼
┌──────────────┐ ┌─────────┐ ┌──────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ redirect80 │ │ waf │ │ ca │ │ gateway │ │ fsys │ │ dnfs │
│ redirect80 │ │ waf │ │ ca │ │ gateway │ │ fsys │ │ dnfs2 │
│ :80 重定向 │ │ :443 入口│ │ :8443 认证│ │ :8445 纯转发 │ │ :9200 前端 │ │ :8006 树状 │
└──────────────┘ └────┬────┘ └────┬─────┘ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘
│ TLS终止 │ 鉴权+前置 │ 反向代理 │ 代理笔记 │ pymsg
│ coraza │ 转发 │ (loopback) │ │
└──────────┴─────►───────┴──────────────────┴─────────────────┘
认证链路(v0.9.0 起): waf:443 ──HTTP──► ca:8443 (认证+前置转发) ──HTTP──► gateway:8445 (纯转发, 仅 loopback) ──► 内部服务
日志链路: 各服务 ──(log_client, pymsg)──► db:8005 (Logs 表,fail-safe 静默丢弃)
配置链路: 业务服务 ──(pymsg get)──► confs:8010(mtime 自动重载)
日志链路: 各服务 ──(log_client, pymsg)──► db2:8005 (Logs 表,fail-safe 静默丢弃)
配置链路: gateway ──(pymsg get)──► core:8010 内嵌 confs(mtime 自动重载);其余服务配置纯 CLI 传递
```
> `db2` / `dnfs2` 分别是 `db` / `dnfs` 的 C++20 重实现,架构位置与 Python 版一致,接口兼容可平替。`BotOps`、`lci`、`bot4cj` 不在主图中(终端前端 / 帧缓冲界面 / 树莓派硬件,不联网)。
> `db2` / `dnfs2` / `fsys` / `captcha2` 分别是 `db` / `dnfs` / `static` / `captcha` 的 C++20 重实现,架构位置与 Python 版一致,接口兼容可平替;`confs` 已内嵌进 `core`。`BotOps`、`lci`、`bot4cj` 不在主图中(终端前端 / 帧缓冲界面 / 树莓派硬件,不联网)。
### 2.3 core 进程托管模型
- 可执行文件 `nidus.out`,以 systemd 单元 `Nidus.service` 常驻(崩溃守护由 systemd 负责,core 自身不含自动重启逻辑)。
- 两种模式:命令行子系统(`--send/--exec/--list/--kill`)与 HTTP 伺服器(`--serve <port>`)。
- 经命名管道(Pipe)与消息队列(Mq)实现进程间通信;读 `init.txt` 自启动列表,按行拉起 ai_review / db / dnfs / smtp / static / waf / ca / gateway / captcha / aibox。
- 经命名管道(Pipe)与消息队列(Mq)实现进程间通信;读 `services.yaml` 自启动清单(`-i .`),按声明顺序拉起 db2 / ai_review / dnfs2 / smtp / fsys / waf / ca / gateway / captcha2 / aibox / redirect80。
### 2.4 请求链路(8 步)
1. 客户端以 HTTP 访问 `:80`,由 `redirect80` 重定向到 HTTPS `:443`(GET/HEAD 301,其余 308 保留 body)。
2. 所有请求先打到 `waf:443`,终止 TLS、运行 coraza 规则,命中即 403。
3. 未命中请求以明文 HTTP 转发到 `ca:8443`,透传 `X-Forwarded-For` / `X-Forwarded-Proto`。
4. `ca` 对 `/login`、`/register` 做账号鉴权(PBKDF2 + RSA Token + 可选 CAPTCHA + 速率限制;注册经 pymsg/TCP 调 `smtp:8008` 发码),用户数据走 `db:8005`。
5. 其余请求携带 Token,经 `ca` 验签后注入 `X-Auth-User` 转发到 `gateway:8445`(仅 loopback,仅做存在性检查),再由 gateway 反代到 `Proxy.opened` 放开的内部服务(`fsys:9200` / `dnfs:8006`)。
6. `db:8005` 与 `ai_review:8007` 在 `Proxy.closed` 中,仅允许内部调用。
7. `dnfs` 处理节点 CRUD 时经 pymsg/TCP 调 `db` 持久化,新增节点前调 `ai_review` 审核。
8. 各服务经 `log_client.py` 异步批量推送日志到 `db` 的 `Logs` 表(fail-safe)。
4. `ca` 对 `/login`、`/register` 做账号鉴权(PBKDF2 + RSA Token + 可选 CAPTCHA + 速率限制;注册经 pymsg/TCP 调 `smtp:8008` 发码),用户数据走 `db2:8005`。
5. 其余请求携带 Token,经 `ca` 验签后注入 `X-Auth-User` 转发到 `gateway:8445`(仅 loopback,仅做存在性检查),再由 gateway 反代到 `Proxy.opened` 放开的内部服务(`fsys:9200` / `dnfs2:8006`)。
6. `db2:8005` 与 `ai_review:8007` 在 `Proxy.closed` 中,仅允许内部调用。
7. `dnfs2` 处理节点 CRUD 时经 pymsg/TCP 调 `db2` 持久化,新增节点前调 `ai_review` 审核。
8. 各服务经 `log_client.py` 异步批量推送日志到 `db2` 的 `Logs` 表(fail-safe)。
### 2.5 端口一览
@@ -106,13 +107,13 @@ Blackbird 是一套 **DIY 的轻量级"进程托管式微服务"框架**,用 C
| 8443 | ca | 127.0.0.1 | 中央认证(内部 HTTP) |
| 8445 | gateway | 127.0.0.1 | 纯转发反代(loopback) |
| 5200 | core | 127.0.0.1 | PMC HTTP 管理接口 |
| 8010 | core(内嵌 confs) | 127.0.0.1 | 统一配置(pymsg/TCP,仅 gateway.ini) |
| 9200 | fsys | 127.0.0.1 | 前端托管(经 gateway 代理) |
| 8006 | dnfs/dnfs2 | 127.0.0.1 | 树状菜单(经 gateway 代理) |
| 8005 | db/db2 | 127.0.0.1 | 数据库服务(pymsg/TCP) |
| 8006 | dnfs2 | 127.0.0.1 | 树状菜单(经 gateway 代理) |
| 8005 | db2 | 127.0.0.1 | 数据库服务(pymsg/TCP) |
| 8007 | ai_review | 127.0.0.1 | AI 审核(仅内部调用) |
| 8009 | captcha | 127.0.0.1 | 验证码(经 gateway 代理) |
| 8009 | captcha2 | 127.0.0.1 | 验证码(经 ca 代理) |
| 8008 | smtp | 127.0.0.1 | 邮件服务(仅内部调用) |
| 8010 | confs | 127.0.0.1 | 统一配置(pymsg/TCP) |
| 8765 | aibox | 127.0.0.1 | AI 智能体(WebSocket,独立产品) |
---
@@ -123,7 +124,7 @@ Blackbird 是一套 **DIY 的轻量级"进程托管式微服务"框架**,用 C
| 模块 | 语言 | 端口 | 职责 |
|------|------|------|------|
| **core** | C++20 | 5200 | 进程托管服务 PMC/Nidus,读 `init.txt` 拉起守护子进程,提供 HTTP 管理接口(`--send/--exec/--list/--kill/--serve`) |
| **core** | C++20 | 5200 / 8010 | 进程托管服务 PMC/Nidus,读 `services.yaml` 拉起守护子进程,提供 HTTP 管理接口(`--send/--exec/--list/--kill/--serve`),内嵌 confs(`--confs 8010`) |
核心设计:systemd 常驻、root 运行(见第 5 章风险)、Pipe/Mq 进程通信、无内置看门狗(崩溃自愈依赖 systemd)。
@@ -144,20 +145,21 @@ Blackbird 是一套 **DIY 的轻量级"进程托管式微服务"框架**,用 C
| 模块 | 语言 | 端口 | 职责 |
|------|------|------|------|
| **fsys**(原 static) | Python/Flask | 9200 | 前端托管:社区首页/静态页/媒体流/文件浏览;**2026-08 由 static 重命名为 fsys**(core/init.txt 已同步),过渡期仍保留 legacy `static/` 目录 |
| **dnfs** | Python/Flask | 8006 | 树状菜单(Dendrachy Network File-System),基于 pid 的节点树 CRUD,新增节点前调 ai_review 审核 |
| **dnfs2** | C++20 | 8006 | dnfs 的 C++20 重实现(libhttp + libmsg),接口完全兼容,修复 P0/P1(fail-closed 验签/所有权校验/脱敏) |
| **fsys** | C++20 | 9200 | 前端托管:社区首页/静态页/媒体流/文件浏览;static 的 C++ 重写(legacy `static/` 目录保留,不再部署) |
| **dnfs** | Python/Flask | 8006 | 树状菜单(Dendrachy Network File-System),基于 pid 的节点树 CRUD,新增节点前调 ai_review 审核(遗留,已由 dnfs2 平替) |
| **dnfs2** | C++20 | 8006 | dnfs 的 C++20 重实现(libhttp + libmsg),接口完全兼容,修复 P0/P1(fail-closed 验签/所有权校验/脱敏);支持 js/file/style/theme 特殊节点 |
| **ai_review** | Python/Flask | 8007 | AI 内容审核,DeepSeek + ChromaDB RAG(色情/违禁药/赌博/诈骗/仇恨暴力),fail-closed 宁可误拦 |
### 3.4 基础设施 / 支撑服务(仅内部调用)
| 模块 | 语言 | 端口 | 职责 |
|------|------|------|------|
| **db** | Python/pymsg | 8005 | 通用数据库服务,SQL-over-TCP(SQLAlchemy Core 参数化防注入),内置集中式日志(Logs 表 + 自动清理) |
| **db** | Python/pymsg | 8005 | 通用数据库服务,SQL-over-TCP(SQLAlchemy Core 参数化防注入),内置集中式日志(Logs 表 + 自动清理)(遗留,已由 db2 平替) |
| **db2** | C++20 | 8005 | db 的 C++20 重实现(libmsg + boost::json + libsqlite3),`execute` 路由/where 语法/响应格式对齐,可平替 |
| **confs** | Python/pymsg | 8010 | 统一配置分发,集中存放各服务配置(`confs/configs/`),内存缓存 + mtime 自动重载,路径遍历防护 |
| **smtp** | Python/pymsg | 8008 | 邮件服务,注册邮箱验证码后端(send_email/verify_email/health),6 位码内存存储、冷却/限流/熔断 |
| **captcha** | Python/pymsg | 8009 | 验证码服务,图形验证码(一次性、5 分钟过期),经 ca 的 `GET /captcha/image` 代理给浏览器 |
| **confs** | Python/pymsg | 8010 | 统一配置分发(遗留,已内嵌进 core 的 ConfsTask);`confs/configs/` 现仅剩 `gateway.ini` 仍由 confs 分发 |
| **smtp** | Python/pymsg | 8008 | 邮件服务,注册邮箱验证码后端(send_email/verify_email/health),6 位码内存存储、冷却/限流/熔断(smtp3 C++ 重写待上线) |
| **captcha** | Python/pymsg | 8009 | 验证码服务,图形验证码(一次性、5 分钟过期),经 ca 的 `GET /captcha/image` 代理给浏览器(遗留,已由 captcha2 平替) |
| **captcha2** | C++20 | 8009 | captcha 的 C++20 重实现(pymsg),路由 image/verify/health 对齐 |
### 3.5 AI 智能体与前端
@@ -271,21 +273,21 @@ bash _inst.sh
### 6.3 运行
`init.txt` 自启动顺序重要(redirect80 → waf → gateway → …)。启动 core:
`services.yaml` 自启动顺序重要(db2 → ai_review → dnfs2 → smtp → fsys → waf → ca → gateway → captcha2 → aibox → redirect80)。启动 core:
```bash
systemctl start Nidus # 或 bash core/_run.sh
```
对外入口:`https://<host>:443`(waf 终止 TLS 后转发)。
对外入口:`https://<host>:443`(waf 终止 TLS 后转发到 ca)。
### 6.4 WAF 与 gateway 协作
### 6.4 WAF 与 ca 协作
启用 WAF 后证书从 gateway 迁到 waf:`cp gateway/full_chain.crt gateway/server.key waf/certs/`。gateway 改内部 HTTP 模式(`tls=off`、`address=127.0.0.1`、`port=8443`→现 8445)。独立部署(不用 WAF)时 gateway 自行 `tls=on`、`port=443`、`address=0.0.0.0`。
启用 WAF 后证书从 gateway 迁到 waf:`cp gateway/full_chain.crt gateway/server.key waf/certs/`。ca 改内部 HTTP 模式(`core/services.yaml` 中 `--host 127.0.0.1`、`--port 8443`)。独立部署(不用 WAF)时把 waf 从 `services.yaml` 移除、ca 的 `--port` 设为 443。
### 6.5 容器化现状
`docker-compose.yml` 的 services 块**仅纳入 db / ai_review / dnfs 三个服务**(另含 networks 与 volumes),core/waf/gateway/fsys/confs/captcha/smtp 未纳入 → 编排不完整。生产部署当前以 systemd 链路为准。
`docker-compose.yml` 的 services 块**仅纳入 db / ai_review / dnfs 三个服务**(另含 networks 与 volumes),core/waf/ca/gateway/fsys/captcha2/smtp 未纳入 → 编排不完整。生产部署当前以 systemd 链路为准。
---
@@ -346,7 +348,7 @@ Gateway v0.8.0 修复 P0 后,**安全评级 B+ → A-**;随 ca 引入与 C++
| docker-compose 仅 3 服务,不完整 | P2 | `advisory` | 研究报告 |
| 无单元测试 / 无 CI | P2 | `advisory` | 研究报告 |
| v1/v2 双实现维护成本 | 结构性 | `advisory`(建议收口合并) | 研究报告 |
| 文档口径差异(MODULES 记 gateway:8443) | 低 | `advisory`(以 README 为准) | 本文档核实 |
| 文档口径差异(MODULES 记 gateway:8443) | 低 | ✅ 已同步(2026-08-10 统一为 ca:8443 → gateway:8445) | 本文档核实 |
### 建议交付清单
+5 -5
View File
@@ -2,12 +2,12 @@
基于自研 [pymsg](../pymsg/) 协议(TCP 长度前缀帧 + JSON)的邮箱验证码服务,通过 SMTP_SSL 发送 6 位数字验证码,支持发送冷却和防暴力枚举。
服务由 `core`(PMC)的 `init.txt` 拉起,监听 `127.0.0.1:8008`(TCP),仅允许本机调用。`gateway` 在 `/register` 流程中经 pymsg 调用本服务完成邮箱验证。
服务由 `core`(PMC)经 `services.yaml` 拉起,监听 `127.0.0.1:8008`(TCP),仅允许本机调用。`ca` 在 `/register` 流程中经 pymsg 调用本服务完成邮箱验证。
## 架构
```
gateway :8443 (注册流程)
ca :8443 (注册流程)
│ pymsg TCP
▼
smtp :8008 (MsgServer)
@@ -135,9 +135,9 @@ python3 smtp_v2.py --addr 127.0.0.1 --port 8008
## 集成关系
- 由 `core` 通过 `init.txt` 拉起的 `bash _run.sh` 守护运行。
- `gateway` 在 `/register` 时经 pymsg 调 `send_email` 发送验证码,调 `verify_email` 校验。需在 gateway 的 `example.ini` 中启用邮箱验证功能。
- 日志通过 `log_client.py` 异步批量推送至 db:8005 的 Logs 表(缓冲 50 条 / 2 秒)。
- 由 `core` 经 `services.yaml` 拉起的 `bash _run.sh` 守护运行。
- `ca` 在 `/register` 时经 pymsg 调 `send_email` 发送验证码,调 `verify_email` 校验。需在 `core/services.yaml` 的 ca 条目 args 中传入 `--smtp-host/--smtp-port` 启用邮箱验证功能。
- 日志通过 `log_client.py` 异步批量推送至 db2:8005 的 Logs 表(缓冲 50 条 / 2 秒)。
## 项目结构
+2
View File
@@ -1,5 +1,7 @@
# static — 前端托管服务
> **已废弃**:生产已由 [fsys](../fsys/)(C++20 重写)平替,不再部署;本 README 为历史说明。
基于 Flask 的轻量级文件托管与前端页面服务,监听 `127.0.0.1:9200`。
承载"树状菜单"社区的全部前端页面,同时提供文件浏览与流媒体播放能力。
+22 -20
View File
@@ -29,18 +29,18 @@ tests/blackbox/
## 覆盖的用户旅程
### 1. 注册与登录 (gateway + captcha + smtp)
### 1. 注册与登录 (ca + captcha2 + smtp)
```
用户访问 captcha:8009 获取图形验证码
用户访问 captcha2:8009 获取图形验证码
→ 提交 captcha_token + answer 校验
→ 访问 smtp:8008 发送邮箱验证码
→ 提交 email + code 完成邮箱验证
→ 访问 gateway:8443 POST /register 注册账号
→ 访问 gateway:8443 POST /login 登录获取 Token
→ 使用 Token 通过 gateway 代理访问后端服务
→ 访问 ca:8443 POST /register 注册账号
→ 访问 ca:8443 POST /login 登录获取 Token
→ 使用 Token 通过 ca → gateway:8445 代理访问后端服务
```
### 2. 笔记管理 (dnfs + ai_review + db)
### 2. 笔记管理 (dnfs2 + ai_review + db2)
```
已登录用户携带 Bearer Token
→ POST /add_note 创建笔记(内容经 ai_review:8007 审核)
@@ -56,7 +56,7 @@ tests/blackbox/
提交误判反馈 → RAG 知识库更新
```
### 4. 集中日志 (db)
### 4. 集中日志 (db2)
```
各服务通过 /log/ingest 推送日志
→ /log/query 按条件查询
@@ -64,7 +64,7 @@ tests/blackbox/
→ /log/purge 按时间清理
```
### 5. 前端静态服务 (static)
### 5. 前端静态服务 (fsys)
```
访问首页 → 返回 login.html
访问文件浏览 → /api/filelist 返回目录结构
@@ -74,7 +74,7 @@ tests/blackbox/
### 6. WAF 安全防护 (waf)
```
正常请求 → 通过代理到达 gateway
正常请求 → 通过代理到达 ca
SQL 注入载荷 → 返回 403 blocked by WAF
XSS 跨站脚本 → 返回 403
命令注入 → 返回 403
@@ -102,20 +102,22 @@ python3 test_runner.py --list
## 服务端口默认值
| 服务 | 默认端口 | 绑定地址 |
|------|---------|---------|
| gateway | 8443 | 127.0.0.1 |
| static | 9200 | 127.0.0.1 |
| dnfs | 8006 | 127.0.0.1 |
| db | 8005 | 127.0.0.1 |
| ai_review | 8007 | 127.0.0.1 |
| captcha | 8009 | 127.0.0.1 |
| smtp | 8008 | 127.0.0.1 |
| waf | 443 | 0.0.0.0 |
| 测试条目 | 目标生产服务 | 默认端口 | 绑定地址 |
|------|---------|---------|---------|
| gateway(认证) | ca | 8443 | 127.0.0.1 |
| static | fsys | 9200 | 127.0.0.1 |
| dnfs | dnfs2 | 8006 | 127.0.0.1 |
| db | db2 | 8005 | 127.0.0.1 |
| ai_review | ai_review | 8007 | 127.0.0.1 |
| captcha | captcha2 | 8009 | 127.0.0.1 |
| smtp | smtp | 8008 | 127.0.0.1 |
| waf | waf | 443 | 0.0.0.0 |
> 测试条目名沿用历史命名(gateway/static/dnfs/db/captcha),实际命中生产对应端口上的 C++20 重写服务;`config.py` 中 description 已标注映射。
## 注意事项
- 测试依赖服务运行中,请先通过 `core/init.txt` 启动全部服务
- 测试依赖服务运行中,请先通过 `core` 启动全部服务(`systemctl start Nidus` 或 `bash core/_run.sh`,按 `core/services.yaml` 拉起)
- 注册测试会创建真实数据库记录,测试完成后可手动清理
- SMTP 测试需要真实的邮件服务配置,若未配置则相关测试标记为 SKIP
- WAF 测试需要服务监听 443 端口(可能需要 sudo)
+5 -5
View File
@@ -10,21 +10,21 @@ SERVICES = {
"name": "gateway",
"host": "127.0.0.1",
"port": 8443,
"description": "应用网关 (认证+反向代理)",
"description": "中央认证 ca :8443 (认证+前置转发,原 gateway 认证职责;gateway 纯转发在 8445)",
"test_file": "test_gateway.py",
},
"static": {
"name": "static",
"host": "127.0.0.1",
"port": 9200,
"description": "前端静态服务 (文件托管+视频流)",
"description": "前端托管 fsys :9200 (文件托管+视频流,static 的 C++ 重写)",
"test_file": "test_static.py",
},
"dnfs": {
"name": "dnfs",
"host": "127.0.0.1",
"port": 8006,
"description": "树状笔记服务 (CRUD+内容审核)",
"description": "树状笔记 dnfs2 :8006 (CRUD+内容审核,dnfs 的 C++ 重写)",
"test_file": "test_dnfs.py",
},
"db": {
@@ -32,7 +32,7 @@ SERVICES = {
"host": "127.0.0.1",
"port": 8005,
"protocol": "pymsg",
"description": "通用数据库服务 (CRUD+集中日志)",
"description": "通用数据库 db2 :8005 (CRUD+集中日志,db 的 C++ 重写)",
"test_file": "test_db.py",
},
"ai_review": {
@@ -46,7 +46,7 @@ SERVICES = {
"name": "captcha",
"host": "127.0.0.1",
"port": 8009,
"description": "验证码服务 (图片生成+校验)",
"description": "验证码 captcha2 :8009 (图片生成+校验,captcha 的 C++ 重写)",
"test_file": "test_captcha.py",
},
"smtp": {
+11 -8
View File
@@ -1,9 +1,9 @@
# waf — Web 应用防火墙网关
基于 Go + [coraza](https://github.com/corazawaf/coraza) 的 WAF 网关,部署在 `gateway` 之前,终止 TLS 并按 SecLang 规则库匹配请求,未命中则转发到 gateway。
基于 Go + [coraza](https://github.com/corazawaf/coraza) 的 WAF 网关,作为唯一对外入口,终止 TLS 并按 SecLang 规则库匹配请求,未命中则转发到 ca(`ca:8443` 认证后由 `gateway:8445` 纯转发)。
```
客户端 ──HTTPS──▶ waf:443 (终止 TLS + coraza 规则匹配) ──明文 HTTP──▶ gateway:8443 (鉴权 + 反代)
客户端 ──HTTPS──▶ waf:443 (终止 TLS + coraza 规则匹配) ──明文 HTTP──▶ ca:8443 (认证 + 前置转发) ──▶ gateway:8445 (纯转发) ──▶ 内部服务
```
## 为什么是 Go
@@ -11,7 +11,7 @@
- `coraza-waf/coraza` 是 ModSecurity SecLang 的 Go 实现,100% 兼容 OWASP CRS v4
- `net/http/httputil.ReverseProxy` 标准库反向代理,零第三方依赖
- goroutine + net/http 吞吐量比 Python 高一个数量级
- `go build` 出单二进制,`core/init.txt` 直接拉起
- `go build` 出单二进制,由 `core` 经 `services.yaml` 拉起
## 极客友好的规则系统
@@ -182,17 +182,20 @@ bash _run.sh
## 接入 core 自启动
在 `core/init.txt` 增加:
在 `core/services.yaml` 增加:
```
bash /opt/micro_servers/waf/_run.sh
```yaml
- name: waf
cmd: bash /opt/micro_servers/waf/_run.sh
args: ["--instance", "waf", "--log-level", "info"]
depends_on: [ca, gateway]
```
并把 `gateway` 改为内部 HTTP 端口(不再监听 443)。
并把 `ca` 改为内部 HTTP 端口(不再监听 443)。
## 安全响应头
WAF 在边缘层统一注入安全响应头([proxy.go:54-77](internal/proxy/proxy.go#L54-L77) `setSecurityHeaders`),覆盖所有出站响应(包括正常转发、命中拦截、上游 502)。下游服务(static/dnfs 等)的同名头会被 WAF 覆盖,避免 CSP 绕过。
WAF 在边缘层统一注入安全响应头([proxy.go:54-77](internal/proxy/proxy.go#L54-L77) `setSecurityHeaders`),覆盖所有出站响应(包括正常转发、命中拦截、上游 502)。下游服务(fsys/dnfs2 等)的同名头会被 WAF 覆盖,避免 CSP 绕过。
| Header | 值 | 说明 |
|--------|----|------|