[SEC] 建立三项目独立机器身份与安全传输边界 #151

Closed
opened 2026-08-29 21:04:54 +08:00 by ila · 5 comments
Owner

状态

已完成(2026-08-31,用户验收通过)

基本信息

  • 类型:安全 / 跨项目协调
  • 主项目:YoVision
  • 主 agent:单一 coordination agent
  • 所属 Epic:#7
  • 所属 MVP:#156
  • 来源:#124、PR-BND-003、NFR-002/NFR-003
  • 生产者/调用方:Sense、Brain 的独立实例
  • 消费者/被调用方:Sense、Brain、Bell 的受控机器接口
  • 前置:#8 已验收;实施前确认认证机制、证书/密钥生命周期和威胁边界
  • 契约事实源:contracts/machine-identity/v1/**、contracts/transport/v1/**

目标

为三端 connector 建立按产品和实例隔离的机器身份、最小权限、传输认证、轮换/吊销与审计边界,禁止复用管理员密码、浏览器 JWT/Cookie 或共享数据库角色。

已确认安全设计门禁

  • 每个部署实例使用独立 machine principal、audience 和最小 scope;Sense/Bell 用户身份永不跨产品传播,Brain 不拥有交互式用户。
  • 凭据只从仓库外安全配置读取;示例只含变量名。日志、错误、工单和审计不得保存 secret、私钥或完整认证头。
  • 在实施前从 mTLS 或短期签名机器令牌中确认一种主机制,并明确签发、存储、轮换、吊销、时钟偏差、重放防护和应急回退。
  • 传输必须有明确超时、请求大小、重试分类和 request/correlation ID;不得使用 query token。
  • 身份协议与三个产品的 adapter 分开映射,不共享用户表、JWT secret、Cookie、Casbin 策略或数据库模型。

非目标

不建立统一用户中心,不传递网页登录态,不共享摄像头凭据,不实现业务事件/配置字段,不修改 GoAdmin 登录机制,不接管操作系统账户。

精确 write_paths

  • contracts/machine-identity/v1/**
  • contracts/transport/v1/**
  • contracts/tests/machine-identity-v1/**
  • Sense/server/app/sense/integration/machine_identity/**
  • Brain/src/yovision_brain/integration/machine_identity/**
  • Brain/pyproject.toml(仅增加并冻结 Ed25519 所需的 cryptography==50.0.1 运行依赖)
  • Bell/server/app/bell/integration/machine_identity/**

禁止写入:其他产品业务目录、其他 contracts/**、根级部署、真实配置、docs/**。

验收标准

  • 威胁边界和主认证机制经人工确认
  • 三端独立 principal/audience/scope,越权、错 audience、过期、重放和已吊销身份均拒绝并脱敏审计
  • 凭据仓库外管理,示例、日志、响应和构建产物无 secret
  • 轮换不中断已确认兼容窗口;吊销与回退步骤可验证
  • 不接受管理员密码、浏览器 JWT/Cookie 或其他产品用户身份
  • 三端机器接口认证测试和传输降级测试通过

验证

威胁模型检查、三端单测/集成、错身份/重放/过期/轮换/吊销测试、秘密扫描、日志脱敏和契约兼容测试。

风险与回退

属于高风险安全修改。方案未确认不得编码;回退关闭跨项目 connector 并恢复三端独立运行,不降级为共享管理员身份或明文 token。

设计与文档影响

非 UI 任务,以安全架构和流程设计为确认门禁;完成后更新 Architecture、Business-Rules、Deployment/Operations、Troubleshooting 和配置边界 Wiki。

## 状态 已完成(2026-08-31,用户验收通过) ## 基本信息 - 类型:安全 / 跨项目协调 - 主项目:YoVision - 主 agent:单一 coordination agent - 所属 Epic:#7 - 所属 MVP:#156 - 来源:#124、PR-BND-003、NFR-002/NFR-003 - 生产者/调用方:Sense、Brain 的独立实例 - 消费者/被调用方:Sense、Brain、Bell 的受控机器接口 - 前置:#8 已验收;实施前确认认证机制、证书/密钥生命周期和威胁边界 - 契约事实源:`contracts/machine-identity/v1/**`、`contracts/transport/v1/**` ## 目标 为三端 connector 建立按产品和实例隔离的机器身份、最小权限、传输认证、轮换/吊销与审计边界,禁止复用管理员密码、浏览器 JWT/Cookie 或共享数据库角色。 ## 已确认安全设计门禁 - 每个部署实例使用独立 machine principal、audience 和最小 scope;Sense/Bell 用户身份永不跨产品传播,Brain 不拥有交互式用户。 - 凭据只从仓库外安全配置读取;示例只含变量名。日志、错误、工单和审计不得保存 secret、私钥或完整认证头。 - 在实施前从 mTLS 或短期签名机器令牌中确认一种主机制,并明确签发、存储、轮换、吊销、时钟偏差、重放防护和应急回退。 - 传输必须有明确超时、请求大小、重试分类和 request/correlation ID;不得使用 query token。 - 身份协议与三个产品的 adapter 分开映射,不共享用户表、JWT secret、Cookie、Casbin 策略或数据库模型。 ## 非目标 不建立统一用户中心,不传递网页登录态,不共享摄像头凭据,不实现业务事件/配置字段,不修改 GoAdmin 登录机制,不接管操作系统账户。 ## 精确 write_paths - `contracts/machine-identity/v1/**` - `contracts/transport/v1/**` - `contracts/tests/machine-identity-v1/**` - `Sense/server/app/sense/integration/machine_identity/**` - `Brain/src/yovision_brain/integration/machine_identity/**` - `Brain/pyproject.toml`(仅增加并冻结 Ed25519 所需的 `cryptography==50.0.1` 运行依赖) - `Bell/server/app/bell/integration/machine_identity/**` 禁止写入:其他产品业务目录、其他 `contracts/**`、根级部署、真实配置、`docs/**`。 ## 验收标准 - [x] 威胁边界和主认证机制经人工确认 - [x] 三端独立 principal/audience/scope,越权、错 audience、过期、重放和已吊销身份均拒绝并脱敏审计 - [x] 凭据仓库外管理,示例、日志、响应和构建产物无 secret - [x] 轮换不中断已确认兼容窗口;吊销与回退步骤可验证 - [x] 不接受管理员密码、浏览器 JWT/Cookie 或其他产品用户身份 - [x] 三端机器接口认证测试和传输降级测试通过 ## 验证 威胁模型检查、三端单测/集成、错身份/重放/过期/轮换/吊销测试、秘密扫描、日志脱敏和契约兼容测试。 ## 风险与回退 属于高风险安全修改。方案未确认不得编码;回退关闭跨项目 connector 并恢复三端独立运行,不降级为共享管理员身份或明文 token。 ## 设计与文档影响 非 UI 任务,以安全架构和流程设计为确认门禁;完成后更新 Architecture、Business-Rules、Deployment/Operations、Troubleshooting 和配置边界 Wiki。
Author
Owner

安全设计确认(2026-08-31)

用户明确回复:确认 #151 安全设计。

确认采用 v1 方案:

  • HTTPS + Ed25519 短期签名机器令牌;不复用网页登录 JWT、Cookie、管理员密码或共享密钥。
  • 每实例独立 principal/kid/私钥;消费者按公钥、精确 audience 和最小 scope 授权。
  • 令牌最长 5 分钟,时钟偏差 30 秒;绑定 HTTP 方法、规范化路径与请求体 SHA-256。
  • jti 单次使用并缓存至过期;业务重试签发新令牌但保留业务幂等键。
  • scope:Sense→Brain source-config:write;Brain→Sense runtime-status:write;Brain/Sense→Bell events:ingest;Bell→Sense evidence:read。
  • 私钥仓库外受 ACL/系统秘密存储保护,配置只引用路径。
  • 新旧密钥轮换重叠最多 24 小时;principal/kid 吊销即时拒绝。
  • TLS 最低 1.2、优先 1.3,强制验证证书/主机名,禁止 query token、明文降级和跳过验证。
  • 回退仅关闭 connector、恢复三端独立运行;v1 不引入 mTLS,客户 PKI 可作为后续增强。

按工单既定 write_paths 开始实施。

## 安全设计确认(2026-08-31) 用户明确回复:`确认 #151 安全设计`。 确认采用 v1 方案: - HTTPS + Ed25519 短期签名机器令牌;不复用网页登录 JWT、Cookie、管理员密码或共享密钥。 - 每实例独立 principal/kid/私钥;消费者按公钥、精确 audience 和最小 scope 授权。 - 令牌最长 5 分钟,时钟偏差 30 秒;绑定 HTTP 方法、规范化路径与请求体 SHA-256。 - jti 单次使用并缓存至过期;业务重试签发新令牌但保留业务幂等键。 - scope:Sense→Brain `source-config:write`;Brain→Sense `runtime-status:write`;Brain/Sense→Bell `events:ingest`;Bell→Sense `evidence:read`。 - 私钥仓库外受 ACL/系统秘密存储保护,配置只引用路径。 - 新旧密钥轮换重叠最多 24 小时;principal/kid 吊销即时拒绝。 - TLS 最低 1.2、优先 1.3,强制验证证书/主机名,禁止 query token、明文降级和跳过验证。 - 回退仅关闭 connector、恢复三端独立运行;v1 不引入 mTLS,客户 PKI 可作为后续增强。 按工单既定 write_paths 开始实施。
Author
Owner

实施前依赖检查(2026-08-31)

任务分支:task/151-machine-identity,当前尚未修改产品代码。

发现 Brain 的 CPython 3.11 冻结环境没有 Ed25519 实现,标准库也不提供 Ed25519 签名/验签;当前 cryptography 和 PyNaCl 均未安装。自写或复制纯 Python 密码算法不满足生产安全与可维护性要求。

建议把 Brain/pyproject.toml 纳入精确 write_paths,仅增加并冻结 cryptography==50.0.1 运行依赖。该版本由 Python Cryptographic Authority 发布,支持 Python 3.11,并提供 Windows x86-64 wheel。其他依赖和工具链不变。

这是依赖与写路径变化,已暂停实施并等待用户单独确认。

## 实施前依赖检查(2026-08-31) 任务分支:`task/151-machine-identity`,当前尚未修改产品代码。 发现 Brain 的 CPython 3.11 冻结环境没有 Ed25519 实现,标准库也不提供 Ed25519 签名/验签;当前 `cryptography` 和 PyNaCl 均未安装。自写或复制纯 Python 密码算法不满足生产安全与可维护性要求。 建议把 `Brain/pyproject.toml` 纳入精确 write_paths,仅增加并冻结 `cryptography==50.0.1` 运行依赖。该版本由 Python Cryptographic Authority 发布,支持 Python 3.11,并提供 Windows x86-64 wheel。其他依赖和工具链不变。 这是依赖与写路径变化,已暂停实施并等待用户单独确认。
Author
Owner

用户于 2026-08-31 明确回复:确认 #151 增加 cryptography 依赖。现解除依赖门禁,按扩展后的 write_paths 增加并冻结 cryptography==50.0.1,继续实施。

用户于 2026-08-31 明确回复:`确认 #151 增加 cryptography 依赖`。现解除依赖门禁,按扩展后的 write_paths 增加并冻结 `cryptography==50.0.1`,继续实施。
Author
Owner

实施完成,等待用户验收(2026-08-31)

最终差异

  • 冻结 yovision.machine-identity/v1 和 yovision.transport/v1:Ed25519、5 分钟有效期、30 秒时钟偏差、请求方法/路径/正文摘要绑定、单次 jti、精确 audience/scope。
  • 定义外部公钥注册表、稳定脱敏错误码、TLS 1.2+、证书/主机名验证、超时/大小/重试和 correlation ID 边界。
  • Sense、Brain、Bell 分别实现独立 signer/verifier、私钥路径加载、公钥注册表、轮换/吊销、可注入 replay cache 和安全 TLS policy。
  • Brain 按用户单独确认新增 cryptography==50.0.1;无自制密码算法。
  • 固定跨语言向量证明 Go/Python 相互验签;测试 token 未被任何产品注册表信任,不是可用凭据。
  • #152/#153 才接入业务 endpoint 和各产品持久 replay store;本工单没有修改网页登录、JWT/Cookie、数据库、业务事件、根部署或 UI。

提交与 PR

  • 提交:009dc3cca0ad835cf10fec6b58c7436bd66315b0
  • PR:#162,目标 dev,当前可合并

验证证据

  • 隔离 machine-identity 契约:10/10
  • Sense/Bell 定向 race 与 vet:通过
  • Sense/Bell go test ./...、go vet ./...:通过
  • Brain 原有测试:43/43
  • Brain 依赖兼容:通过
  • source-config:11/11;runtime-status:14/14;event:7/7;evidence:4/4
  • 仓库 unittest:48/48
  • DevHarness strict、git diff --check:通过
  • 秘密扫描:未发现私钥或可用 Authorization bearer

文档与未验证边界

有长期文档影响:Architecture、Business-Rules、Deployment/Operations、Troubleshooting 和验证 Wiki。实现分支遵守 docs/** 禁止写入;用户验收后按 Wiki→在线回读→核心镜像独立 PR 闭环。

未验证真实客户 PKI/网络、现场时钟漂移和 connector 重启;#152/#153 必须注入各产品独立的持久原子 replay store并完成重启/断网测试。本次未创建任务归档。

## 实施完成,等待用户验收(2026-08-31) ### 最终差异 - 冻结 `yovision.machine-identity/v1` 和 `yovision.transport/v1`:Ed25519、5 分钟有效期、30 秒时钟偏差、请求方法/路径/正文摘要绑定、单次 jti、精确 audience/scope。 - 定义外部公钥注册表、稳定脱敏错误码、TLS 1.2+、证书/主机名验证、超时/大小/重试和 correlation ID 边界。 - Sense、Brain、Bell 分别实现独立 signer/verifier、私钥路径加载、公钥注册表、轮换/吊销、可注入 replay cache 和安全 TLS policy。 - Brain 按用户单独确认新增 `cryptography==50.0.1`;无自制密码算法。 - 固定跨语言向量证明 Go/Python 相互验签;测试 token 未被任何产品注册表信任,不是可用凭据。 - #152/#153 才接入业务 endpoint 和各产品持久 replay store;本工单没有修改网页登录、JWT/Cookie、数据库、业务事件、根部署或 UI。 ### 提交与 PR - 提交:`009dc3cca0ad835cf10fec6b58c7436bd66315b0` - PR:#162,目标 `dev`,当前可合并 ### 验证证据 - 隔离 machine-identity 契约:10/10 - Sense/Bell 定向 race 与 vet:通过 - Sense/Bell `go test ./...`、`go vet ./...`:通过 - Brain 原有测试:43/43 - Brain 依赖兼容:通过 - source-config:11/11;runtime-status:14/14;event:7/7;evidence:4/4 - 仓库 unittest:48/48 - DevHarness strict、`git diff --check`:通过 - 秘密扫描:未发现私钥或可用 Authorization bearer ### 文档与未验证边界 有长期文档影响:Architecture、Business-Rules、Deployment/Operations、Troubleshooting 和验证 Wiki。实现分支遵守 `docs/**` 禁止写入;用户验收后按 Wiki→在线回读→核心镜像独立 PR 闭环。 未验证真实客户 PKI/网络、现场时钟漂移和 connector 重启;#152/#153 必须注入各产品独立的持久原子 replay store并完成重启/断网测试。本次未创建任务归档。
Author
Owner

用户验收通过(2026-08-31 11:24 +08:00)

用户明确回复:#151通过。

合并与复核

  • 实现提交:009dc3cca0ad835cf10fec6b58c7436bd66315b0
  • 实现 PR #162 合并提交:06e0790f00910a36c8369d7063925cd3e8db17c6
  • 合并后隔离机器身份契约:10/10
  • Sense/Bell machine_identity race:通过
  • Brain 回归:43/43
  • 仓库测试:48/48
  • DevHarness strict、git diff --check:通过

长期文档

已在线更新并回读:

  • Architecture-and-Code-Map:41c2193b2f1edb37abe1e8994d65d02207549039
  • Business-Rules-and-Glossary:7a91edf3ca35ade3e254937c4a68b53d816a3eea
  • Deployment-and-Operations:54d720aa07d2c40684da3fc04378393c7f318a04
  • Troubleshooting:75bf70f375f58356e968b45139b54fcae391d1e8
  • Local-Development-and-Verification:771fdd92eb03e9dff7d3ae20b7cb89f1ca288959

核心镜像提交:ae9bd015c264d8378b13547b79aaa7f1fa6eaa69;PR #163 合并提交:cf00d73436e943849aa75a02a5d8b99a5f6b6171。镜像一致性检查通过。

后续边界

#152/#153 的前置现已满足,但尚未实施;它们必须接入各产品独立持久 replay store并验证重启/断网,不得共享数据库。本次未创建任务归档。

## 用户验收通过(2026-08-31 11:24 +08:00) 用户明确回复:`#151通过`。 ### 合并与复核 - 实现提交:`009dc3cca0ad835cf10fec6b58c7436bd66315b0` - 实现 PR #162 合并提交:`06e0790f00910a36c8369d7063925cd3e8db17c6` - 合并后隔离机器身份契约:10/10 - Sense/Bell machine_identity race:通过 - Brain 回归:43/43 - 仓库测试:48/48 - DevHarness strict、`git diff --check`:通过 ### 长期文档 已在线更新并回读: - Architecture-and-Code-Map:`41c2193b2f1edb37abe1e8994d65d02207549039` - Business-Rules-and-Glossary:`7a91edf3ca35ade3e254937c4a68b53d816a3eea` - Deployment-and-Operations:`54d720aa07d2c40684da3fc04378393c7f318a04` - Troubleshooting:`75bf70f375f58356e968b45139b54fcae391d1e8` - Local-Development-and-Verification:`771fdd92eb03e9dff7d3ae20b7cb89f1ca288959` 核心镜像提交:`ae9bd015c264d8378b13547b79aaa7f1fa6eaa69`;PR #163 合并提交:`cf00d73436e943849aa75a02a5d8b99a5f6b6171`。镜像一致性检查通过。 ### 后续边界 #152/#153 的前置现已满足,但尚未实施;它们必须接入各产品独立持久 replay store并验证重启/断网,不得共享数据库。本次未创建任务归档。
ila closed this issue 2026-08-31 11:24:47 +08:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: ila/yovision#151