Agent 控制面负责围绕执行做出决策,包括身份、授权、凭据范围、审批、限制、操作状态、资源所有权和审计记录。数据面则执行获得许可的数据库查询、浏览器操作、部署或 API 调用。
如果每项工具都以不同方式做出这些决策,系统就没有真正的控制面,只有一套会随工具增加而逐渐分化的约定。
将决策与执行分开
flowchart LR
Agent[Agent request] --> Identity[Resolve identity and tenant]
Identity --> Policy{Policy and approval}
Policy -->|deny| Audit[Audit decision]
Policy -->|allow| Broker[Issue scoped credential]
Broker --> Operation[Create or resume operation]
Operation --> Tool[Execute tool in data plane]
Tool --> Resource[(Database, API, browser, compute)]
Tool --> Operation
Operation --> Audit
控制面应回答:谁在执行、该身份拥有哪些资源、允许执行什么操作、是否需要用户同意、可以运行多少工作,以及如何停止操作。数据面只应获得范围严格受限的指令,以及完成指令所需的足够权限。
这条边界是完整 AI agent 架构的补充。它不必从第一天起就是一项独立服务,但其契约应该在代码中清晰可见。
在选择工具前确定身份
执行工具前,先确定已经过身份验证的用户、租户、agent 和会话。如果服务端可以从凭据绑定租户标识符,就不要接受模型输出中的租户标识符。
NIST 的零信任架构要求对每次请求单独评估信任,而不是因为调用方位于某个网络内部就直接信任。对 agent 来说,这意味着即使请求来自内部工具,下游服务仍需对工具代表的身份执行授权。
控制面、agent 会话和应用运行时应使用不同凭据。能够配置资源的管理凭据,不应开放给普通应用调用。
让策略返回具体决策
一项有效的策略决策应记录:
- 主体、租户、资源和操作;
- 策略版本和命中的规则;
- 是否需要人工审批;
- 费用、调用次数、时间或数据量限制;
- 允许或拒绝结果,以及稳定的原因。
工具描述可以告诉模型何时请求审批,但强制执行必须位于提示词之外。OWASP 的过度代理权指南建议尽量减少工具功能、权限和自主程度,并由下游系统强制执行授权。
以尽可能小的权限范围分配凭据
如果提供商支持,数据面 worker 应获得仅适用于已批准资源和操作的短期凭据。如果提供商不支持,应将凭据保留在服务端工具中,并在封装层执行相同的限制。
绝不能通过模型上下文、工具描述、URL 或模型可见错误传递密钥。链路追踪中记录凭据引用,而不是凭据值。
Agent 安全指南介绍了完整的身份与密钥路径。
将操作与对话分开追踪
一轮聊天不是操作记录。对于会写入、等待、重试或可能比当前请求存活更久的工作,应创建操作 ID。保存状态、脱敏后的输入、幂等键、审批状态、尝试次数、输出或引用,以及最终结果。
这样,agent 可以查询部署是否仍在运行,而无需重新发送部署请求。用户也可以基于一个稳定对象取消、恢复或调查操作。
在同一个控制面管理资源清单与所有权
控制面应该知道每个数据库、bucket、部署、浏览器会话和 agent 凭据属于哪个租户。资源清单让撤销和删除更容易执行,也能避免模型按易读名称选择资源时误选另一个租户中的同名项。
配额应应用于经过身份验证的租户和操作,而不是模型提供的租户字段。达到限制时应返回稳定结果,让 agent 能够解释原因,而不是盲目重试。
同时审计决策与结果
审计记录需要同时包含策略决策和观察到的结果。“允许删除”和“删除完成”是两个不同事件。应保存操作 ID、执行者、租户、资源、操作、策略版本、审批引用、时间戳和结果类别。
默认情况下,不要在审计日志中存储原始提示词、密钥或完整工具结果。如果确实需要保留原始内容,应在独立访问策略下存储 hash 或引用。
从现有应用内部开始
小型系统可以使用中间件、策略模块、凭据适配器、操作表和 append-only 审计表实现控制面。只有规模或职责分工确有需要时,才拆分为多项服务。初始目标是建立一条一致的决策路径。
下方的提示词会追踪现有工作流,并找出埋在各个工具处理程序中的控制逻辑。这些重复逻辑是最先应该迁移到共享契约后的部分。