跳转至

DIP1 工作日志 — 听写只读后门(F-DT-001~006)实施

DWLG 编号:DWLG-20260817-01 日期:2026-08-17 参与方:听码(WDE / DIP1 Code Agent) 关联文档DIP1-SPEC V2.1 §3.10DIP1-IMP V2.2 §一WDE 工作手册DT 听写工作手册 §4.4 关联 Issue:无(DIP1-IMP V2.2 新增实施任务,承接 PMG V9.1 听写真实用户测试职责)


一、任务背景

DIP1-SPEC V2.1(2026-08-17)新增 §3.10 听写只读后门功能(F-DT-001006,BD-01BD-06):仅供听写(DT)在真实用户测试时识别 bug 类型(代码问题 vs 环境/配置问题),普通真实用户无权访问。DIP1-IMP V2.2 明确该功能由听码实施(§B 后端业务阶段 +1 人天)。本日志记录完整实施与验证。

二、实现内容

2.1 产出文件

类型 文件 说明
配置 backend/app/infrastructure/config.py 新增 3 项:dt_backdoor_token(SecretStr,空=后门关闭)/ dt_backdoor_ip_whitelist(CIDR 逗号分隔,空=不限制)/ dt_backdoor_rate_limit_per_min(默认 60)
脱敏 backend/app/infrastructure/masking.py 新增公共模块:mask_phone(中间 4 位 *)/ mask_email / mask_token***),对齐 SPEC §3.10.2
迁移 backend/alembic/versions/0005_dt_backdoor_audit.py 新增 dt_backdoor_audit 表(BIGSERIAL 主键)+ 2 索引 + RLS 2 策略,down_revision=0004
模型 backend/app/infrastructure/db/models/dt.py DtBackdoorAudit(裸基类,无 updated_at,同 audit_logs 模式);注册入 models/init
中间件 backend/app/infrastructure/observability.py RequestLogMiddleware:全请求摘要写 Redis dt:calls:{METHOD}:{path}(LTRIM 10 + TTL 1h,ULID 归一化 :id);5xx 写 dt:errors(LTRIM 200);Redis 异常 fail-open
接口 backend/app/interfaces/api/dt.py 6 端点 + 认证依赖 get_dt_caller + 审计路由类 DtAuditedRoute
装配 backend/app/main.py 注册 RequestLogMiddleware + dt_router(prefix /api/dt不带 /v1,对齐 SPEC)
环境 .env.example 新增 DT_BACKDOOR_TOKEN / DT_BACKDOOR_IP_WHITELIST / DT_BACKDOOR_RATE_LIMIT_PER_MIN 3 项
测试 backend/tests/interfaces/test_dt_api.py 41 用例(详见 §三)
文档 docs/DIP1-API-OpenAPI规格.yaml → V2.1 新增 tag 10 + 6 path + DtBackdoorAuth;顺带修复 V2.0 遗留 YAML 语法错误(ExponentPushToken[xxxxxx] 未加引号导致整文件不可导入,HEAD 版本即存在)
文档 docs/DIP1-Schema数据库详细设计.md → V1.2 新增 §三补二 dt_backdoor_audit + RLS 5.8/5.9 + 迁移规则,表总数 22→23,RLS 7→9
文档 docs/DIP1-IMP-Code-Agent实施指南.md §7.1 新增 C-B9 行(🟢 100%)

2.2 访问控制落地(SPEC §3.10.2 七维度)

维度 实现
认证 Authorization: Bearer dt_xxx,与 settings.dt_backdoor_tokenhmac.compare_digest 常量时间比对;未配置则后门整体关闭
授权 无 Token → 401/1001;非 dt Token(含普通 JWT/TL Token)→ 403/1006
审计 DtAuditedRoute(APIRoute 子类)在 finally 中写审计行:token 哈希(SHA-256[:16])/端点/脱敏参数/响应摘要/耗时/客户端 IP;独立会话提交,失败仅记日志不阻断
网络限制 IP 白名单支持单 IP 与 CIDR;违规 → 403/3061
数据脱敏 手机号中间 4 位 *、邮箱用户名 *、Token 一律 ***;审计参数按 key 敏感词 + 值形态双重识别打码
速率限制 Redis INCR dt:rl:{token_hash} + EXPIRE 60s;超限 → 429/3060;Redis 异常 fail-open
只读保证 仅注册 GET 路由,POST/PUT/DELETE 由 FastAPI 自动 405(NFR-21 24 用例验证)

2.3 关键设计决策(技术实现细节,听码 100% 决策权范围)

  1. RLS 风格:SPEC §3.10.4 示例用 PG 角色 dt_backdoor/admin;实现沿用本库统一的 current_setting('app.current_role', true) 上下文变量风格(对齐 0001 §5 / audit_logs 策略),不新建 PG 角色。已在 Schema 文档 V1.2 注明。
  2. 5xx 采集:代码库无全局异常处理器/错误存储,新增轻量 RequestLogMiddleware(Redis list,fail-open)支撑 F-DT-003 最近调用 + F-DT-005 错误摘要;路径 ULID 归一化防 Redis key 膨胀。
  3. 审计范围:认证失败(401/403/429)请求不落审计(依赖在路由 handler 之前执行,且防暴力破解刷爆审计表);成功认证后的所有调用(含 4xx/5xx 业务错误)100% 落审计。
  4. 外部服务健康:dt/health 仅对 DB/Redis 做真实探测,R2/WhatsApp/Push 报配置就绪状态(configured/not_configured),保证 SPEC ≤500ms 要求、避免外呼副作用。
  5. sys_users 无 role 列:角色经 sys_user_roles 关联表 string_agg 聚合返回。

三、验证结果

验证项 结果
迁移 alembic upgrade head(0001→0005)成功;新表 + 2 索引 + 2 RLS 策略落库
新增测试 tests/interfaces/test_dt_api.py 41 passed, 0 failed:NFR-21 24 用例(6 端点 × GET/POST/PUT/DELETE)+ 认证授权 5 + IP 白名单(单 IP/CIDR)+ 限流 3060 + 6 端点功能 + NFR-22 审计落行 + NFR-23 脱敏 9 例(含会话端点响应体无手机号明文)
既有套件回归(domain + application + interfaces) 全部通过,0 failed
ruff(新增/修改文件) All checks passed(存量 6 项告警为既有文件,未代改)
mypy(新增 3 文件) no issues found(存量 36 项为既有基线,未新增)
OpenAPI YAML PyYAML 解析通过(修复遗留语法错误后),6 个 dt operationId 注册正确
手动冒烟 401/1001、403/1006、405、404/4001、审计 token 哈希落行均实测符合预期

四、状态矩阵更新

DIP1-IMP §7.1 矩阵变更: - 新增 C-B9(听写只读后门 1 人天):🟢 100%(证据:backend/app/interfaces/api/dt.py + alembic 0005 + 41 用例测试)

五、遗留事项与协作请求

  1. @听云(CROSS):生产/预发环境如需启用后门,请配置 3 项环境变量(DT_BACKDOOR_TOKEN 由 TL 签发、DT_BACKDOOR_IP_WHITELIST 建议配置听写运行环境 IP 段、DT_BACKDOOR_RATE_LIMIT_PER_MIN 默认 60),并对生产库执行 alembic upgrade head(0005)。不配置 Token 则后门保持关闭(安全默认)。
  2. @听写(INFO):后门用法:Authorization: Bearer <TL签发的dt_Token> 调用 /api/dt/health|config|api-meta/{path}|schema/{table}|errors|session/{user_id};端点语义见 OpenAPI V2.1 tag 10。
  3. 本地开发注意:当前 5432/6379 端口被 prod-site 容器占用,本次开发使用独立 dev 容器(PG:5433 / Redis:6380),测试需导出 DATABASE_URL/REDIS_URL 指向 5433/6380。

修订记录

版本 日期 修订人 修订内容
V1.0 2026-08-17 听码(WDE) 创建:听写只读后门 F-DT-001~006 完整实施记录(6 端点 + 审计表 + 中间件 + 41 用例 + 文档 V2.1/V1.2 同步)