Codex がシェルに渡す環境変数を制限する shell_environment_policy の設定(API キーを渡さない)
Codex CLI が実行するコマンドに引き継がれる環境変数を config.toml の shell_environment_policy で制御する方法を解説します。inherit の 3 つの値、KEY/SECRET/TOKEN を含む変数の既定の扱い、filters と set の書き方、適用順序をまとめます。
Codex がテストやビルドのコマンドを実行するとき、あなたのシェルにある環境変数はどこまでコマンド側に引き継がれるのでしょうか。AWS_SECRET_ACCESS_KEY や OPENAI_API_KEY がそのまま渡っていれば、Codex が生成したコマンドがそれらを読める状態です。
結論として、引き継ぎの範囲は config.toml の [shell_environment_policy] で決まります。inherit で土台を選び、ignore_default_excludes = false で KEY/SECRET/TOKEN を含む変数を落とし、filters と set で細かく調整します。
KEY POINT
この記事で分かること
inheritの 3 つの値(all/core/none)と既定- KEY / SECRET / TOKEN を含む変数が既定でどう扱われるか
filters、set、旧形式のexclude/include_onlyの書き方と適用順序
既定の挙動
公式のサンプル設定には、既定値がコメントで示されています。
| キー | 既定 | 意味 |
|---|---|---|
inherit | "all" | シェルの環境変数をすべて引き継ぐ |
ignore_default_excludes | true | 名前に KEY / SECRET / TOKEN を含む変数の自動除外を スキップする(= 除外しない) |
set | {} | 明示的に追加・上書きする値 |
experimental_use_profile | false | サブプロセス起動時にユーザーのシェルプロファイルを使う(実験的) |
つまり既定では、秘密情報らしい名前の変数も含めてすべてがコマンドに渡ります。「自動除外がある」と説明されることが多い機能ですが、既定ではその除外が無効になっている点に注意してください。
用語解説
inherit の値: all はシェルの環境をそのまま、core は必要最小限の変数(公式は "trimmed set of essential variables" と表現)、none は空の環境から始めます。core と none では、set で足した値と include パターンで許可した値だけがコマンドに届きます。
秘密情報を渡さない最小の設定
まず自動除外を有効にします。これだけで、名前に KEY、SECRET、TOKEN を含む変数がコマンドから消えます。
[shell_environment_policy]
inherit = "all"
ignore_default_excludes = false
名前にそれらの語を含まない秘密情報(DATABASE_URL に埋め込んだパスワードなど)は対象外なので、次の filters で個別に除外します。
filters と set で調整する
[shell_environment_policy.filters] にパターンと動作を書きます。パターンは大文字小文字を区別せず、* と ? が使えます。
[shell_environment_policy]
inherit = "core"
ignore_default_excludes = false
set = { CI = "1", NODE_ENV = "test" }
[shell_environment_policy.filters]
"AWS_*" = "exclude"
"AZURE_*" = "exclude"
"DATABASE_URL" = "exclude"
適用順序は公式ドキュメントによると次のとおりです。
- 自動除外(
ignore_default_excludes = falseのとき、KEY / SECRET / TOKEN を含む名前) filtersなどの明示的な除外setの値- include パターンの許可リスト
set で足した値も、その後の include パターンに一致しなければ落とされる点に注意してください。
旧形式の exclude = [...] と include_only = [...] も引き続き使えますが、同じ設定レイヤーで [filters] と同時には使えません。新しく書くなら filters に統一します。
MCP サーバーの env は別枠
shell_environment_policy が制御するのは、Codex がシェルで実行するコマンドの環境です。MCP サーバーに渡す環境変数は [mcp_servers.<id>.env] と env_vars で別に指定します。秘密情報を MCP サーバーに渡す必要があるなら、そちらで最小限に絞ってください。詳しくは Codex CLI に MCP サーバーを設定する を参照してください。
サンドボックスとの関係
環境変数の制限は「読めるものを減らす」対策です。ファイルの書き込み範囲やネットワークは別の仕組み(sandbox_mode と sandbox_workspace_write)で制御します。全体像は親記事の config.toml でモデル・推論の深さ・プロファイルを切り替える と、approval mode と sandbox 設定の違い にまとめています。秘密情報の扱いは AI コーディングツールと秘密情報の管理 も参照してください。
まとめ
- 既定は
inherit = "all"かつignore_default_excludes = trueで、KEY / SECRET / TOKEN を含む変数もコマンドに渡る ignore_default_excludes = falseにすると、それらの名前の変数が自動で除外される- 名前で判別できない秘密情報は
[shell_environment_policy.filters]で"パターン" = "exclude"と書く inherit = "core"/"none"とsetで「必要な変数だけ渡す」構成にできる- 適用順序は 自動除外 → 明示除外 →
set→ include 許可。MCP サーバーの env は別設定
よくある質問
- 既定では Codex のコマンドに API キーは渡りますか?
- サンプル設定によると inherit の既定は all で、ignore_default_excludes の既定は true です。つまり既定では KEY/SECRET/TOKEN を含む変数も含めてすべて渡ります。除外したい場合は ignore_default_excludes = false にします。
- 特定のプレフィックスの変数だけ渡さないようにできますか?
- はい。[shell_environment_policy.filters] に "AWS_*" = "exclude" のようにパターンを書きます。大文字小文字は区別されず、* と ? が使えます。
- 逆に、必要な変数だけを渡すには?
- inherit = "core" か "none" にしてから、set で必要な値を明示するか、include パターンで許可する変数を絞ります。
参考にした一次情報
この記事は公式ドキュメントを基に AI が下書きを作成し、運営者が内容を確認して公開しています。誤りを見つけた場合は お問い合わせからお知らせください。