0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Codex は既定で OPENAI_API_KEY などの環境変数を実行コマンドにそのまま渡す:shell_environment_policy で外す設定(codex 0.165.0で確認)

0
Posted at

この記事の要点

  • 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_policy controls which environment variables Codex passes to spawned commands.

ignore_default_excludes defaults to true, so Codex doesn't automatically remove variable names containing KEY, SECRET, or TOKEN. Set it to false to 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つの値があります。

同じ節によると、処理の順番は次のとおりです。

  1. 自動の除外(ignore_default_excludes = false のときの KEY / SECRET / TOKEN)
  2. filters の "exclude"
  3. set で指定した値
  4. filters の "include"(1つでもあると、当てはまる変数だけ残す)

パターンは大文字小文字を区別せず、* と ? が使えます(同節)。

2. 設定なしで試す

ダミーの変数を入れて、サンドボックス内の env を見ます。

demo.sh(抜粋)
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)に次のように書きました。

~/.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 で何が渡るかを一度確かめてください。

参考

※ 仕様は 2026-10-29 時点の公式ドキュメントに基づきます。動作は Linux の使い捨て環境で、codex sandbox を使ってのみ試しました。

更新情報やちょっとしたTipsは X(@supportapp3_lab)で発信しています。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?