Codex CLI の approval mode と sandbox 設定の違い:安全に自動実行させる組み合わせ
Codex CLI の承認ポリシー(approval)とサンドボックス(sandbox)の違いと組み合わせを解説します。各選択肢の意味、--full-auto の中身、config.toml での固定方法、ネットワーク制限の設定を紹介します。
目次
Codex CLI の安全性は、承認ポリシー(approval) と サンドボックス(sandbox) の 2 つの独立した設定で決まります。この 2 つを混同すると、「確認なしにしたのにコマンドが失敗する」「確認しているのにファイルが書き換わっていた」といった混乱が起きます。
この記事では、それぞれの選択肢の意味、組み合わせたときの挙動、用途別の推奨設定を整理します。
KEY POINT
この記事で分かること
- 承認ポリシーとサンドボックスの役割の違い
- 各選択肢の意味と、
--full-autoの中身 - 用途別(調査・日常開発・CI)の推奨設定と config.toml への書き方
2 つの設定の役割
| 設定 | 決めること | 効く場所 |
|---|---|---|
| approval(承認ポリシー) | 操作の前にユーザーへ確認するかどうか | Codex の判断・対話フロー |
| sandbox(サンドボックス) | 実行されるコマンドが OS レベルで何をできるか | macOS の Seatbelt、Linux の Landlock/seccomp などの OS 機構 |
承認は「聞くかどうか」、サンドボックスは「できるかどうか」です。承認を全部省略しても、サンドボックスが読み取り専用なら書き込みは物理的にできません。逆に、サンドボックスを全開放しても、承認が毎回入れば実行前に止められます。
承認ポリシーの選択肢
--ask-for-approval(短縮形 -a)または config.toml の approval_policy で指定します。
| 値 | 意味 |
|---|---|
untrusted | 安全と判断された読み取り系コマンド以外は毎回確認する。もっとも保守的 |
on-request | Codex が必要と判断したときだけ確認する(既定に近い挙動) |
on-failure | サンドボックス内で実行し、失敗したときだけ「サンドボックス外で再実行してよいか」を確認する |
never | 一切確認しない。失敗しても聞かずに進む。CI 向け |
用語解説
サンドボックス外での再実行: on-failure では、サンドボックスの制限(ネットワーク不可など)でコマンドが失敗した場合に、制限を外して再実行する許可を求めます。「npm install がネットワークで失敗した」ような場面で使われます。
サンドボックスの選択肢
--sandbox または config.toml の sandbox_mode で指定します。
| 値 | ファイル読み取り | ファイル書き込み | ネットワーク |
|---|---|---|---|
read-only | 可 | 不可 | 不可 |
workspace-write | 可 | ワークスペース(カレントディレクトリ配下)と一時領域のみ | 既定で不可(設定で許可可能) |
danger-full-access | 可 | どこでも | 可 |
workspace-write でも、.git ディレクトリへの直接書き込みは制限されることがあります。Git 操作は Codex が通常のコマンドとして実行するため、通常は問題になりません。
--full-auto の中身
--full-auto は、サンドボックスを workspace-write にし、承認を減らして自律的に進める省略形です。ワークスペースの外には書き込めず、ネットワークも既定では無効なので、「ワークスペース内なら自由にやってよい」という設定と理解してください。
codex --full-auto "テストが通るようにリファクタリングして"
danger-full-access は隔離環境だけで使う
--sandbox danger-full-access と -a never の組み合わせは、任意のコマンドが確認なしに実行されます。ホスト環境では使わず、使い捨てのコンテナや CI ランナーに限定してください。--dangerously-bypass-approvals-and-sandbox も同様です。
用途別の推奨設定
| 用途 | approval | sandbox | 補足 |
|---|---|---|---|
| コードの調査・質問 | on-request | read-only | 誤って変更されない |
| 日常の開発 | on-request | workspace-write | 既定に近い。外部影響のある操作は確認される |
| 長い自律タスク(ローカル) | on-failure | workspace-write | 失敗時だけ判断する |
| CI・コンテナ内 | never | workspace-write または danger-full-access | 環境が使い捨てであることが前提 |
config.toml で固定する
毎回オプションを付けるのは面倒なので、~/.codex/config.toml に書きます。
approval_policy = "on-request"
sandbox_mode = "workspace-write"
[sandbox_workspace_write]
# npm install などでネットワークが必要な場合に true にする
network_access = false
用途ごとにプロファイルを分けておくと、--profile で切り替えられます。
[profiles.readonly]
approval_policy = "on-request"
sandbox_mode = "read-only"
[profiles.auto]
approval_policy = "on-failure"
sandbox_mode = "workspace-write"
codex --profile readonly "この関数の呼び出し元を洗い出して"
codex --profile auto "lint エラーを全部直して"
プロファイルの詳細は config.toml でモデルとプロファイルを切り替える を参照してください。
対話中に切り替える
セッション中は /approvals コマンドで承認モードを切り替えられます。調査だけのつもりで始めて、途中から実装に移るときに使います。
Claude Code との対応関係
Claude Code には OS レベルのサンドボックスの代わりに、ツール単位の permissions(allow / deny / ask)があります。「危険なコマンドを禁止する」という目的は同じですが、Codex は OS 機構で物理的に制限し、Claude Code はルールで制御する、という違いがあります。両者の比較は Codex と Claude Code の違いと使い分け で扱っています。
まとめ
- approval は「確認するか」、sandbox は「OS レベルで何ができるか」。独立した 2 つの設定
- 日常開発は
on-request+workspace-write、調査はread-only、CI はnever --full-autoはworkspace-writeで自律的に進める省略形。ワークスペース外やネットワークは制限されるdanger-full-accessとneverの組み合わせは隔離環境専用
よくある質問
- approval と sandbox はどう違いますか?
- approval は「実行前にユーザーへ確認するか」、sandbox は「実行時に OS レベルで何を許可するか」です。approval を never にしても、sandbox が read-only ならファイルは変更されません。
- --full-auto は危険ですか?
- --full-auto はワークスペース内の書き込みを許可し、確認を減らす設定です。ワークスペース外への書き込みやネットワークはサンドボックスで制限されるため、全許可(danger-full-access)よりは安全です。
- サンドボックス内でネットワークは使えますか?
- workspace-write では既定でネットワークが無効です。config.toml の sandbox_workspace_write.network_access で有効にできます。
読者からの質問と回答
Q. Codex で「approval required by policy, but AskForApproval::Granular.sandbox_approval is false」と出て処理が止まります。UI では「Ask for approval」を選んでいて、config.toml に approval_policy は書いていません。何を設定すればよいですか。
このエラー文が出ている時点で、granular 形式の approval policy が実際に効いています。approval_policy は on-request、never、または { granular = { ... } } の 3 形態で、granular 形式では承認プロンプトの種類ごとに「出すか、自動で拒否するか」を決めます。公式の設定リファレンスに載っているフィールドは次の 5 つです。
| フィールド | true のときの意味 |
|---|---|
sandbox_approval | サンドボックスのエスカレーション承認プロンプトを出す |
rules | execpolicy の prompt ルールによる承認を出す |
mcp_elicitations | MCP の elicitation プロンプトを自動拒否せず出す |
request_permissions | request_permissions ツールからのプロンプトを出す |
skill_approval | スキルスクリプトの承認プロンプトを出す |
sandbox_approval が false だと、サンドボックスのエスカレーション承認はプロンプトを出さずに拒否されます。エラー文はその状態をそのまま述べたものです。対話的に承認したいなら、~/.codex/config.toml に次のどちらかを書きます。
# 承認プロンプトをすべて出す(対話実行の推奨値)
approval_policy = "on-request"
# 種類を選んで出す
[approval_policy.granular]
sandbox_approval = true
rules = true
mcp_elicitations = true
request_permissions = true
skill_approval = true
untrusted は未サポート、on-failure は非推奨で、対話実行では on-request を使うよう公式に案内されています。
ユーザーの config.toml に approval_policy を書いていないのにこのエラーが出る場合、値はそれ以外の経路から来ています。公式ドキュメントには、Agent Security UI で管理者が「Allowed approval policies」を指定する managed requirements の仕組みが載っており、これは管理者側の設定でユーザー設定ではありません。もう 1 つ関係するキーが approvals_reviewer で、「on-request または granular の承認ポリシーで、対象の承認プロンプトを誰がレビューするか」を決め、既定は user です。この設定はサンドボックス自体や、サンドボックス内で既に許可されている動作を変えません。
注意
デスクトップアプリの「Ask for approval」という UI 設定が、これらの approval_policy のキーにどう対応するかは、公式ドキュメントでは確認できませんでした。UI の表示と実際に効いているポリシーが食い違う場合は、config.toml に明示的に書くほうが確実です。
設定の全体像は Codex の承認ポリシーとサンドボックスの設定 にまとめてあります。
Q. Codex で「requires approval, but approval policy is never」と出て実行されません。何を直せばよいですか?
このメッセージは「その操作は承認を求める必要があるが、承認ポリシーが never なので誰にも聞けない」という状態を指しています。承認を出せないので、そのまま拒否されます。
2026 年 10 月 6 日時点の公式設定リファレンスでは、approval_policy に指定できる形は 3 つです。
| 値 | 挙動 |
|---|---|
on-request | 対話的な実行向け。必要なときに確認を出す |
never | 非対話的な実行向け。確認を出さない |
{ granular = { ... } } | 確認の種類ごとに、出すか自動で拒否するかを決める |
ドキュメントにはこう書かれています。
untrustedis unsupported, andon-failureis deprecated; useon-requestfor interactive runs orneverfor non-interactive runs.(
untrustedはサポートされず、on-failureは非推奨です。対話的な実行にはon-request、非対話的な実行にはneverを使ってください。)
手元で操作しながら使っているなら、never ではなく on-request が想定された値です。
approval_policy = "on-request"
一部の確認だけ出したい場合は granular を使います。true にした種類だけ確認が表に出て、false の種類は自動的に拒否されます。
[approval_policy.granular]
sandbox_approval = true # サンドボックスのエスカレーション確認
rules = true # execpolicy の prompt ルールによる確認
mcp_elicitations = true # MCP の elicitation
request_permissions = true # request_permissions ツールからの確認
skill_approval = true # スキルスクリプトの承認確認
外部サービスの操作が止まる場合は mcp_elicitations が関係します。never のままだと、MCP サーバーからの確認要求が自動で拒否されるため、サインインや許可を求める操作が進みません。
注意
granular で false にした種類は「確認が出ない」ではなく「自動で拒否される」です。止めたい操作がある場合は、承認ポリシーではなく sandbox_mode と権限側で絞ってください。
なお、引用元の報告は「同じ操作が Web では成功し、デスクトップアプリでは失敗する」という内容で、bug ラベルが付いています。プラットフォーム間で有効な承認ポリシーが食い違う原因そのものは、公式ドキュメントでは確認できませんでした。 設定を直しても解消しない場合は、その報告の経過を追ってください。
承認ポリシーとサンドボックスの組み合わせは Codex の承認モードとサンドボックスを使い分ける にまとめています。
Q. Codex で npm install が失敗します。サンドボックスのせいですか?
はい。workspace-write サンドボックスは既定でネットワークを遮断するため、パッケージのダウンロードが失敗します。承認ポリシーが on-failure なら「サンドボックス外で再実行してよいか」を聞かれるので許可すれば通ります。毎回聞かれたくない場合は ~/.codex/config.toml でネットワークだけ許可します。
sandbox_mode = "workspace-write"
[sandbox_workspace_write]
network_access = true
ネットワークを許可すると外部へのデータ送信も可能になるので、信頼できるリポジトリでだけ有効にしてください。調査だけの作業は read-only のままで問題ありません。
参考にした一次情報
この記事は公式ドキュメントを基に AI が下書きを作成し、運営者が内容を確認して公開しています。誤りを見つけた場合は お問い合わせからお知らせください。