权限、沙箱与危险命令
建议用时:25 分钟(含练习)
学习目标
能够为任务设置最小文件、命令、网络和外部系统权限,并识别不可逆操作。
本节产出
一份任务权限预算
核心知识:能力、授权与隔离分别回答不同问题
一个 Agent 技术上能够运行命令,不代表它被授权运行所有命令;一项动作被用户允许,也不代表它可以越过系统安全边界;一个环境叫作沙箱,更不代表任何操作都没有后果。使用编码工具时,要把“能做什么”“允许做什么”“实际被限制在哪里”分开理解。
权限配置
权限配置通常控制工具、路径、网络目标或特定操作是否可以执行。
沙箱
沙箱则通过操作系统、容器或其他机制限制执行环境的访问范围。
提示词中的约束有助于模型选择正确动作,但不应被当作唯一强制控制。具体产品如何组合权限与沙箱,需要查看当前实现和设置。
隔离也有不同维度。文件系统限制可能阻止访问项目外目录,网络限制可能阻止外发请求,凭证范围决定某个远程 API 能修改什么。Git worktree 主要隔离工作文件与暂存状态,不自动隔离网络、数据库和账号。不要因为开了新分支,就把生产密钥带进实验任务。
图中的边界应通过实际配置和可观察结果确认。一个命令被允许后,还要知道它调用的脚本会做什么;只审查命令名称而不看参数、工作目录和脚本内容,容易漏掉真正的副作用。
危险往往来自组合与作用范围
读取文件通常比删除文件影响小,但读取秘密并发到外部同样可能造成严重问题。安装依赖看起来像准备环境,却可能执行包脚本;运行测试也可能连接真实数据库或发送通知。因此应先确认项目脚本和环境,不能给某个熟悉命令贴一个永久“安全”的标签。
审查动作可以问四个问题:它读什么,写什么,连接哪里,失败后怎样恢复。对涉及共享服务或不可逆后果的操作,再核对是否在明确授权范围内。对于已获准且可逆的小范围编辑,不需要把每次保存都变成重复确认;边界清楚比弹窗数量多更重要。
案例:测试脚本实际上指向生产数据库
虚构项目有一个 test:integration 脚本,启动时读取数据库环境变量。开发者在新 worktree 里运行它,以为工作区独立就不会影响生产;但环境变量仍指向共享数据库。若测试会清理表数据,新目录并不能提供保护。
正确做法是在执行前核对测试的数据库要求、连接目标和数据初始化逻辑,使用专用测试环境与虚构数据。测试配置应拒绝明显的生产目标,凭证本身也不应拥有生产写权限。不要通过关闭保护检查来让测试“终于能跑”。
如果环境不满足要求,可以先运行纯函数测试或静态检查,继续完成不依赖数据库的工作,并准确记录集成测试未运行的原因。最终是否可以交付取决于改动性质与项目门禁,而不是把缺失验证悄悄省略。
检查点不是万能撤销键
文件检查点可能恢复某些编辑,却无法自动撤回已发送邮件、数据库写入或远程发布。Git 提交也主要记录仓库中的版本,不记录所有外部状态。设计恢复方案时,应列清每个状态的恢复方式,而不是笼统写“出错就回滚”。
| 状态变化 | 可考虑的恢复证据 | 需要注意 |
|---|---|---|
| 代码文件 | Git 提交或文件快照 | 未跟踪文件可能未覆盖 |
| 数据库 | 经验证的备份与迁移方案 | 恢复可能覆盖后续业务写入 |
| 外部消息 | 发送记录与补救流程 | 通常不能真正撤回影响 |
| 公网部署 | 发布版本与切换记录 | 配置、数据和镜像可能不同步 |
动手练习
- 为一个只修改文档的练习任务列出必要能力,说明哪些文件和网络访问并不需要。
- 阅读一个虚构测试脚本说明,识别它可能读取的环境变量和产生的外部副作用,不实际连接任何服务。
- 写出文件编辑、数据库写入和消息发送的恢复差异,再为高影响动作设置明确的停止条件。
参考答案与推演
文档修改任务通常只需读取相关材料并写入限定输出,不需要生产数据库权限。集成测试如果会重建表或写入记录,就必须先确认专用目标与受限凭证,而不能依靠工作区名称里带 test 来判断。
恢复差异中,文件版本可以比较与还原,数据库需要考虑其他人的后续写入,消息发送则可能只能更正。停止条件可以是目标主机不符、凭证范围未知或备份未验证。它们应由实际证据触发,而不是泛泛让模型“谨慎一点”。
完成检查
- 能区分模型能力、用户授权、工具权限和运行隔离。
- 知道 worktree 不隔离网络与生产数据。
- 检查命令的实际脚本、参数和环境,不只看名字。
- 恢复方案覆盖真实副作用,未承诺万能回滚。
参考与来源
- Claude Code:Configure permissions:权限控制与提示指令的区别。
- Claude Code:Sandboxing:查看文件系统和网络隔离机制。
- OpenAI:Running Codex safely:编码 Agent 的控制边界与运行观察实践。
权限、沙箱与危险命令
3 道题 · 及格分 60 分