跑在开发者工作站上的智能体。
一个跑在员工笔记本上的编码智能体,是唯一一种「你发出的每一道控制都坐在它所约束的那个人的信任域里面」的部署——他们就是 root,而产品还递给他们一个关掉它的开关。这就是区别所在,而它跟隔离无关:本地沙箱确实已经做得很好了,如今一台笔记本上就能给每个智能体跑一个 microVM。能在一个铁了心的用户面前活下来的控制,是那些在「用户不是管理员的地方」被强制执行的——而这在实践中只意味着一件事:凭据住在机器之外,并按请求抵达。这一页上其余的一切,都是围着这件事做的卫生工作。
先把「它凭什么要在笔记本上」立清楚,否则你在造一个更差的云沙箱。
工作站部署之所以成为默认,是因为工具就是这么发的,而不是因为有人选过它。有三条理由经得起细究,而如果它们没有一条适用于你的机群,诚实的答案是一台托管的执行机,这份手册也就坍缩成一句话。
- 工作状态本来就在那儿。未提交的改动、一次做了一半的 rebase、一个里面装着复现用例的本地数据库、一个跑在 3000 端口上的开发服务器。一个得在远端把这些重建出来的智能体,是一个不同的、也更差的产品;这是最硬的那条理由,而它关乎的是工作树、不是仓库。
- 这个循环是交互式的。一个在推着智能体做改动的开发者想要亚秒级的来回。把每一次编辑往云沙箱绕一圈,对一次自主运行是可以忍的,对一次有人盯着的运行是不可忍的——这也正是后台编码智能体属于云上、而本页这一种不属于的原因。
- 数据不能离开。一份受监管的数据集、一份合约里点名了机器的客户源码、一台你虚拟化不了的设备。少见,而一旦为真就是决定性的。
按团队把这条理由写下来,因为它决定了你之后被允许在什么上面让步。「交互延迟」意味着你不能在内循环里放一次人工批准。「数据不能离开」意味着出站策略就是整个产品、而沙箱是次要的。那些从未点明理由的团队,最后会同时为两者做优化,然后两者都没交付出来。
靠读一个 home 目录,把智能体继承到的东西盘出来。
在任何控制之前,先去看一眼。拿一台有代表性的笔记本,把「一个以那个用户身份运行的进程读得到什么」枚举出来。这是个二十分钟的练习,而它是爆炸半径估算唯一诚实的版本——因为答案不是一份策略文档,而是一份目录列表。
- 云与集群凭据。
~/.aws、~/.config/gcloud、~/.kube/config。经常带着生产上下文,也经常带着一个能去 assume 更宽角色的角色。 - 代码托管与包仓库令牌。带凭据助手的
~/.gitconfig、~/.npmrc、~/.pypirc、一枚gh令牌。这些是发布权,是一个供应链位置、而不是一次读取。 - SSH 密钥与 agent 套接字。一个被转发进来的 agent 套接字,是一份没有文件可护的活凭据。
- 智能体自己的登录态。一个访问令牌加一个刷新令牌躺在同一个文件里,就是一份长达数周的凭据,不管那个访问令牌的 TTL 写着什么——算术在凭据有效期里。
- 浏览器配置档与会话 cookie。最不起眼的那一项。一罐 cookie 就是这位员工手上每一个 SaaS 会话,而对一枚已经签发出去的 cookie,没有哪条 SSO 策略还适用。
- 别的智能体的配置。一份 MCP 服务器清单、若干 hook、一个载体配置文件。这些是代码路径、不是设置;见生命周期 hook 与载体配置。
用脚本把这份清单生成出来、而不要凭记忆写,在十台机器的样本上跑一遍,并且预期你会找到至少一样「你不知道曾被签发过」的东西。端点上的智能体残留物是它的运维侧同伴——本步骤是它的输入。
挑一个沙箱,并把「你买到的是哪道边界」说准。
本地沙箱在两条彼此独立的轴上有差别,而市场话术把它们压成了一条。两条都要刻意地定。
- 隔离边界。一个 microVM 给智能体自己的内核;一个 OS 级沙箱(macOS 上的 Seatbelt、Linux 上的 bubblewrap)与你共用内核。microVM 对付恶意代码严格更强,而恶意代码在这里并不是你的主要威胁——这个智能体跑的是你让它写的代码。
- 凭据边界。STEP 2 里那些密钥,从箱子里面到底够不够得着。一个只挂载工作区的 microVM 靠拓扑把它们挡在外面;一个把凭据注入到获批请求里的代理靠构造把它们挡在外面;而一个 OS 级沙箱把它们留在真实文件系统上、靠一份拒绝清单。
第二条轴才是决定你暴露面的那条,而那些默认值值得去读、而不要去猜。Anthropic 自己的 srt——Claude Code 随产品发出的那个沙箱——默认在任何地方都拒绝写入,而默认在任何地方都允许读取:文件系统的读取是「先拒后许」的,所以 ~/.aws 在你把它点名之前都是可读的。修法是一份清单,而它不是碰巧没开的:
{
"filesystem": {
"denyRead": ["~/.aws", "~/.config/gcloud", "~/.kube",
"~/.ssh", "~/.npmrc", "~/.gitconfig",
"~/Library/Application Support/Google/Chrome"],
"allowWrite": [".", "/tmp"]
},
"network": { "allowedDomains": ["api.github.com", "*.npmjs.org"] }
}
出站已经不再是从前那个区分点了:这一代本地沙箱在网络上都是默认拒绝的,都要你把域名点出来。也就是说,「我们限制了网络吗」这个问题在每个选项上都是「是」,而「智能体读得到那枚令牌吗」这个问题仍然有四个不同的答案。按第二个来挑。凭据如何投递进沙箱是这个论证的长版本。
把凭据交给中介签发,因为这是唯一一道用户不是 root 的控制。
这一步让这页其余的内容变成可选的。一个开发者可以关掉你的沙箱、改掉你的配置、清掉你的环境变量;他做不到的,是铸出一份你的签发方拒绝签发的凭据。所以把智能体需要的每一个密钥搬出 home 目录,放到一个「按请求做决定」的东西后面去。
- 按运行、按任务签发,以这次运行的期限作为有效期。笔记本上不留刷新令牌。运行在开始时取得凭据,而凭据随运行一起死掉——这正是智能体的受限作用域凭据里的那个模式。
- 在代理处注入,而不是注入进进程。如果沙箱的出站本来就要过一个宿主侧代理,那个代理就是「把凭据附到获批请求上」的天然位置。于是智能体压根不持有任何密钥——这正是 NVIDIA 的 OpenShell 以 providers 功能发出的那个形态,也是 microsandbox 以「绑定到主机、且从不进入 VM 的密钥」发出的那个形态。
- 让这个中介成为审计点。它看得见是谁、哪个任务、哪个目的地,而它在你的基础设施上、不在员工的机器上。这就使它成为一个工作站机群唯一能产出可靠遥测的地方。
- 把不可逆的那一小撮的人工批准放在中介上。发布权、生产写入、任何花钱的事。内循环依然很快,因为批准挂在那些稀有的调用上、而不是挂在每一次编辑上。
- 把智能体的身份与开发者的身份分开。如果智能体以那个人的身份行事,那么每条审计日志都会写「是那个人做的」,而访问复核压根看不见这个智能体。
把策略分发下去,并接受「这台笔记本的出站不在你的网络上」。
一个工作站机群把通常那套强制执行的故事两半都打破了:配置是一个用户自己拥有的文件,而流量是从他家的 Wi-Fi 出去的。两者都有答案,而两个答案都不是一条防火墙规则。
- 靠设备管理把配置发下去,不要靠一个 wiki 页面。一份由你的工具链反复重新施加的受管设置文件,就是「一条策略」与「一条建议」的分界。给它上版本,并把对它的改动当成一次代码评审。
- 沙箱自己的策略日志就是你的遥测。你在网络层看不见这些流,所以沙箱在本地留的那份「拦了什么、放了什么」的记录是唯一的来源。按与其他任何安全日志相同的节奏把它从设备上送出来,并把它保持成回溯式链路复查所需要的那种瘦而长命的形态。
- 按项目做白名单,不要按机群。一份覆盖整个机群的域名清单会一直长,长到把「任何人曾经需要过的一切」都包进去,那就等于没有清单。把这份清单放进它所服务的那份代码旁边的仓库里,这样它会被「知道每一条为什么在那儿」的那些人评审。
- 把你放行的东西钉死。一份域名白名单是在对「一个由智能体挑选的名字」做字符串匹配,而
srt网络沙箱已公开的那两次绕过,都出在那个匹配器里、而不是出在 Seatbelt 或 bubblewrap 里——一次是空白名单被当成「全部放行」(CVE-2025-66479,2025 年 11 月下旬修掉),一次是主机名里的一个空字节:它通过了后缀检查,随后被操作系统截断。就假定那个匹配器是薄弱的那一环,因为它已经薄弱过两次了。 - 预期大部分窟窿是包管理器要的。现实的白名单是你的包仓库、你的代码托管、你的模型服务商,以及你的内部服务。如果它超过十条,那就是有什么东西在运行时去取了本该被 vendor 进来的东西。
给那个逃生口装上仪表,而不是装作它不存在。
这些工具每一个都有一个大张旗鼓写在文档里的绕过开关,因为厂商知道:一个装不了依赖的智能体会在第一个任务上就失败。开发者会用它,而他们用得最多的那一天,正是截止日期逼近的那一天。把绕过当成一次违规来处理的项目什么也学不到;把它当成一个信号来处理的项目拿到的是一份路线图。
- 去数它。每个开发者每周的绕过调用次数,以及你能采到的话、那个理由。这是唯一一个能告诉你「你的白名单是不是错了」的数字,而它胜过任何一份问卷。
- 让获授权的那条路比绕过更快。如果加一个域名要走一个 pull request、等两天,而绕过要四秒,那绕过就赢了。一条当天就能走完、值班有评审人的通路,能把大部分需求消掉。
- 绝不让绕过是无声的。未进沙箱的运行应当在会话里被显眼地标出来、被集中记录下来,并被排除在你给沙箱内产出的那份信任之外。
- 把撤销演练一次,掐着表。挑一台笔记本,假定它的 home 目录今早被复制走了,然后计时:到 STEP 2 枚举出的每一份凭据都失效,要多久。多数团队会发现那个数字是以「天」计的,而且其中有三项没人认领。
三件事,按顺序。第一,这周在十台真机上跑一遍 STEP 2 的清盘——它是一个脚本、花一个下午,而它是唯一能改变任何人想法的产出物。第二,把上面那份 denyRead 清单加进你受管的沙箱配置里,因为它是你手上可用的、价值最高的那一行配置,而它目前没有被设上。第三,把智能体权限最高的那份凭据——几乎总是代码托管或包仓库的令牌——挪到一个按运行签发的中介后面去。清盘告诉你值不值得费心;中介才是那个修法,也是唯一一个「一个有 root 的开发者撤不掉」的修法。
相关:沙箱与执行讲隔离层本身,IDE 智能体讲同一种部署、但面更窄的那一版,环境权限讲这份凭据为什么在没人做决定的情况下就够得着,而智能体的密钥管理讲那个中介的服务端。