17 · 安全模型与审计
目标:明确 Ainet 的信任边界、已实现的控制、已知缺口与渗透测试清单。 不是“已通过安全认证”的声明;发布前仍需外部审计。
17.1 信任边界
User / App
│ token (shared secret)
▼
Coordinator ── NDJSON/TCP + optional mTLS ──▶ Cell Worker
│ │
│ ├─ EffectBus: LLM / HTTP / shell / human
│ └─ cell state;effects 委托 coordinator ledger
▼
Audit (hash) / Budget ledger
假设:
- cell 集群与 flow 调度器都支持 mTLS(
--tls-cert/--tls-key/--tls-ca)。 - 共享 secret 由部署者分发;不暴露给 Agent。
- Agent 产生的文本/工具参数是不可信数据,不是指令。
- Worker 执行受信代码(我们的 runtime + 受控 adapter);用户自定义规则未来进 WASM。
17.2 已实现的控制
| 控制 | 实现 | 测试 |
|---|---|---|
| mTLS(cell + flow) | rustls 双向证书;server/client 均由同一 CA 签发 | mtls_cell_cluster_round_trip、mtls_flow_scheduler_round_trip |
| Transport token | 每个 RPC 检查共享 token | token_is_enforced_for_cells |
| per-cell capability | v1:<run>:<epoch>:<HMAC>;worker spawn 校验 MAC;deliver/snapshot/remove 精确匹配 |
hmac_capabilities_are_verified、capability_is_enforced_and_revocable |
| 撤销 | revoke 增加 epoch + SetCapability;旧 cap 立即失效 |
cluster_revoke_updates_capability_and_keeps_running |
| 远程消息幂等 | (run,id) + (run,channel) seq/dedupe/gap |
duplicate_envelopes_are_dropped、channel_sequence_rejects_gaps_and_dedupes_old |
| effect 幂等 | worker 委托 coordinator;run:cell:op:input_hash ledger + NDJSON;--run-id/--effect-ledger |
effect_cache_prevents_duplicate_calls、effect_ledger_reuses_results_across_coordinator_restarts |
| shell allowlist | 只允许 echo/printf(默认);argv 数组,无 shell 拼接 |
shell_effect_runs_allowlisted_command、..._rejects_unlisted_command |
| HTTP 出站 allowlist | AIN_HTTP_ALLOW 逗号前缀;with_allowlist |
http_effect_respects_allowlist |
| 预算/队列上限 | token/$/steps;with_queue_limit + per-destination with_cell_queue_limit 背压 |
budget_exceeded、queue_limit_applies_backpressure、cell_queue_limit_applies_backpressure |
| 审计哈希 | audit_hash = sha256(events) |
hmac... 测试断言非空 |
| 迁移/故障 | last-ack failover;不会静默丢状态(at-least-once) | killing_a_node...、...rejoined |
17.3 威胁与缓解
T1 越权调用 cell / 伪造消息
- 控制:token + per-cell HMAC capability + deliver 精确匹配。
- 残余:持有 client 证书与 secret 的内部人可伪造;证书/secret 的签发与轮换仍需 KMS。
- 渗透测试:篡改 capability、重放旧 cap、跨 run 复用。
T2 Prompt injection 诱导 Agent 调用工具/外泄
- 控制:端口即能力——Agent 只能沿已连接的 capability 端口发消息;没有全局工具表;shell/HTTP 有 allowlist。
- 残余:Agent 可能把敏感数据发给已授权的 LLM/HTTP 端点;需要数据分级/策略 cell。
- 建议:敏感数据打 provenance 标签;出口策略检查;人工审批 gate。
T3 SSRF / 任意 HTTP
- 控制:
AIN_HTTP_ALLOW前缀 allowlist;默认空 = 不限制(开发)。 - 残余:生产必须设置 allowlist;前缀匹配可被相似域名绕过(如
https://api.example.com.evil)。 - 改进:URL 解析后按 host/scheme/port 精确匹配,禁止私网 IP(需保留 localhost 测试模式)。
T4 Shell 注入
- 控制:只执行 allowlist 命令;参数用 argv 数组,不经过 shell;默认只有
echo/printf。 - 残余:允许的命令若支持危险参数(如
printf格式化)仍可能滥用;生产应使用专用工具而非 shell。
T5 Worker 被攻陷
- 控制:token/HMAC、mTLS、审计、预算;worker 只持有自己 cell 的状态。
- 残余:被攻陷 worker 可伪造 ack/结果;mTLS 只证明身份,不保证行为正确;v1 没有拜占庭容错。
- 改进:结果签名、复制执行/校验、WASM 沙箱。
T6 DoS / 资源耗尽
- 控制:
queue_limit+cell_queue_limit背压;预算/step 上限;shell/HTTP 超时(部分)。 - 残余:有 per-destination 队列 credit,但无 per-cell in-flight/CPU/内存配额;LLM 长尾仍可能占满 worker。
T7 审计篡改
- 控制:
audit_hash可对外锚定;--save-audit落盘。 - 残余:无 per-event hash chain/签名;本地文件可被改。
17.4 未实现 / 发布前必须补
- 密码学 capability 的密钥管理:secret 目前在 CLI/环境变量;需要 KMS/Vault 轮换。
- effect 事务窗口:provider 调用成功、ledger 尚未落盘时崩溃,重启后可能重复调用;需要 provider 幂等键/outbox。
- SSRF 精确策略:host/port/IP 解析 + 私网拒绝。
- WASM 沙箱:用户自定义 behavior/规则尚未执行在沙箱中。
- Prompt injection 策略 cell:数据/指令分离、出口审查、人工 gate。
- 租户隔离/配额:共享集群下没有硬隔离。
- 渗透测试:越权、cap 重放、SSRF、shell、DoS。
17.5 发布前安全清单
- token + HMAC capability + revoke
- shell allowlist(argv、无 shell)
- HTTP allowlist hook
- queue/budget 上限
- 审计 hash
- mTLS(cell 集群 + flow 调度器;见
docs/23-mtls.md) - 私网 IP / host 精确 allowlist
- 持久化 effect 幂等(coordinator ledger;见
docs/22-durable-effects.md) - effect 调用与 ledger 写入的原子性(provider idempotency key/outbox)
- 内部自动化安全 smoke(
docs/24-security-testing.md、scripts/security-smoke.sh) - 外部渗透测试
- 租户配额
- 安全文档对外发布