この記事の要点
- Codex がコマンドを実行するとき、どの環境変数を渡すかは
config.tomlの[shell_environment_policy]で決まります(公式 Advanced Configuration の "Shell environment policy" 節)。 - 公式によると
ignore_default_excludesの既定はtrueで、名前にKEY/SECRET/TOKENを含む変数も自動では外しません。手元で試すと、設定なしではOPENAI_API_KEYやGITHUB_TOKEN(ダミー値)がそのままコマンドに渡りました。 -
ignore_default_excludes = falseにすると、それらは外れました。ただしDB_PASSWORDや、URL の中にパスワードを含むDATABASE_URLは名前が当てはまらないので残りました。filtersで追加で外す必要があります。 - 確認は codex-cli 0.165.0 の
codex sandbox(ログイン不要)で行いました。ログインしたエージェント本体が実行するコマンドでは試していません。
背景
API キーを export したシェルや、.env をシェルに読み込む仕組み(direnv など)を使っているシェルで AI コーディングエージェントを起動すると、そのシェルの環境変数がエージェントの実行するコマンドにも渡るのかが気になりました。
Codex には、渡す環境変数を絞る shell_environment_policy という設定があります。公式の説明と、手元での動きを確かめます。
確かめた環境
- codex-cli 0.165.0(npm の
@openai/codex) - Debian GNU/Linux 13 (trixie)、kernel 6.12.94
-
CODEX_HOMEとHOMEは使い捨てのディレクトリにし、~/.codexには触れていません - 値はすべてダミーです。筆者の環境変数が混ざらないよう、
env -iで空にした環境から始めました -
codex sandbox -- <コマンド>(ヘルプの説明は "Run commands within a Codex-provided sandbox")で、サンドボックス内のコマンドから見える環境変数をenvで表示しました
試していないこと
- ログインした Codex 本体(エージェントのセッション)が実行するコマンドでの動き。公式の説明は「Codex が起動するコマンド(spawned commands)に渡す変数」なので、同じ設定が効くと考えられます(推測)。
- macOS・Windows での動き。
1. 公式ドキュメントの記述
Advanced Configuration の "Shell environment policy" 節に、次のように書かれています。
shell_environment_policycontrols which environment variables Codex passes to spawned commands.
ignore_default_excludesdefaults totrue, so Codex doesn't automatically remove variable names containingKEY,SECRET, orTOKEN. Set it tofalseto apply those automatic exclusions before your explicit filters run.
Configuration Reference にも shell_environment_policy.ignore_default_excludes の説明として「(default: true)」とあります。また shell_environment_policy.inherit には all | core | none の3つの値があります。
同じ節によると、処理の順番は次のとおりです。
- 自動の除外(
ignore_default_excludes = falseのときの KEY / SECRET / TOKEN) -
filtersの"exclude" -
setで指定した値 -
filtersの"include"(1つでもあると、当てはまる変数だけ残す)
パターンは大文字小文字を区別せず、* と ? が使えます(同節)。
2. 設定なしで試す
ダミーの変数を入れて、サンドボックス内の env を見ます。
export OPENAI_API_KEY=dummy-openai GITHUB_TOKEN=dummy-gh STRIPE_SECRET=dummy-stripe
export AWS_ACCESS_KEY_ID=dummy-aws DB_PASSWORD=dummy-db DATABASE_URL=postgres://app:dummy-pass@db/app
export my_api_key=dummy-lower MONKEY_MODE=on
show='env | grep -iE "^(OPENAI_API_KEY|GITHUB_TOKEN|STRIPE_SECRET|AWS_ACCESS_KEY_ID|DB_PASSWORD|DATABASE_URL|my_api_key|MONKEY_MODE|LANG|HOME)=" | sort'
codex sandbox -- sh -c "$show"
実行結果(HOME は使い捨てのディレクトリです):
AWS_ACCESS_KEY_ID=dummy-aws
DATABASE_URL=postgres://app:dummy-pass@db/app
DB_PASSWORD=dummy-db
GITHUB_TOKEN=dummy-gh
HOME=/workspace/gqx/tmp/codex-env/home
LANG=C.UTF-8
MONKEY_MODE=on
OPENAI_API_KEY=dummy-openai
STRIPE_SECRET=dummy-stripe
my_api_key=dummy-lower
設定なしでは、入れた変数がすべてコマンドに渡りました。公式の「既定では自動で外さない」という記述と合っています。
3. ignore_default_excludes = false にする
codex sandbox -c shell_environment_policy.ignore_default_excludes=false -- sh -c "$show"
DATABASE_URL=postgres://app:dummy-pass@db/app
DB_PASSWORD=dummy-db
HOME=/workspace/gqx/tmp/codex-env/home
LANG=C.UTF-8
-
OPENAI_API_KEY・GITHUB_TOKEN・STRIPE_SECRET・AWS_ACCESS_KEY_IDは消えました。 - 小文字の
my_api_keyも消えました(大文字小文字を区別しないため)。 -
MONKEY_MODEも消えました。名前にKEYという文字列を含むためです。秘密でない変数が消えて困るときは、setで戻せます(下の 5. を参照)。 -
DB_PASSWORDとDATABASE_URLは残りました。 名前に KEY / SECRET / TOKEN を含まないためです。DATABASE_URLは URL の中にパスワードが入っていても、名前だけでは判定されません。
4. 残ったものを filters で外す
$CODEX_HOME/config.toml(ふつうは ~/.codex/config.toml)に次のように書きました。
[shell_environment_policy]
ignore_default_excludes = false
[shell_environment_policy.filters]
"*PASSWORD*" = "exclude"
"DATABASE_URL" = "exclude"
"AWS_*" = "exclude"
codex sandbox -- sh -c "$show"
HOME=/workspace/gqx/tmp/codex-env/home
LANG=C.UTF-8
入れたダミーの秘密情報は、すべて渡らなくなりました。外したい変数の名前は、プロジェクトごとに違います。env | cut -d= -f1 | sort で手元の変数名を一覧にして、外すものを決めてください(値は表示されません)。
5. もっと絞るなら inherit = "core"
inherit = "core" にすると、最初から少ない変数だけを引き継ぎます。
codex sandbox -c 'shell_environment_policy.inherit="core"' -- sh -c "$show"
HOME=/workspace/gqx/tmp/codex-env/home
LANG=C.UTF-8
別の試行では、inherit = "core" のとき、渡した変数のうち残ったのは HOME・LANG・PATH だけでした。core にどの変数が含まれるかの一覧は、公式ページでは見つけられませんでした。
inherit = "none" では PATH も渡らず、env に出たのは CODEX_SANDBOX_NETWORK_DISABLED=1 と PWD だけでした。必要な変数は set で足せます(例: set = { PATH = "/usr/bin:/bin" } で PATH が渡ることを確認)。
set は除外のあとに入るので、外した変数を戻すこともできます。ignore_default_excludes=false に set={GITHUB_TOKEN="from-set"} を足すと、GITHUB_TOKEN=from-set が渡りました。公式の "Because set runs after exclusions, it can restore an excluded variable." と合っています。
6. 注意点
- 公式によると、古い
exclude/include_onlyの配列と[shell_environment_policy.filters]を同じ設定の層で一緒に使うと、Codex はエラーにします("Shell environment policy" 節)。 - この設定が絞るのは環境変数です。作業フォルダの
.envファイルの中身を読めるかどうかは別の話です。ファイルを読ませない設定は、permission profile の deny で行います(公式 "Permissions")。筆者の過去記事「Codex CLIに.envを読ませない設定」で試しています。 - 公式によると、プロジェクトの
.codex/config.tomlは、そのプロジェクトを信頼したときだけ読み込まれます(Advanced Configuration "Project config files")。自分の環境で確実に効かせたい設定は、ユーザー側の~/.codex/config.tomlに書くのがよいと考えます(推測)。
まとめ
- Codex は公式の既定では、KEY / SECRET / TOKEN を含む環境変数も自動では外しません。設定なしでは、ダミーの
OPENAI_API_KEYなどがコマンドに渡りました(codex 0.165.0 のcodex sandboxで確認)。 -
ignore_default_excludes = falseで名前に KEY / SECRET / TOKEN を含むものは外れますが、DB_PASSWORDやDATABASE_URLはfiltersで別に外す必要がありました。 - 設定したら、
codex sandbox -- envで何が渡るかを一度確かめてください。
参考
- Advanced Configuration – Codex(Shell environment policy / Project config files)
- Configuration Reference – Codex(shell_environment_policy.*)
- Permissions – Codex
※ 仕様は 2026-10-29 時点の公式ドキュメントに基づきます。動作は Linux の使い捨て環境で、codex sandbox を使ってのみ試しました。
更新情報やちょっとしたTipsは X(@supportapp3_lab)で発信しています。