工程进阶 · 可靠 Agent 的工程模式

沙箱与凭证隔离

生成的代码和密钥永远不在同一个容器里。结构性安全比靠提示词更可靠

本页解决的问题

先给结论

「沙箱与凭证隔离」要解决的关键问题是什么?

生成的代码和密钥永远不在同一个容器里。结构性安全比靠提示词更可靠

判断标准

让这个结论先证明自己值得留下。 把这一页当成决策工具,而不是需要背下来的定义。把概念连到一个真实任务、一个可观察结果,以及一个能改变你判断的失败上。

下一步

写下一个问题:试完这个方法后,你能用什么证据回答它?

常见误区

结论听起来很完整,却没有检查最关键的假设。

核心原则
生成的代码和密钥
永远不能在同一个地方
这是管理 Agent 安全的第一原则:凭证与执行环境的物理隔离。
旧方案出了什么问题

传统架构:一个容器装所有东西

所有东西在一个容器里
代码执行、API 密钥、OAuth Token、会话凭证,全部共存在同一个运行环境中。Agent 能看到的一切,恶意代码也能看到。
Prompt Injection 一步偷走密钥
攻击者只需通过 Prompt Injection 说服 Agent 执行一行代码(echo $API_KEY),就能窃取环境变量中的所有密钥。整个攻击链极短,防不胜防。
Agent 越聪明,问题越严重
能力更强的 Agent 意味着更强大的工具调用能力。而在旧架构下,这也意味着更大的攻击面。模型的进步不会自动解决这个问题,反而会让它恶化。
模型能力越强,安全问题越严重。这意味着安全架构不能依赖模型自觉,必须通过结构性设计来保证:即使模型被完全控制,攻击者也拿不到凭证。
两种凭证隔离模式
MODE 1
绑定到资源
Token 在使用时被嵌入到资源的访问路径中,从不作为独立变量存在。Agent 能用它,但看不到它。
GIT 克隆场景
Token 在克隆时注入到 remote URL 中:
https://token@github.com/repo.git
沙箱内的 Agent 可以正常执行 push/pull 操作,但无法直接读取或提取 Token:它被嵌入在 Git 配置的深层,不是一个可读的环境变量。
Token
注入 Remote URL
Agent 可用不可见
MODE 2
Vault 代理模式
Token 存在安全的 Vault 服务中,Agent 的每次 API 调用都通过代理转发。代理根据 Session ID 查找对应凭证并注入请求,Agent 永远接触不到原始 Token。
MCP OAUTH 场景
Agent 发起 MCP 调用时,请求先到达代理服务。代理根据当前 Session ID 从 Vault 中查找对应的 OAuth Token,将 Token 注入请求头后转发到目标 MCP 服务器。Agent 全程只知道「调用成功了」,但从未见过 Token 的任何一个字符。
Agent 发请求
代理注入 Token
目标服务
OS 级沙箱隔离

三重隔离屏障

文件系统隔离
Agent 只能访问工作目录下的文件,无法读取宿主机的其他文件系统路径。凭证、配置、系统文件全部不可见。
网络隔离
沙箱限制网络访问范围,Agent 无法向任意外部服务发送数据。即使获取了凭证,也无法外传。
进程隔离
Agent 的代码执行在独立进程空间中,无法访问宿主机的其他进程。既不能读取其他进程的内存,也不能发送信号。
三层信任层级

从工具到组织的分层权限控制

TOOL
工具级信任
最细粒度的控制。某些特定工具需要每次使用都经过人工审批,比如文件删除、数据库写入、发送邮件等高危操作。对于安全的只读操作(如搜索代码、读取文件),可以设为自动放行。
SESSION
会话级信任
某次对话的权限范围。用户在开始会话时授予 Agent 特定范围的权限(如「可以读写 /src 目录但不能改 /config」),整个会话期间权限范围保持不变。会话结束后权限自动回收。
GLOBAL
全局级策略
组织级的安全策略限制。无论用户在会话中授予什么权限,Agent 都不能违反全局策略,比如「永远不能访问生产数据库」「不能向外部域名发送请求」。这是安全的兜底防线。
结构性安全 > 提示词安全。设计上让攻击不可能,模型自觉靠不住。凭证和执行环境物理隔离、多层信任控制、OS 级沙箱,这些是让 Agent 在生产环境安全运行的基石。

「核心原则」里的风险边界在哪里

「生成的代码和密钥永远不在同一个容器里。结构性安全比靠提示词更可靠」把安全问题从一句“请模型不要犯错”拉回到权限、数据和环境。真正需要保护的是:模型即使判断失误,系统也不能让错误变成不可逆的结果。

把模型建议和实际权限分开

在「生成的代码和密钥永远不在同一个容器里。结构性安全比靠提示词更可靠」涉及的流程中,要分别检查用户能要求什么、模型能建议什么、工具实际允许什么,以及谁有权批准写入或发送。网页、文档和工具返回值都可能携带不可信指令,不能因为它们看起来像说明就自动提升权限。

安全设计必须包含失败和恢复

结合「生成的代码和密钥永远不在同一个容器里。结构性安全比靠提示词更可靠」做一次反向演练:加入错误输入、缺失凭证或迟迟不到的审批,确认系统会拒绝、暂停并留下可追踪信息,而不是继续执行到底。

从「核心原则」走到「旧方案出了什么问题」

「核心原则」先把问题落在「生成的代码和密钥 永远不能在同一个地方 这是管理 Agent 安全的第一原则:凭证与执行环境的物理隔离」上;到了「旧方案出了什么问题」,讨论继续推进到「传统架构:一个容器装所有东西 所有东西在一个容器里 代码执行、API 密钥、OAuth Token、会话凭证,全部共存在同一个运行环境中。Agent 能看到的一切,恶意代码也能看到。 Prompt Injection 一步偷走密钥 攻击者只需通过 Prompt Injection 说服 Agent 执行一行代码( echo $API_KEY ),就能窃取环境变量中的所有密钥。整个攻击链极短,防不胜防。 Agent 越…」。两段连起来,重点就不只是记住一个结论,而是看清它成立所依赖的条件。

把这条判断带到下一个场景

做安全判断时,把“模型想做什么”和“系统允许做什么”分开,逐个检查数据边界、工具权限、人工确认和失败后的恢复路径。

  • 「核心原则」:生成的代码和密钥 永远不能在同一个地方 这是管理 Agent 安全的第一原则:凭证与执行环境的物理隔离
  • 「旧方案出了什么问题」:传统架构:一个容器装所有东西 所有东西在一个容器里 代码执行、API 密钥、OAuth Token、会话凭证,全部共存在同一个运行环境中。Agent 能看到的一切,恶意代码也能看到。 Prompt Injection 一步偷走密钥 攻击者只需通过 Prompt Injection 说服 Agent 执行一行代码( echo $API_KEY ),就能窃取环境变量中的所有密钥。整个攻击链极短,防不胜防。 Agent 越…
  • 「三层信任层级」:从工具到组织的分层权限控制 TOOL 工具级信任 最细粒度的控制。某些特定工具需要每次使用都经过人工审批,比如文件删除、数据库写入、发送邮件等高危操作。对于安全的只读操作(如搜索代码、读取文件),可以设为自动放行。 SESSION 会话级信任 某次对话的权限范围。用户在开始会话时授予 Agent 特定范围的权限(如「可以读写 /src 目录但不能改 /config」),整个会话期间权限范围保持不变。会话结束后权限自动…

最后的「三层信任层级」把讨论落到「从工具到组织的分层权限控制 TOOL 工具级信任 最细粒度的控制。某些特定工具需要每次使用都经过人工审批,比如文件删除、数据库写入、发送邮件等高危操作。对于安全的只读操作(如搜索代码、读取文件),可以设为自动放行。 SESSION 会话级信任 某次对话的权限范围。用户在开始会话时授予 Agent 特定范围的权限(如「可以读写 /src 目录但不能改 /config」),整个会话期间权限范围保持不变。会话结束后权限自动…」。回看这条线索时,最值得保留的是:当输入、规模或风险改变,哪些判断需要重新做一遍。

标记为已学完 阅读进度会自动记录
← 上一篇下一篇 →

继续阅读

同一条线上的下一篇。

文章讨论

读到这里,留下一个判断。

把刚想明白的地方、还没想通的问题,留给下一位一起学习的人。

正在讨论 沙箱与凭证隔离 可靠 Agent 的工程模式
3条讨论文章讨论 · 与共学社区同步
在共学社区查看
AM
Asha Morgan内容编辑
观点实践记录

我把这篇文章里的一个判断改写成了今天可以验证的小实验。比记住结论更有用的是,知道下一步要观察什么。

文章讨论7 有帮助
LH
Lin Harper独立开发者
观点观点

读完以后我先回头找它成立的条件,而不是直接把方法搬进项目。这个顺序让后面的取舍清楚很多。

文章讨论5 有帮助
KM
Kiki Moore产品运营
问题问题

如果把这个判断放到真实工作里,最先需要补的约束是什么?我想知道从阅读到第一次实践之间,哪一步最值得先做。

文章讨论4 有帮助