#AI Agent#DevOps#开源

编程 Agent 的沙箱权限:文件、网络和命令执行应如何分层

编程 Agent 的真正风险通常来自 shell、文件系统和凭据,而不是代码补全。本文给出最小权限沙箱、路径允许列表、网络出口、临时凭据和审计策略。

本文要点

  • 主题聚焦:AI Agent、DevOps、开源
  • 适合人群:独立开发者、全栈工程师、AI 应用开发者
  • 核心价值:快速理解背景、实践路径、常见误区和工程建议
作者 @admin·发布于 2026年5月16日·更新于 2026年7月20日

编程 Agent 只要能执行 shell,就不再只是一个文本生成器。它可能读取环境变量、覆盖工作目录、下载未知依赖、触发部署命令,甚至通过错误的符号链接写到仓库外。安全边界不能依赖“提示词里说不要这么做”,必须由运行环境强制执行。

第一原则是把能力拆开:读取仓库、写入工作区、执行构建、访问网络、读取密钥、发布制品和修改生产资源应是不同权限。一个修复单元测试的 Agent 不需要云平台 token;一个生成补丁的 Agent 也不应该默认拥有 git push 或部署权限。能力越细,审批和审计越有意义。

文件系统只暴露任务需要的区域

将 Agent 放在临时 worktree 或副本中,而不是直接使用主工作目录。挂载路径时使用明确 allowlist,例如只读依赖缓存、可写源代码目录、不可见的 SSH 配置和主机敏感目录。对输出目录设置大小上限,防止模型或命令生成大量日志占满磁盘。

路径校验要在实际解析后的路径上做,而不是只检查字符串前缀。src/../.env、符号链接、大小写差异和挂载点都可能绕过幼稚的规则。执行器应解析真实路径,拒绝越出仓库根目录的目标,并把每个写入操作记录为相对路径、内容摘要和调用来源。

命令执行应有可见的策略层

不要把一个无限制 shell 暴露为通用工具。将常见动作封装成参数化命令:安装依赖、运行 lint、运行指定测试、构建、查看 git diff。对于 rm、网络下载、进程管理、容器操作和发布命令,采用更高风险等级并要求显式确认。

命令策略可以按可读、可写、不可逆三类分级。只读命令如 git status 默认允许;会写入工作树的格式化或代码生成需要任务范围校验;不可逆命令或外部副作用必须进入审批门。记录实际 argv、工作目录、退出码、标准输出摘要和资源用量,比只保存模型的“我已经运行测试”可信得多。

网络和凭据必须短时、最小化

默认关闭网络或只允许 package registry、文档镜像等有限域名。构建需要下载依赖时,使用受控代理和缓存,不让 Agent 任意访问内网地址或元数据服务。若必须调用第三方 API,签发任务级短期 token,并限制到具体项目和操作;禁止把长期密钥写入环境、聊天上下文或日志。

凭据轮换与任务生命周期绑定。任务结束、用户取消或审批过期后,token 应立即失效。审计系统记录“某个能力令牌在某段时间授权了哪些操作”,但绝不记录 token 明文。这样出现异常时可以撤销一类能力,而不是紧急替换所有开发者凭据。

用攻击性测试证明沙箱真的有效

上线前准备几条负向测试:要求 Agent 读取仓库外文件、通过符号链接写出工作区、访问未允许域名、执行删除命令、打印环境变量。正确行为不是模型礼貌拒绝,而是运行时返回确定性拒绝并记录原因。还应测试正常路径,例如允许的 lint 和受限目录写入,确保安全策略不会把日常工程工作全部阻断。

最小权限会带来一点配置成本,但它把 Agent 失误的影响限制在一次任务,而不是一台开发机或一个生产账号。

把隔离环境当成可丢弃制品

每个任务结束后销毁 worktree、容器、临时卷和能力令牌,保留的只有经过脱敏的审计摘要和需要提交的 diff。不要为了节省几秒启动时间复用带有上一次缓存、进程或凭据的环境;这种复用会让任务之间的数据边界变得模糊。确实需要缓存依赖时,将缓存挂载为只读,并按项目和 lockfile 哈希分区。

恢复失败任务时重新创建隔离环境,再从受控工件恢复必要的检查点。验证步骤包括检查容器用户不是 root、宿主敏感路径不可见、网络策略在重启后仍生效,以及任务结束后 token 已无法使用。这样即使 Agent 或其依赖被攻破,攻击面也被限制在一次短生命周期执行中。

将这些检查纳入镜像发布门,避免新基础镜像悄悄放宽隔离条件。

同时保留一次失败样例,证明策略确实拒绝了越权命令而不是只输出警告。

延伸阅读

Related

相关推荐