04 - Sandbox 與 Approval 權限模型

03-互動模式基本操作 | 00-Index | 下一篇 → 05-AGENTS-md與config-toml

⚠️ 這是 Codex CLI 最該讀懂的一章。 兩個獨立的旋鈕,搞混會出事。


核心觀念:兩個獨立的旋鈕

┌──────────────────────┐        ┌──────────────────────┐
│   sandbox_mode       │        │   approval_policy    │
│                      │        │                      │
│  技術上「能不能做」    │   ×    │  「什麼時候問你」      │
│  (作業系統層級隔離)  │        │                      │
└──────────────────────┘        └──────────────────────┘

🔑 sandbox_mode 控制 Codex 技術上能做什麼;approval_policy 控制它什麼時候必須先問你。把它們當成分開的控制項。

這跟 Claude Code 只有一個 permission-mode 維度不同。好處是更精確,代價是要多想一層。


Sandbox modes(能做什麼)

模式允許
read-only指令可以檔案,不能寫
workspace-write可以寫在目前 repo 和暫存目錄
danger-full-access可以寫任何地方 ⚠️

danger-full-access 是「不受限制的檔案系統政策」,官方定位是只有在外層環境已經提供隔離時才用(容器、VM、CI runner)。

workspace-write 底下還有一個細部設定表 [sandbox_workspace_write],可以調整:

  • network_access — 沙箱內能不能連網
  • writable_roots — 除了 repo 之外還能寫哪些路徑

Approval policies(什麼時候問)

政策行為
untrusted只有被視為可信的指令能不經核准直接跑
on-requestCodex 自己決定何時要求升級權限(日常預設)
never從不問;被拒絕的操作直接失敗並把結果回給模型

選法:

  • never 適合信任的開發機(你已經用 sandbox 圈好範圍了)
  • untrusted無人值守的 CI 和正式環境的正確預設

常用組合

組合用途
read-only + untrusted最保守:純分析、審查、盤點
read-only + never純分析且不打擾(適合自動化盤點)
workspace-write + on-request日常開發預設
workspace-write + never量產模式(= --full-auto
danger-full-access + never⚠️ 只在容器 / VM 裡

--full-auto 是什麼

--full-auto 是一個便利旗標:讓 Codex 不問核准,並把 sandbox 強制設成 workspace-write

也就是說 --full-autoapproval_policy = "never" + sandbox_mode = "workspace-write"

這是 被 Herdr 編排時 最常用的組合:worker 不能停下來等人,但也不該能寫到 repo 外面。

⚠️ --full-auto 不等於「什麼都能做」。 sandbox 還在,它寫不出 repo 和暫存目錄。想關掉沙箱要另外明確指定 danger-full-access——不要因為想省事就這樣做


在設定檔裡

~/.codex/config.toml

approval_policy = "on-request"
sandbox_mode = "workspace-write"
 
[sandbox_workspace_write]
network_access = false

用 profile 準備好幾組:

[profiles.paranoid]
approval_policy = "untrusted"
sandbox_mode = "read-only"
 
[profiles.ci]
approval_policy = "never"
sandbox_mode = "workspace-write"
codex --profile paranoid    # 純分析
codex --profile ci          # 無人值守

給你兩個 repo 的建議

Obsidian-med-note(醫學筆記庫)

[profiles.vault-audit]
approval_policy = "never"
sandbox_mode = "read-only"          # 盤點、稽核:物理上改不到你的筆記
 
[profiles.vault-format]
approval_policy = "never"
sandbox_mode = "workspace-write"    # 格式修補:能改,但寫不出 repo

🔴 強烈建議盤點類任務一律用 read-only 你的筆記是不可重建的資產(很多是查過 PubMed 才寫出來的),而 obsidian-git 每 10 分鐘會自動 commit——一旦被改壞,很可能在你發現之前就被推上去了

read-only作業系統層級的保證,比在 prompt 裡寫「不要改檔」可靠得多。

Taiwan_IM_board(刷題網站)

[profiles.exam-draft]
approval_policy = "never"
sandbox_mode = "workspace-write"

詳解量產寫進 tmp_drafts/,在 repo 內,workspace-write 剛好夠用。


--skip-git-repo-check

Codex 預設要求在 git repo 裡跑,這是為了避免無法回退的破壞性變更。

codex exec --skip-git-repo-check "..."

⚠️ 這個 flag 只跳過該指令的「非互動 repo 守衛」,不會關掉 sandbox。 但也代表你失去了 git 這層安全網——用之前想清楚。


網路存取

[sandbox_workspace_write]network_access 控制沙箱內能不能連網。

什麼時候需要開:安裝相依套件、抓 API 資料。 什麼時候該關:處理敏感資料時(你的醫學筆記、理財對帳單)。

💡 關掉網路是防資料外流最簡單的一招。 一個做格式稽核的 worker 根本不需要連網。


一個實務上的心智模型

把兩個旋鈕想成安全帶和速限

  • sandbox = 安全帶:出事時保護你。永遠繫著,跟你開多快無關。
  • approval = 速限:決定你被攔下來的頻率。信任的路段可以放寬。

最常見的錯誤是「因為一直被問而直接跳到 danger-full-access——那是把安全帶解掉來解決被開罰單的問題。正確做法是調 approval,不是調 sandbox


🔗 相關筆記


最後更新:2026-08-04