# P3-WP04 边缘网关工程验证证据 验证日期:2026-08-09(Asia/Shanghai) ## 1. 结论和边界 当前结论为 `ENGINEERING_COMPLETE_ENTERPRISE_EDGE_UAT_BLOCKED`。本证据证明本地工程契约和受影响代码的定向测试,不证明生产就绪,不替代企业验收。未执行仓库全量回归;未连接真实企业来源;未使用企业 CA、企业网络区或企业代理;未取得网络/安全/法务签字。 外部输入状态: | 输入 | 状态 | 未完成证据 | |---|---|---| | enterprise_source_1 | `TBD_EXTERNAL` | 未提供批准来源、版本、规模、只读账号和样本 | | enterprise_source_2 | `TBD_EXTERNAL` | 未提供批准来源、版本、规模、只读账号和样本 | | network | `TBD_EXTERNAL` | 未提供企业网络区、exact egress、代理、DNS、CA/CRL 和抓包审批 | | security_legal | `TBD_EXTERNAL` | 未完成数据分级/保留、数据不出域和证书/发布流程签字 | ## 2. 已验证批次 所有批次均设置 `PYTHONDONTWRITEBYTECODE=1` 和 `PYTHONPATH=.`,只覆盖 P3-WP04 和直接受影响的 Runner/权限/OpenAPI 契约。 ### 批次 A:WP04 工程基线 ```text TEST_DATABASE_URL=postgresql://dataops:***@127.0.0.1:15432/dataops \ pytest -q tests/test_phase3_wp04_edge_gateway.py \ tests/security/test_phase3_wp04_data_boundary.py \ tests/integration/test_phase3_wp04_edge_gateway_postgres.py \ tests/integration/test_phase3_wp04_edge_agent.py \ tests/integration/test_phase3_wp04_nginx_mtls.py \ tests/test_phase3_wp04_production_runtime.py ``` 结果:`241 passed in 14.42s`。数据库 URL 在证据中脱敏;实际目标是本地 Docker PostgreSQL `127.0.0.1:15432/dataops`。 ### 批次 B:直接受影响 Runner 与权限 ```text pytest -q tests/runner/test_api.py tests/runner/test_replay_store.py \ tests/runner/test_task_tokens.py tests/runner/test_bootstrap.py \ tests/test_permission_matrix.py ``` 结果:`29 passed in 1.25s`。其中 Runner 19 项、权限矩阵 10 项;与批次 A 合计 270 项。Task4 规格整改后再次合并执行批次 A、Runner 和权限矩阵,结果为 `270 passed in 15.20s`,作为本轮最终 WP04 受影响工程基线;未执行仓库全量回归。 ### 批次 C:Task4 交付契约 ```text pytest -q tests/test_phase3_wp04_delivery_contract.py ``` RED:首次执行 `7 failed`,原因分别为 admin CLI、edge Compose、OpenAPI edge schemas、证据/运行手册尚不存在以及生成文件不一致。规格复核补充信任链要求后,新测试批次为 `9 failed, 2 passed`,准确暴露了 rollback 未绑定受控 bundle、runtime UID/GID/key 路径、签名撤销 envelope、OpenAPI mTLS/schema 和发布归档缺口。增加 tmpfs UID/GID 复用、过期/伪签名撤销和归档链接检查时,RED 为 `10 passed, 1 failed`,唯一失败是 tmpfs 仍硬编码 UID/GID;最终审计又用一个有效重签但 status 改变的同 release-id manifest 发现 replay digest 过窄,定向 RED 为 `1 failed, 10 deselected`,随后改为完整 manifest digest 绑定。第二轮复核用已有 history 加异内容 stale intent 得到 `1 failed, 10 deselected`,暴露 history 快速返回前未核验/清理 intent,随后补上严格等值验证、unlink 和 state 目录 fsync。 质量复核继续增加宽根拒绝、跨进程 fcntl lock、same-fd copy/hash、hardlink/竞态拒绝、正式三段版本、失败临时 bundle 清理、runtime parent owner 继承、真实 Edge 镜像、闭合 config schema、读者命令和归档摘要闭包。CLI 安全组先得到 `8 passed, 11 deselected`,release/rollback 安全组得到 `9 passed, 10 deselected`;控制面版本策略在 RED 中发现 6 个过宽版本全部被接受,修复后 `6 passed`。 最终交付契约与真实 Edge 运行时合跑:`33 passed in 17.12s`。已覆盖 init/CSR 的 runtime owner 与 0600/0700、真实容器 UID 读取只读 `secrets/client.key`、证书有效期/clientAuth/key-CSR-cert/CA/CRL 注册校验、固定注册材料 exact replay/conflict、幂等 pending 轮换、canonical Ed25519 撤销状态的过期/跨网关/伪签名拒绝与本地终态、发布受控 bundle、完整 manifest 重验签、同 release-id 任何完整 manifest 变化拒绝、artifact 验后篡改、错误 current/target、history 与 matching/mismatched stale intent、unlink/directory-fsync 故障恢复及下一次合法回滚、路径/符号链接/hardlink/宽根策略、正式三段版本和失败临时目录清理;同时覆盖 pull-only Compose、可构建发布归档、OpenAPI human bearer 与 machine mTLS+credential、大小写敏感键和最大递归深度的可执行 JSON Schema、闭合 edge config schema、可执行读者手册、源/发布 CLI 精确副本,以及归档内 OpenAPI/Failure JSON/SHA256/二进制与文本秘密扫描。 ### 批次 D:真实 Edge 镜像与运行时 ```text pytest -q tests/integration/test_phase3_wp04_edge_runtime.py ``` 普通受限沙箱首次得到 `1 failed, 1 passed`,失败只发生在 Docker buildx 写 `~/.docker/buildx/activity` 时被宿主沙箱拒绝,镜像代码尚未执行。允许 Docker 使用其 本机活动目录后最终结果纳入批次 C 的 33 项:实际构建 `Dockerfile.edge`,临时本地 CA/server/client/新鲜 server CRL 与 mTLS fake control 完成 heartbeat、reconcile,接收 Ed25519 签名且精确绑定的工程自检任务,经封闭 Runner 形成有界 `evidence` 事件并取得 exact ACK;在线替换 CRL 并撤销当前服务端证书后,下一次连接在不重启容器的情况下 立即失败并进入 degraded。无入站 port、日志/health 无 credential,SIGTERM 干净退出; 另验证 `CRL_CHECK_LEAF` 与 stale CRL fail-stop。 未连接真实企业来源、企业 CA 或企业网络。 ### 批次 E:OpenAPI、状态台账和静态门禁 - delivery 与真实 Edge runtime:`33 passed in 17.12s`;OpenAPI schema/安全组合定向已包含其中;生成器生成 444 operations 且与 `docs/architecture/OPENAPI.yaml` byte parity。 - P3-WP00 requirements 受影响语义:`11 passed, 1 deselected in 1.99s`;未选择项是会比较被 Git 忽略的既有 `__pycache__` 字节码的全目录测试,WP04 源码 parity 已用排除 `__pycache__` 的递归比较独立通过。 - 非 Docker 的 WP04、Agent、Runner、权限直接受影响批次:`229 passed in 5.30s`;真实 PostgreSQL 控制面批次:`36 passed in 8.32s`;与 delivery/runtime 33 项合计 `298 passed`。未执行仓库全量回归。 - Ruff:CLI、OpenAPI generator、Edge runtime/bootstrap/transport/agent、control-plane service、delivery/runtime tests 及 deployment mirrors 全部通过。 - `compileall`:使用 `/private/tmp/dataops-wp04-pyc` cache 前缀通过;没有向源码目录新增字节码。 - JSON/YAML:requirements、failure injection、OpenAPI、edge Compose 均解析通过。 - Compose:使用无秘密 `edge.env.example`、显式 runtime UID/GID 和 exact HTTPS origin 后,`docker compose config --quiet` 通过;真实 `nginx:alpine` 容器以配置 UID/GID 读取 CLI 生成的只读 client key 通过;真实 Edge image smoke 见批次 D,但未启动真实企业源。 - Migration:真实本地 PostgreSQL `alembic current` 返回 `20260809_479 (head)`。 - `app/`/`deployment/app/` 的 WP04 源文件与 migration 477/478/479 递归 parity 通过(排除运行时 `__pycache__`)。 - `git diff --check`、发布脚本 shell syntax、OpenAPI byte parity、发布归档 SHA-256 closure 和二进制/文本 secret scan 通过。扫描器拒绝 encrypted private key、PKCS#12、二进制载荷和明文 credential,并排除 `__pycache__`/字节码。测试中的私钥标记仅为拒绝规则夹具,不是秘密材料。 ## 3. 关键真实/模拟层次 - PostgreSQL:真实本地 Docker PostgreSQL,Alembic `20260809_479`,验证 migration 升降级、约束、并发、应用/证据 owner/runtime role 隔离和 signing authority 最小权限。不是企业数据库。 - Nginx mTLS:使用本机已有 `nginx:alpine` 镜像、临时本地 CA/服务端/有效/错误/撤销客户端证书和真实 CRL,实际 TLS handshake 验证无证书、错 CA、伪造 header、有效证书及 revoked 拒绝。不是企业 CA/CRL。 - 镜像能力:定向检查 backend migrator/runtime 与 runner 镜像构建契约、Compose target 和 migration/runtime credential 隔离;没有发布新生产镜像。 - Runner:真实本地 Runner API、bootstrap、task token、replay store 受影响契约;企业来源 handler 尚未接入。 - Edge agent:真实 disk SQLite、签名任务、策略、断网队列、reconcile、cancel、event ACK、artifact retention 与发布回滚的本地执行;网络 transport 为受控本地测试。 - Edge runtime:真实构建的 Edge 镜像实际运行 pull-only heartbeat/reconcile/pull 循环,接收一个 Ed25519 签名且精确绑定的 `quality-evaluation` 工程自检任务,经封闭 Runner 形成有界 `evidence` 事件并取得 exact ACK;其他来源任务仍默认拒绝。使用临时 mTLS 控制面和 server CRL,在线替换 CRL 并撤销当前服务端证书后下一次连接立即失败,证明 TLS 连接池已热重建;断网降级与 SIGTERM 已验证。企业来源 Runner handler 仍未配置,属于 `TBD_EXTERNAL`,本地 smoke 不把工程自检伪装为已接企业来源。 - Admin CLI:真实生成 3072-bit RSA private key/CSR,0600/0700、runtime UID/GID owner 校验、fsync+rename、证书/CSR/key/CA/CRL 匹配、Ed25519 revoke/release authority、受控 verified bundle 和 artifact SHA-256;故障注入覆盖 current 指针替换后的 directory-fsync 失败及幂等恢复,测试材料均为临时生成。 ## 4. 已证明的安全属性 1. 原始行、近期明细、restricted、credential、private key、SQL、任意 URL/命令/路径在出站边界默认拒绝,拒绝内容不持久化到控制面。 2. enrollment 失败绑定不消耗;token/credential 只以 hash 入库;generation/certificate/environment/zone/gateway 精确绑定;rotate/revoke 后旧身份失败。 3. stable event ID 的 exact replay 返回同一 ACK;变更 digest 冲突;task/event/cancel/revoke 并发由数据库锁与 lease fencing 线性化。 4. 任务和发布完整 Ed25519 authority 绑定 key-id、用途、策略、环境、网络区、deadline、artifact digest 和 rollback version;release-check 将 manifest/artifact 原子复制到受控 bundle,rollback 重新验证 current/target 签名与两个 artifact hash 后才提交指针;伪 verified JSON、验后篡改、过期、降级、replay change、路径穿越和符号链接失败。 5. Compose 无入站 control port,non-root、read-only、cap-drop ALL、no-new-privileges、CPU/内存/PID/日志上限和最小 RO/RW mounts。 6. 诊断、心跳、日志和 API 错误为有界安全摘要;响应 `Cache-Control: no-store`。 ## 5. 运行、故障和恢复证据索引 - 安装、CSR、注册、证书轮换/撤销、CRL、升级、回滚、v1→v2 drain gate、诊断、备份和恢复:`docs/runbooks/EDGE_GATEWAY_OPERATIONS.md`。 - 数据边界、身份、签名和 retention 架构:`docs/phase3/P3_WP04_EDGE_GATEWAY.md`。 - 每个故障注入的前置、步骤、安全边界、预期、证据、rollback 和状态:`docs/validation/P3_WP04_FAILURE_INJECTION.json`。 - OpenAPI:`docs/architecture/OPENAPI.yaml`,由 `scripts/generate_openapi.py` 再生。 ## 6. 尚未满足的企业完成门禁 必须在批准企业环境完成:两个真实来源的采集/画像/质量/血缘/受控查询;断网续跑和取消;真实网络抓包和出站网关审计;原始数据未经批准出域事件为 0;企业 CA/CRL 的注册、轮换和撤销;queue 备份恢复与升级/回滚演练;网络负责人和安全法务负责人签字。完成前,本工作包保持 `ENGINEERING_COMPLETE_ENTERPRISE_EDGE_UAT_BLOCKED`。