hook や MCP サーバを使っていて、APIキーやクラウド認証情報が外部プログラムに漏れるのを防ぎたい人向け
GitHubで拾った野良のMCPサーバや、チームで共有しているhookをClaudeに動かさせる場面で、自分のAPIキーやクラウドの本番キーがその別プログラムに丸見えにならないようにしたいとき、値を 1 にしてClaude Codeを起動する。常時効かせたいなら settings.json の env ブロックに書いておく
Claude Code は、こちらの指示に応じて裏で別のプログラムを立ち上げます。Bashツールでコマンドを走らせるとき、hook が発火するとき、MCPサーバと通信するとき。このとき、立ち上がった別プログラムには、あなたのパソコンが起動時に覚えている設定値が一式そのまま渡ります。その中に Anthropic のAPIキーや AWS・GCP・Azure のクラウド認証情報が入っていると、そのキーが別プログラムから丸見えになります。
CLAUDE_CODE_SUBPROCESS_ENV_SCRUB に 1 を入れておくと、その「別プログラムに渡る設定値の束」から、Anthropic とクラウド系の認証情報だけを抜き取ってから渡します。野良のMCPサーバや、誰かが書いたhookにキーを盗まれる経路を1本塞ぐ、という設定です。
噛み砕くと
新しく雇った業者に、家の合鍵を渡さず作業させるイメージが近いです。Claude本体は信頼して鍵を持たせてある。でも、Claudeが呼び出す下請けプログラムまで全員に合鍵が回ると、その中に1人でも悪い人がいたら鍵をコピーされます。
この設定は「下請けに渡す前に、鍵だけポケットから抜いておく」動きをします。下請けは普通に作業はできる。ただ鍵束は持たされない。それだけのことです。
名前が長くてギョッとしますが、やってることは地味です。
大事な前提:これはClaude本体ではなく「子プロセス」だけの話
勘違いしやすいのでここで止めます。この設定で認証情報が抜かれるのは、Claudeが呼び出す子プロセスの中だけです。子プロセスとは、Claudeが何かを実行するために裏で立ち上げる別プログラムのことです。
Claude本体が持っているキーには手を付けません。だからこれを 1 にしても、Claudeが普通にAPIを使って返事を返す動きは何も変わりません。「キーを消したらClaudeが喋らなくなるのでは」という心配は要らないです。
「外部のMCPサーバやhookを動かす」場面で、実際にどう設定するか
テーマは「Claudeに外部のMCPサーバやhookを動かさせるとき、自分のキーがそのプログラムに見えないようにしたい」状況です。順に見ます。
ステップ1: いま設定値に何が入っているか確認する
まず、自分のパソコンが今どんなキーを覚えているか見ます。ターミナルで1行打ちます。ターミナルとは、黒い画面に文字でコマンドを打ち込む画面のことです。
$ echo $ANTHROPIC_API_KEY
長い文字列が返ってきたら、それが子プロセスにも丸ごと渡る状態です。空っぽなら、そもそも渡るキーがないので慌てなくていいです。
ステップ2: スクラブを有効にしてClaude Codeを起動する
その場限りで試すなら、ターミナルで次の2行を続けて打ちます。
$ export CLAUDE_CODE_SUBPROCESS_ENV_SCRUB=1
$ claude
1行目で「子プロセスから認証情報を抜く」スイッチをオンにし、2行目でClaude Codeを立ち上げます。この順番が大事です。先にオンにしてから起動します。
ステップ3: 試しにBashツールで設定値を覗いてみる
Claudeに「echo $ANTHROPIC_API_KEY を実行して」と頼みます。スクラブが効いていれば、ここで出力は空っぽになります。
ここで初心者がやりがちな勘違いがあります。「空っぽ=壊れた」ではありません。むしろ狙い通りです。Bashツールが立ち上げた子プロセスからキーが抜かれているので、見えないのが正解です。
ステップ4: 野良のMCPサーバをつなぐ
ネットで拾ってきたMCPサーバを設定して、Claudeから使わせてみます。スクラブが効いていれば、そのMCPサーバのプログラムからも Anthropic キーやクラウドのキーは見えません。
仮にそのMCPサーバが「裏でキーを外部に送る」悪さを仕込んでいても、送る対象のキーが手元に無い、という状態を作れます。
ステップ5: Linuxなら隔離が一段強くなる
使っているのがLinuxで、Claude Codeが v2.1.98 以降なら、この設定をオンにすると「PID名前空間分離」という隔離も一緒に効きます。子プロセスから他のプログラムの存在自体が見えなくなる、OS側の仕切りです。
公式CHANGELOGはこう書いています。
Added subprocess sandboxing with PID namespace isolation on Linux when
CLAUDE_CODE_SUBPROCESS_ENV_SCRUBis set, andCLAUDE_CODE_SCRIPT_CAPSenv var to limit per-session script invocations
初登場の v2.1.83 時点では、認証情報を抜く動きだけでした。
Added
CLAUDE_CODE_SUBPROCESS_ENV_SCRUB=1to strip Anthropic and cloud provider credentials from subprocess environments (Bash tool, hooks, MCP stdio servers)
macOS と Windows では、この隔離は付きません。認証情報を抜く動きだけが効く、という整理です。
ステップ6: 恒久化する
ステップ2の export は、その画面を閉じると消えます。毎回オンにしたいなら、設定ファイルに書いておきます。
{
"env": {
"CLAUDE_CODE_SUBPROCESS_ENV_SCRUB": "1"
}
}
これを settings.json の env ブロックに入れておけば、どう起動しても最初から効きます。settings.json は、Claude Codeの動きをあらかじめ書いておく設定ファイルです。
つまり CLAUDE_CODE_SUBPROCESS_ENV_SCRUB は何をしてくれるのか
- やってくれる: Claudeが裏で立ち上げる別プログラム(Bashツール・hook・MCPの通信役)から、Anthropic とクラウド系の認証情報を抜く。Linuxなら他プログラムの隔離も追加
- やってくれない: Claude本体のキーには触らない。Anthropic・クラウド系以外の独自キー、例えば自作サービスのキーまで自動で抜くとは公式は書いていない
- 意味が薄い場面: hookもMCPサーバも一切使わず、Bashツールで外部コマンドも走らせない、完全に閉じた使い方。抜く相手の子プロセスがほぼ立ち上がらないため
使いどころ3シナリオ(具体題材で再現)
シナリオ1: GitHubで見つけた便利そうなMCPサーバを試すとき
「天気APIをClaudeから叩けるMCPサーバ」みたいなものをGitHubで拾って動かす場面です。作者は善意でも、中身を全部読む時間はない。こういう「人のコードを初めて自分の環境で走らせる」瞬間にこそ、先に 1 を入れておきます。万一そのサーバが裏でキーを抜こうとしても、抜く対象が手元に無い状態を作れます。
シナリオ2: チームで共有しているhookを使う社内プロジェクトのとき
「保存の区切りをつける前に自動でlintを走らせるhook」を、チームの誰かが書いて共有しているとします。自分はその中身を毎回確認しない。誰かが悪意なく、デバッグ目的でキーをログに吐く処理を入れてしまうこともあります。settings.json に書いて常時オンにしておけば、共有hookが立ち上げる子プロセスにキーが流れません。チーム全員に配る設定としても扱いやすいです。
シナリオ3: クラウドの本番キーを持ったまま開発するとき
AWSの本番アクセスキーをパソコンに覚えさせた状態で、Claude Codeに作業させる場面です。本番キーが子プロセス経由で外に漏れると、被害が直接お金に直結します。ここは安全寄りに倒して、最初からスクラブをオンにしておくのが無難です。Linuxサーバ上での作業なら、PID名前空間分離も一緒に効くので守りが一段厚くなります。
初心者が踏みやすい落とし穴
- Claude本体が喋らなくなると勘違いする。抜かれるのは子プロセスの設定値だけで、Claude本体のキーは無傷です。返事は普通に返ります。
- PID名前空間分離がどのOSでも効くと思い込む。これはLinux限定です。macOS・Windowsでは認証情報を抜く動きだけが効きます。OSレベルの隔離まで期待して油断しないこと。
- キーを参照しているMCPサーバ・hookが動かなくなる。子プロセスがそのキーを前提に動いていた場合、抜かれて見えなくなり、失敗します。便利さと安全のトレードオフは正直あります。動かないものが出たら、そのプログラムにだけ別の渡し方を考える必要があります。
- export だけで満足して画面を閉じる。
exportは一時的で、ターミナルを閉じると消えます。次回も効かせたいならsettings.jsonか、お使いのターミナルの設定ファイル(~/.bashrcや~/.zshrcなど)に書きます。 - Anthropic・クラウド系以外のキーも全部抜けると思う。公式が明記しているのは Anthropic とクラウドプロバイダの認証情報です。自作サービスの独自キーまで自動対象とは書かれていません。過信しないこと。
- 有効かどうかを確かめずに安心する。設定したつもりでも効いていないことがあります。ステップ3のように、Bashツールでキーが空になるか実際に確認してから本番に使うと確実です。
- 名前が長くて打ち間違える。
SUBPROCESSとENVとSCRUBの3語、全部大文字でアンダースコア区切りです。1文字違うと黙って無効になります。コピペで入れるのが安全です。
書き方
CLAUDE_CODE_SUBPROCESS_ENV_SCRUB=1
やってみるとこうなる
入力
$ export CLAUDE_CODE_SUBPROCESS_ENV_SCRUB=1
$ claude
出力例
設定後、Claudeに「echo $ANTHROPIC_API_KEY を実行して」と頼むと、出力が空になる(子プロセスからキーが抜かれているため。これが正しい状態)。Linux かつ v2.1.98 以降なら、加えて PID名前空間分離で子プロセスから他プログラムが見えなくなる
このページに出てきた言葉
- 子プロセス
- Claudeが何かを実行するときに裏で立ち上げる別のプログラム。Bashツール・hook・MCPサーバとの通信のいずれもこの別プログラムが動いている
- 認証情報
- APIキーやクラウドのアクセスキーなど、「あなた本人だ」と証明する秘密の文字列。漏れると勝手に使われて課金される
- hook
- 「この操作の前後にこのスクリプトを自動で走らせて」とあらかじめ仕込んでおく仕掛け。中身は自分以外が書いたものかもしれない
- MCPサーバ
- Claudeに外部の道具(データベース・社内システム・検索など)をつなぐ橋渡し役のプログラム。野良のものを動かすこともある
- PID名前空間分離
- Linuxが持つ仕切りの仕組み。あるプログラムから見て他のプログラムが存在しないかのように隔離できる。macOS/Windowsでは効かない
- settings.json
- Claude Codeの動きをあらかじめ書いておく設定ファイル。起動のたびに自動で読み込まれる