65 lines
3.9 KiB
Markdown
65 lines
3.9 KiB
Markdown
# AIOS OpenClaw Run Provenance Writer
|
||
|
||
本插件为 AIOS V2R1 提供 Owner 签名的运行授权、持久 Provenance Store 与专用 Evidence Writer。它不授予通用 Shell 或任意文件写权限。
|
||
|
||
## AIOS Runtime HTTP 合同
|
||
|
||
插件在 OpenClaw loopback Gateway 内注册 `/v1/health`、`/v1/execute` 和
|
||
`/v1/commands/<id>`。执行请求必须同时通过本机 CredentialRef 比对与 Ed25519
|
||
签名验证;热路径只读取公钥,不读取 Candidate 私密签名材料。
|
||
|
||
Runtime 仅允许无副作用的 `status` 与在线验收专用 `acceptance.delay`。它不把
|
||
返回成功冒充为模型推理或任意 Agent 执行。命令身份、幂等键和终态以追加式
|
||
JSONL 持久化;Gateway 重启时遗留的 `RUNNING` 命令会收敛为
|
||
`FAILED/restart_interrupted`,避免把重启误报成真实超时。
|
||
|
||
取消只对当前进程内仍在执行的命令生效,超时由签名命令的 `expires_at` 与
|
||
30 秒硬上限共同约束。未知 action、错误签名、过期命令、跨 tenant 状态查询、
|
||
冲突的 `command_id` 或幂等键均失败关闭。
|
||
|
||
## 安全边界
|
||
|
||
- 签名合同:`aios.run-provenance/v1`,Ed25519,授权最长 15 分钟。
|
||
- 授权绑定:`run_id`、`sender_id`、任务、执行器实例、当前 Claim OID、Candidate OID 与任务分支。
|
||
- 路径:仅允许七个 `.agent/*.json` Evidence 文件。
|
||
- 操作:仅允许 `create/update`,随后执行固定 argv 的 `git add`、`git commit` 和当前任务分支普通 push。
|
||
- 通用 `exec/shell/bash/write/edit/apply_patch/file_write` 始终拒绝。
|
||
- `toolCallId` permit 只能消费一次;参数摘要变化、过期、签名篡改、Run/Sender 不匹配均拒绝。
|
||
- Writer 拒绝 symlink、路径逃逸、脏 Worktree、错误分支、错误 HEAD、Candidate 非祖先及暂存范围扩大。
|
||
- Gateway 以服务用户调用 Git 时,仅对配置中的精确 `writerRepoRoot` 注入命令级 `safe.directory`,不写全局 Git 配置。
|
||
- 禁止 reset、rebase、amend、Tag 和 force push。提交后 push 失败时保留可审计的 local-ahead 状态,不伪造回滚。
|
||
|
||
## 组件
|
||
|
||
- `issuer.mjs`:在受保护边界读取现有 Ed25519 材料,生成公开验签材料并原子写入一次性签发记录。
|
||
- `provenance.js`:严格 Schema、canonical JSON、Ed25519 sign/verify 和安全 Store 读取。
|
||
- `index.js`:OpenClaw hook、Owner/Run/Sender 验证与一次性 permit。
|
||
- `writer.js`:限定路径原子写入、固定 Git 操作和追加式审计。
|
||
|
||
## 部署与回滚
|
||
|
||
部署必须先备份运行插件和 OpenClaw 配置,再安装 Git 中已测试的完整目录,配置绝对路径、Key ID、任务分支和审计路径,执行 `openclaw plugins doctor` 后才重启 Gateway。回滚只恢复备份插件与配置并重启,不修改任务分支历史或业务状态。
|
||
|
||
## 验证
|
||
|
||
执行:
|
||
|
||
```bash
|
||
node --test test/*.test.js
|
||
```
|
||
|
||
验收还必须包含受保护签发、Heartbeat 实际 commit/push、审计链验证,以及 `README.md` 等未授权路径的拒绝测试。
|
||
|
||
## Candidate task-plane transport
|
||
|
||
`protectedDispatchTransport=task-plane` 仅用于隔离 Candidate 验证。它要求:
|
||
|
||
- TaskPlan 与服务器配置的 `task_id`、repository、patch branch、完整 base OID、允许路径和 capability 完全一致;
|
||
- Owner provenance 已通过现有签名校验,Policy approval 与 TaskPlan 摘要、Owner principal、有效期绑定;
|
||
- Broker 端点只能是 loopback HTTP,Bearer 凭据只能从绝对路径的受控凭据投影读取;
|
||
- Broker 返回 `simulation=false`、真实 provisioning 元数据和 `secret-ref://` 引用,禁止返回 Token 或 Authorization 内容;
|
||
- Broker 不可达时直接失败,不回退到 `mock` 或 `sandbox`;
|
||
- 配置 `protectedDispatchAuditPath` 时仅写入脱敏 JSONL 审计记录。
|
||
|
||
该 Candidate 不修改生产插件或 Gateway;OpenClaw/Codex 原生子会话未完成前必须分别报告为未验证。
|