Files
Agentswarm/docs/integration/security-boundary.md
T
Songhaoz666andClaude Opus 4.8 d487923646 benchmark: 落地决策层(τ/η/P)、质量(Q_quality)、通信遥测;关闭 #10 #23
四块互相交织的 benchmark 覆盖增量,统一提交:

1) 通信遥测(#23):orchestrator 路由 peer 消息时按 correlation_id 计请求/应答到
   SwarmRun.collaboration(内部状态,不进 Manager 事件流);collector 算 s_communication。
   治理计数由 run.approvals 派生(合规/总数)→ s_governance。

2) Q_quality 掩码归一(v2.1 裁定):metrics.quality_score 改为对 present 输入加权归一,
   非编码任务自动忽略 TestPassRate,全缺 → NaN(不伪造)。

3) 质量插桩 / Group B:新增 Pod 内代码测试沙箱(orchestrator/sandbox.py,环境清洗 +
   超时强杀 + 资源限额 + 路径越界校验,门控 ENABLE_QUALITY_EVAL)与 held-out fixture
   (benchmark/fixtures/);run 完成时用留出测试评分得 TestPassRate → Q_quality →
   collector 合成 reward。安全边界见 docs/integration/security-boundary.md §8.1。

4) 决策引擎 / Group A(#10,Option A score-at-pull):新增 orchestrator/decision_engine.py
   —— 信息素 τ(Redis 持久、(role,agent) 键控、冷启动 0.5、ρ 蒸发、夹紧、学习常开)+
   η 启发式评分 + ε-greedy 概率采样;每次 dispatch 产一条 DecisionTrace →
   SwarmRun.decisions;collector 算 tau/eta/p_decision。概率选择门控 ENABLE_ACO_DISPATCH
   (默认关,CI 用 ACO_SEED 固定)。

覆盖:单次 run 真实可算字段由 4 提升至最多 10/15(新增 communication/reward/tau/eta/
p_decision,外加 governance 有条件)。

测试:新增 test-sandbox / test-quality / test-decision-engine;扩充 collector/metrics 用例;
CI 纳入全部 benchmark 套件 + flag-on 的 ACO e2e。本地 11 项 gate 全绿。

诚实边界(未越界声称):
- Group A 为单边匹配(Option B 待 Group C);概率派发优于贪心未证;默认关闭。
- reward 的 CodeReview/UserAcceptance 未采集(掩码忽略);P_risk 为审批派生低估。
- s_gain/s_swarm/g_e/g_e_cost/benchmark 仍 NaN —— 需基线(#21/#13),本 PR 不动验收。

影响范围:Swarm(orchestrator + benchmark + docs + CI)。不改 Manager↔Swarm 事件契约
(遥测均为运行时内部状态);不影响 Client/计费/密钥/发布链路。新增 ENABLE_QUALITY_EVAL /
ENABLE_ACO_DISPATCH 两个开关,默认关闭。

Closes #10
Closes #23

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-10 12:51:32 +08:00

7.1 KiB
Raw Blame History

安全边界(Secret / Workspace / Tool / Approval / Tenant / Sandbox)

状态:部分已实现,部分待接入(依据 heicode-mananger/docs/heicode.md §六/七、docs/heicode-runtime-auth-newapi-secret-design.md §三/五、docs/integration/heicode-am-contract.md §3.1/§4)。

配套:runtime-contract.md、usage-billing-schema.md。

1. 不可破坏原则

  • 密钥/Token/云凭据/SSH 私钥/数据库密码/NewAPI key 不得进入代码、日志、Markdown、前端响应或 Git。
  • 凭据基线 = Azure Key Vault;引用一律 azkv://<vault>/secrets/<name>,不向后兼容 vault://。
  • Manager DB 与 Swarm 只保存 secret_ref,真实凭证由 Secret Broker 写入 Key Vault。
  • 子 Agent 不持有长期密钥;只接收角色、资源元数据、AGENT.md 与短期、最小权限、可审计凭证。
  • 高危操作审批只在客户端完成;运行时只校验审批结果,不发起审批。

2. Secret 注入边界

项 标准 本仓状态
secret_ref 前缀 azkv:// 强校验 必须 ✅ swarm_runtime.validate_create_request 校验 billing_context.secret_ref 等为 azkv://
拒绝明文密钥进入请求 必须 ✅ _reject_plaintext_secrets(metadata/resource_grants/callback)
响应/事件/持久化脱敏 必须 ✅ _redact_sensitive 将明文密钥键(password/token/secret/private_key/access_key 及 *_token/*_secret/*_password/*_key)脱敏为 [redacted];保留 secret_ref/credential_ref/signing_secret_ref(安全引用)
.env/密钥不入库 必须 ✅ .gitignore 忽略 .env、secrets/、*.pem/key/p12/pfx、id_rsa/ed25519
真实凭证写入 Key Vault(Secret Broker) Manager 侧 ⛔ 非本仓(Manager Secret Broker 负责)
短期凭证派生与注入 客户端审批后 🟡 Swarm 接收 secret_context;K8s 派生/注入由 Agent 平台(AM)实现

secret_context(HM 下发,仅引用与审批结果):

"secret_context": {
  "secret_refs": ["azkv://heicode-kv.vault.azure.net/secrets/res_git_1"],
  "inject_short_lived_credentials": true,
  "approval_id": "approval_123"
}

3. Workspace 隔离

  • 每个任务在独立按任务工作目录执行(agent task_workspace)。
  • 文件写入有路径越界校验(task_executor._resolve_workspace_path,拒绝绝对路径与逃逸 workspace)。
  • Git 操作在仓库根(repo_root)执行,限定结果分支。
  • 🟡 待接入:跨任务/跨租户的强隔离、只读挂载、allowed_paths 强制(当前由模型提示约束,未做运行时强制)。

4. Tool / MCP 权限边界

  • 当前 Agent 工具能力 = 工作区内文件读写 + Git;无 SK/MCP 工具权限引擎。
  • 🟡 待接入:统一 tool/MCP permission boundary、allowed/denied 工具策略、敏感工具审批联动(sk_tool.* 事件已在 schema 预留)。

5. 审批门(Approval Gate)

  • 高危操作审批只在客户端;Swarm 不发起审批。
  • Swarm 实现:create 命中高危(risk_level=high 或 requires_user_approval)→ 进入 waiting_approval,发 approval.requested(approval_id/operation/risk_level);客户端经 Manager 审批后回 POST …/approvals/{approval_id}(approved/rejected)→ 恢复或阻断。
  • 🟡 待接入:审批主体/范围/TTL/credential_ref/lease_id 的逐项校验与到期失效,需与 Manager 审批链对齐。

6. Agent 鉴权与租户隔离

  • Swarm 模型:Agent 主动出站连编排器 WebSocket(/ws/{agent_id}),不对公网暴露每 Agent 子域名。AM 单 Agent 模型里的「客户端↔agent 直连 + AGENT_ACCESS_TOKEN 本地校验」不适用于 swarm(无直连回路)。
  • 服务间鉴权:HM→Swarm 用 AGENT_RUNTIME_SERVICE_TOKEN(Bearer);回调 HMAC 签名。
  • 🟡 待接入:多租户运行时隔离(命名空间/网络/配额)由 Agent 平台(AKS Workload Identity)承载,非本仓编排器;归因主轴为 user.id/channelId(见 usage-billing-schema.md),不引入 tenant 概念。

7. 外部 API 与传输

  • 模型调用统一走 HM /v1(OpenAI 兼容),用 HM 现签 OPENAI_API_KEY。
  • 传输:编排器/Agent 接口与回调走 HTTPS / 私网;env 含明文密钥时启动接口必须 HTTPS(heicode-am-contract §4)。
  • 🟡 待接入:统一 external API egress 策略(白名单/出网控制)。

8. 执行沙箱

  • 当前执行单元为进程 / K8s Pod,隔离强度依赖部署(namespace/资源限额)。
  • 🟡 待接入:强化沙箱(seccomp/只读根/网络策略/能力裁剪),由 Infra/Security Team 定义。

8.1 代码测试沙箱(benchmark Group B,orchestrator/sandbox.py)

为给「生成代码」算真实 TestPassRate,需执行模型生成的代码。安全模型与边界如下:

  • OS 级隔离边界 = K8s Pod / 容器(非 root、只读根文件系统、NetworkPolicy 出网拒绝、CPU/内存/pids 限额、seccomp),由部署侧(Manager/release 清单)强制,非本仓可改。按 Owner 裁定,在该隔离 Pod 内运行测试代码可接受。
  • Pod 内纵深防御(本模块新增):每次运行用临时工作目录(结束即删);wall-clock 超时 + 进程组强杀;POSIX 资源限额(CPU 时间 / 地址空间 / 文件大小 / 子进程数,见 SANDBOX_* 环境变量);环境变量清洗(不向子进程泄漏任何 API Key/Token/云凭据/代理变量,仅放行 PATH/语言区域等白名单);写入路径越界校验(拒绝绝对路径与 .. 逃逸);输出截断;计数从 JSON 结果文件读取,不信任 stdout。
  • 门控:默认关闭,仅 ENABLE_QUALITY_EVAL=1 且在上述隔离 Pod 内启用;评测仅用 benchmark/fixtures/<id>/ 的留出测试(held-out)作权威评分。
  • 明确不构成:本模块不是独立安全边界,不替代 §8 的强化沙箱(seccomp/只读根/网络策略仍由 Infra/Security 在 Pod 层强制)。不得在隔离 Pod 之外开启代码执行。

9. 覆盖与缺口

边界 状态
azkv:// secret_ref 强校验 / 明文拒绝 / 脱敏 / .gitignore ✅ 已实现(本仓)
Workspace 路径越界校验 ✅ 已实现
审批状态机(waiting_approval + approvals 回执) ✅ 已实现(逐项校验待加强)
短期凭证派生注入、Workload Identity 🟡 AM/K8s 侧
Tool/MCP 权限引擎 🔴 未实现
allowed_paths 运行时强制、强隔离 🔴 未实现
代码测试沙箱(Pod 内纵深防御 + 环境清洗 + 超时/限额,门控 ENABLE_QUALITY_EVAL) ✅ 已实现(本仓,§8.1);OS 级隔离仍依赖 Pod
强化执行沙箱(seccomp/只读根/网络策略/能力裁剪,Pod 层) 🔴 未实现(Infra/Security)
租户隔离 ⛔ 不在本仓(归因按 user/channelId)

10. 待对齐对象

Security / Governance Team(tool/MCP 边界、沙箱、审批逐项校验)、Infra Team(Workload Identity、租户隔离、egress 策略)。