Aklman · Library

04 / 第四章

放权 · 沙箱、审批与规则.

Codex 的安全模型是两个旋钮:沙箱定它「技术上能碰什么」(read-only / workspace-write / danger-full-access),审批策略定它「什么时候要问你」(untrusted / on-request / never)。默认的 Auto 档 —— 工作区随便写、越界才问 —— 加上默认断网和 .git 等保护路径,是多数活的甜点位。往细处走有规则文件:用 prefix_rule 给命令前缀定白灰黑名单,连 bash -lc 里藏的复合命令都会被拆开逐条审。最后一层最有意思:把审批本身交给一个 reviewer agent —— auto_review 替你看每个越界请求,拦下外传数据、探凭据、破坏性动作。


放它上云、放它无人值守之前,得先搞清楚它「能碰什么、什么时候要问你」。如果你记忆里 Codex 的放权是「suggest / auto-edit / full-auto」三档,那已经过时了 —— 那套旧命名如今只剩 full-auto 作为一个弃用兼容 flag 残留在 codex exec 里(会打印告警,官方让你改用显式的 --sandbox)。现在的安全模型是两个正交的旋钮:沙箱定它技术上能做什么,审批定它什么时候必须停下来问 —— 再加上一层规则,和一个能替你把关的 reviewer agent。这一章讲怎么把这套调到「信方向就松、信不过的点钉死」。

I

两个旋钮:能做什么,要不要问.

Codex 的安全控制来自两层,分开转:沙箱模式定它技术上能做什么 —— 在哪写、能不能联网;审批策略定它什么时候必须先问你。1注 1OpenAI Codex 文档 · Agent approvals & security —— 安全控制来自两层:Sandbox mode 定它技术上能做什么(在哪写、能否联网),Approval policy 定它什么时候必须先问你。默认 agent 断网;本地用 OS 沙箱把它限制在工作区。Auto 预设(--sandbox workspace-write --ask-for-approval on-request)让它在工作目录里自动读、改、跑命令,越界(工作区外写、要联网)才问。可用 /permissions 切 read-only。默认 workspace-write 下网络关闭,需显式 [sandbox_workspace_write] network_access = true 打开。可写根里仍有保护路径:.git、.agents、.codex 递归只读。截至 2026-07-17。两个旋钮各三档:
旋钮从紧到松
沙箱read-only · workspace-write · danger-full-access
审批untrusted · on-request · never
沙箱作用的是它派生的每一个命令 —— git、包管理器、测试器,统统继承同一条边界,靠操作系统原生强制(macOS 的 Seatbelt、Linux / WSL2 的 bubblewrap、Windows 的原生沙箱)。2注 2OpenAI Codex 文档 · Sandbox —— 常见沙箱模式:read-only(只读,改文件 / 跑命令要批)、workspace-write(读 + 在工作区内写 + 跑常规本地命令,是低摩擦默认)、danger-full-access(无沙箱限制)。常见审批策略:untrusted(非信任集里的命令先问)、on-request(默认在沙箱内工作,越界才问)、never(不停下来问)。沙箱作用于派生命令(git、包管理器、测试器都继承同一边界),OS 原生强制(macOS Seatbelt、Linux/WSL2 bubblewrap、Windows 原生沙箱)。启动时检测:版本库目录推荐 Auto,非版本库推荐 read-only。截至 2026-07-17。这一点很重要:沙箱不是「模型答应不越界」,是「操作系统不让它越界」—— 你信的是强制的边界,不是它的意图。两个旋钮组合出你要的自由度:read-only + on-request 是最安全的调研档,danger-full-access + never 是全放行(只在隔离环境用)。

II

默认与甜点位:Auto 档.

多数活的甜点位是 Auto 预设:workspace-writeon-request —— 工作目录里随它读、改、跑命令,只有越界(工作区外写、要联网)才停下问你。1注 1OpenAI Codex 文档 · Agent approvals & security —— 安全控制来自两层:Sandbox mode 定它技术上能做什么(在哪写、能否联网),Approval policy 定它什么时候必须先问你。默认 agent 断网;本地用 OS 沙箱把它限制在工作区。Auto 预设(--sandbox workspace-write --ask-for-approval on-request)让它在工作目录里自动读、改、跑命令,越界(工作区外写、要联网)才问。可用 /permissions 切 read-only。默认 workspace-write 下网络关闭,需显式 [sandbox_workspace_write] network_access = true 打开。可写根里仍有保护路径:.git、.agents、.codex 递归只读。截至 2026-07-17。Codex 启动时还会替你猜:目录在版本控制里就推荐 Auto,不在就推荐 read-only —— 因为有 git 兜底的地方,试错成本低。2注 2OpenAI Codex 文档 · Sandbox —— 常见沙箱模式:read-only(只读,改文件 / 跑命令要批)、workspace-write(读 + 在工作区内写 + 跑常规本地命令,是低摩擦默认)、danger-full-access(无沙箱限制)。常见审批策略:untrusted(非信任集里的命令先问)、on-request(默认在沙箱内工作,越界才问)、never(不停下来问)。沙箱作用于派生命令(git、包管理器、测试器都继承同一边界),OS 原生强制(macOS Seatbelt、Linux/WSL2 bubblewrap、Windows 原生沙箱)。启动时检测:版本库目录推荐 Auto,非版本库推荐 read-only。截至 2026-07-17。想临时收紧,/permissions 一键切 read-only,只聊不改。1注 1OpenAI Codex 文档 · Agent approvals & security —— 安全控制来自两层:Sandbox mode 定它技术上能做什么(在哪写、能否联网),Approval policy 定它什么时候必须先问你。默认 agent 断网;本地用 OS 沙箱把它限制在工作区。Auto 预设(--sandbox workspace-write --ask-for-approval on-request)让它在工作目录里自动读、改、跑命令,越界(工作区外写、要联网)才问。可用 /permissions 切 read-only。默认 workspace-write 下网络关闭,需显式 [sandbox_workspace_write] network_access = true 打开。可写根里仍有保护路径:.git、.agents、.codex 递归只读。截至 2026-07-17。 Auto 档有两条默认的硬边界,值得记牢。其一:workspace-write 下网络默认是关的 —— 要放开得显式在 config 里写 network_access = true,断网是默认,不是意外。1注 1OpenAI Codex 文档 · Agent approvals & security —— 安全控制来自两层:Sandbox mode 定它技术上能做什么(在哪写、能否联网),Approval policy 定它什么时候必须先问你。默认 agent 断网;本地用 OS 沙箱把它限制在工作区。Auto 预设(--sandbox workspace-write --ask-for-approval on-request)让它在工作目录里自动读、改、跑命令,越界(工作区外写、要联网)才问。可用 /permissions 切 read-only。默认 workspace-write 下网络关闭,需显式 [sandbox_workspace_write] network_access = true 打开。可写根里仍有保护路径:.git、.agents、.codex 递归只读。截至 2026-07-17。其二:就算在可写的工作区里,也有几条保护路径:.git.agents.codex 递归只读 —— 它能改你的源码,但改不了版本库元数据和它自己的配置。1注 1OpenAI Codex 文档 · Agent approvals & security —— 安全控制来自两层:Sandbox mode 定它技术上能做什么(在哪写、能否联网),Approval policy 定它什么时候必须先问你。默认 agent 断网;本地用 OS 沙箱把它限制在工作区。Auto 预设(--sandbox workspace-write --ask-for-approval on-request)让它在工作目录里自动读、改、跑命令,越界(工作区外写、要联网)才问。可用 /permissions 切 read-only。默认 workspace-write 下网络关闭,需显式 [sandbox_workspace_write] network_access = true 打开。可写根里仍有保护路径:.git、.agents、.codex 递归只读。截至 2026-07-17。这两条是「放权但不失控」的地基:你放开的是工作区,不是整台机器。

III

规则:给命令前缀定白灰黑名单.

旋钮是粗调,规则是细调。规则(实验特性)控制 Codex 能在沙箱外跑哪些命令:一个 .rules 文件里用 prefix_rule 给命令前缀定裁决 —— allow 直接放行、prompt 每次问、forbidden 直接拦;多条命中,最严的赢。3注 3OpenAI Codex 文档 · Rules(实验特性)—— 用规则控制 Codex 能在沙箱外跑哪些命令。.rules 文件用 Starlark 写 prefix_rule(pattern 命令前缀、decision = allow / prompt / forbidden、justification、match / not_match 内联测试);多条匹配时最严的赢(forbidden > prompt > allow)。放 ~/.codex/rules/ 或项目 .codex/rules/(仅信任项目加载)。对 bash -lc 里 && 串起的复合命令,若只含普通词 + 安全操作符,Codex 会用 tree-sitter 拆开逐条判 —— 所以 git add . && rm -rf / 不会因你允许了 git add 就整条放行。codex execpolicy check 可测试规则。截至 2026-07-17。
~/.codex/rules/default.rules
prefix_rule(
    pattern = ["gh", "pr", "view"],
    decision = "prompt",
    justification = "看 PR 可以,但要我点头",
    match = ["gh pr view 7888", "gh pr view --repo openai/codex"],
    not_match = ["gh pr merge 7888"],
)

一条规则:gh pr view 允许但每次问,带内联测试

规则最要紧的一条性质,是它拆得开复合命令。有人把危险动作藏在安全命令后面 —— git add . && rm -rf /。只要这串命令是普通词加安全操作符,Codex 就用 tree-sitter 把它拆成两条逐个判:就算你允许了 git add,后面那条 rm -rf / 会被单独评估,整条命令因此不会被自动放行。3注 3OpenAI Codex 文档 · Rules(实验特性)—— 用规则控制 Codex 能在沙箱外跑哪些命令。.rules 文件用 Starlark 写 prefix_rule(pattern 命令前缀、decision = allow / prompt / forbidden、justification、match / not_match 内联测试);多条匹配时最严的赢(forbidden > prompt > allow)。放 ~/.codex/rules/ 或项目 .codex/rules/(仅信任项目加载)。对 bash -lc 里 && 串起的复合命令,若只含普通词 + 安全操作符,Codex 会用 tree-sitter 拆开逐条判 —— 所以 git add . && rm -rf / 不会因你允许了 git add 就整条放行。codex execpolicy check 可测试规则。截至 2026-07-17。写完规则用 codex execpolicy check 拿具体命令测一测,别等它到线上才发现规则写漏了。3注 3OpenAI Codex 文档 · Rules(实验特性)—— 用规则控制 Codex 能在沙箱外跑哪些命令。.rules 文件用 Starlark 写 prefix_rule(pattern 命令前缀、decision = allow / prompt / forbidden、justification、match / not_match 内联测试);多条匹配时最严的赢(forbidden > prompt > allow)。放 ~/.codex/rules/ 或项目 .codex/rules/(仅信任项目加载)。对 bash -lc 里 && 串起的复合命令,若只含普通词 + 安全操作符,Codex 会用 tree-sitter 拆开逐条判 —— 所以 git add . && rm -rf / 不会因你允许了 git add 就整条放行。codex execpolicy check 可测试规则。截至 2026-07-17。

IV

把审批本身交给一个 reviewer.

最后一层最有意思:审批不一定要你亲自点。approvals_reviewer 默认是 user(问你),改成 auto_review,越界请求就先送给一个独立的 reviewer agent 判 —— 它只看那些本来就要停下问人的动作:沙箱升权、被拦的网络请求、可写根外的改动、有副作用的 MCP 调用。4注 4OpenAI Codex 文档 · Auto-review —— 把沙箱边界上的人工审批换成一个独立的 reviewer agent:approvals_reviewer = "user"(默认)或 "auto_review"。它只评估那些本来就要停下问人的越界请求(沙箱升权、被拦的网络请求、可写根外的文件改动、有副作用的 MCP / app 调用),是审查者的替换,不是权限的放开。策略默认拦:外传私有数据 / 凭据、探凭据、持续削弱安全、有重大不可逆风险的破坏性动作。带熔断:同一轮连续 3 次拒绝(或滚动窗口内 10 次)就中止本轮;出错 fail closed。/approve 可对某个被拒动作放行一次重试。截至 2026-07-17。说清楚:这是审查者的替换,不是权限的放开 —— 它不扩大可写范围、不开网络、不动保护路径,只改「谁来审这个越界」。4注 4OpenAI Codex 文档 · Auto-review —— 把沙箱边界上的人工审批换成一个独立的 reviewer agent:approvals_reviewer = "user"(默认)或 "auto_review"。它只评估那些本来就要停下问人的越界请求(沙箱升权、被拦的网络请求、可写根外的文件改动、有副作用的 MCP / app 调用),是审查者的替换,不是权限的放开。策略默认拦:外传私有数据 / 凭据、探凭据、持续削弱安全、有重大不可逆风险的破坏性动作。带熔断:同一轮连续 3 次拒绝(或滚动窗口内 10 次)就中止本轮;出错 fail closed。/approve 可对某个被拒动作放行一次重试。截至 2026-07-17。 reviewer 的策略默认拦几类真危险的动作:把私有数据或凭据外传、探凭据、持续削弱安全、有重大不可逆风险的破坏。4注 4OpenAI Codex 文档 · Auto-review —— 把沙箱边界上的人工审批换成一个独立的 reviewer agent:approvals_reviewer = "user"(默认)或 "auto_review"。它只评估那些本来就要停下问人的越界请求(沙箱升权、被拦的网络请求、可写根外的文件改动、有副作用的 MCP / app 调用),是审查者的替换,不是权限的放开。策略默认拦:外传私有数据 / 凭据、探凭据、持续削弱安全、有重大不可逆风险的破坏性动作。带熔断:同一轮连续 3 次拒绝(或滚动窗口内 10 次)就中止本轮;出错 fail closed。/approve 可对某个被拒动作放行一次重试。截至 2026-07-17。它还带熔断:同一轮里连续拒绝 3 次(或滚动窗口内 10 次),Codex 直接中止本轮 —— 免得 agent 在越权尝试上死循环;判断出错时 fail closed(宁可拦错,不放过)。4注 4OpenAI Codex 文档 · Auto-review —— 把沙箱边界上的人工审批换成一个独立的 reviewer agent:approvals_reviewer = "user"(默认)或 "auto_review"。它只评估那些本来就要停下问人的越界请求(沙箱升权、被拦的网络请求、可写根外的文件改动、有副作用的 MCP / app 调用),是审查者的替换,不是权限的放开。策略默认拦:外传私有数据 / 凭据、探凭据、持续削弱安全、有重大不可逆风险的破坏性动作。带熔断:同一轮连续 3 次拒绝(或滚动窗口内 10 次)就中止本轮;出错 fail closed。/approve 可对某个被拒动作放行一次重试。截至 2026-07-17。被误拦了也有退路:/approve 对某个被拒动作放行一次重试。这一层是无人值守(第 8 章)真正的价值 —— 没有人在场时,得有个东西替你说不。 动手 · 把放权从直觉调成配置:

信方向就松档, 信不过的点用规矩钉死.

Trust the direction, loosen the dial; pin the points you don't with rules.

Aklman Library

讨论

讨论.

评论区初始化中…