Claude Code on the web の設定項目を整理する:環境変数・API認証情報・ネットワーク・スクリプト

Claude Code on the web の設定項目を整理する:環境変数・API認証情報・ネットワーク・スクリプト

Claude CodeのWeb版の環境設定について、環境変数・セットアップスクリプト・ネットワークアクセス・API認証情報それぞれの挙動を実際に検証しました。設定の役割の違いと、変更がセッションにどう反映されるかを確認した内容をお届けします。
2026.09.26

こんにちは、けーまです。

Claude CodeのWeb版で環境設定を開くと、ネットワークアクセスや環境変数、API認証情報、セットアップスクリプトといった項目が並んでいます。
「どの欄に何を設定すべきなのか」「設定を変更したとき、既存のセッションにはどう反映されるのか」と疑問に思ったことはないでしょうか。

私自身も設定ごとの違いを整理したくなり、専用のprivateリポジトリとクラウド環境を用意して挙動を確かめてみました。

0. 検証環境を用意する

今回の検証対象は、Anthropic側の基盤で実行されるClaude Codeのクラウドセッションです。

項目 内容
確認日 2026年9月22日、9月26日
操作画面 Claude CodeのWeb版
プラン・モデル Max・Haiku 4.5

Claude CodeのWeb画面を開き、入力欄の上にある環境名をクリックします。
「クラウド」から「クラウド環境を追加」を選び、検証用の名前を付けました。

環境名のメニューからクラウド環境を追加する

クラウド環境を追加するダイアログ
新規作成の画面。この時点ではAPI認証情報の欄はない

1. 環境変数をコマンドから読む

環境変数の欄には、セッション内で実行するコマンドへ渡したい設定値を入力します。
今回は次の値を環境の「環境変数」欄に貼り付けて保存しました。

LAB_REV=before
LAB_HASH="alpha#beta"
LAB_MULTILINE="line1
line2"

環境変数の欄に値を入力した状態
「環境変数」の欄に.env形式で貼り付ける

新規セッションを作成し、次のコマンドを実行するようClaudeに依頼します。
ほかの環境変数まで出力されないよう、読み取る変数名を絞り込んでいます。

python3 - <<'PYTHON'
import json, os
names = ["LAB_REV", "LAB_HASH", "LAB_MULTILINE", "LAB_EXPORTED"]
print(json.dumps({name: os.environ.get(name) for name in names}, ensure_ascii=False, indent=2))
PYTHON

実際の出力結果です。

{
  "LAB_REV": "before",
  "LAB_HASH": "alpha#beta",
  "LAB_MULTILINE": "line1\nline2",
  "LAB_EXPORTED": null
}

セッション内で環境変数を読み取った結果
入力した3つの値がそのまま読める

前後の引用符自体は値に含まれず、# や改行文字はそのまま保持されていました。

2. セットアップスクリプトを動かす

「セットアップスクリプト」欄に、次のスクリプトを登録してみました。
Web画面で登録した環境変数(LAB_REV)をファイルに書き出しつつ、スクリプト内で新しく LAB_EXPORTED をエクスポートしてセッションへ渡せるかを試す内容です。

#!/bin/bash
set -eu
printf "setup_rev=%s\n" "$LAB_REV" > /tmp/claude-env-lab.txt
date -u +%FT%TZ >> /tmp/claude-env-lab.txt
export LAB_EXPORTED=from_setup

失敗する版のセットアップスクリプトを入力した状態
環境の編集画面の「セットアップスクリプト」欄に入力して保存する

ところが新規セッションを開始すると、準備の手順一覧に「セットアップスクリプトが失敗しました」と表示され、「詳細を表示」を開くと次のエラーが出て停止してしまいました。

Setup script failed with exit code 1.
LAB_REV: unbound variable

セットアップスクリプトの失敗とエラー詳細
Claude Codeは起動されず、詳細に LAB_REV: unbound variable が出ている

セッション内のコマンドからは読めていた LAB_REV が、セットアップスクリプトの実行時点では未定義でした。
そのため set -u によって未定義変数の参照エラーとなり、スクリプトが停止してしまったわけです。

そこで、変数が未定義の場合でも処理を止めずにその事実を記録できるよう、スクリプトを書き換えて再検証しました。

#!/bin/bash
set -eu
printf "setup_revision=2\n" > /tmp/claude-env-lab.txt
printf "setup_LAB_REV=%s\n" "${LAB_REV-unset}" >> /tmp/claude-env-lab.txt
date -u +%FT%TZ >> /tmp/claude-env-lab.txt
export LAB_EXPORTED=from_setup

新規セッションを開始し、Claudeにファイルの内容と、スクリプト内で export した LAB_EXPORTED が見えるかを確認してもらいました。

cat /tmp/claude-env-lab.txt
python3 -c 'import json, os; print(json.dumps({n: os.environ.get(n) for n in ["LAB_REV", "LAB_EXPORTED"]}))'

実際の出力結果です。

setup_revision=2
setup_LAB_REV=unset
2026-09-26T08:20:04Z

{"LAB_REV": "before", "LAB_EXPORTED": null}

セットアップは最後まで実行されたがexportした値は見えない
setup_revision=2 が残っているのに、LAB_EXPORTED は null

ファイル自体は正常に作成され、セットアップスクリプト実行中の LAB_REV は未定義であることが確認できました。
また、スクリプトが最後の export の行まで実行されたにもかかわらず、同じセッションから読んだ LAB_EXPORTED は null でした。
私の環境では、セットアップスクリプト内での export をセッションへ環境変数を引き渡す手段としては利用できませんでした。

セッション内で使いたい値は、素直に「環境変数」の入力欄へ設定するのが確実です。

3. ネットワークアクセスを比較する

ネットワークアクセスの各設定ごとに新規セッションを作成し、同じ3つの宛先に対して接続を試しました。
この章ではAPI認証情報は登録していません。

ネットワークアクセスの4つの選択肢
選択肢は「なし」「Trusted」「Full」「カスタム」の4つ

Claudeにはリポジトリのファイルを変更させず、次のコマンドのみを実行するよう依頼しています。
結果が読みやすいよう、レスポンスは1行目だけを表示し、curl 自体の終了コードを curl_exit として出しています。

for url in https://example.com https://registry.npmjs.org https://httpbin.org/get; do
  printf '\nURL=%s\n' "$url"
  curl -sS -I --connect-timeout 8 --max-time 15 "$url" | head -1
  printf 'curl_exit=%s\n' "${PIPESTATUS[0]}"
done

Custom設定では、許可ドメインを example.com のみとし、「一般的なパッケージマネージャーのデフォルトリストも含める」はオフにしました。

Customでexample.comだけを許可した設定
許可するドメインに example.com だけを入れ、デフォルトリストのチェックを外す

実測結果は次のとおりです。

ネットワーク設定 example.com registry.npmjs.org httpbin.org
Trusted 拒否(接続時) 200 拒否(接続時)
なし(None) 拒否(接続時) 403 拒否(接続時)
Custom 200 403 拒否(接続時)
Full 200 200 200

表の「拒否(接続時)」と「403」は、どの段階で断られたかが違います。
セッション内の curl は外部へ直接つながらず、まずプロキシに CONNECT で「この宛先までの通路を作ってほしい」と頼み、できた通路(トンネル)の中で本来のリクエストを送ります。

拒否(接続時)と403の違い
上は通路を作る前にプロキシが断るので curl がエラー(56)、下は通路の先から HTTP 403 が返るので curl は成功扱い(0)

なお、npmレジストリの403をプロキシとnpm側のどちらが返したのかまでは、今回の検証では確認していません。

Trustedではnpmレジストリへの通信が通り、Customでドメインを明示的に絞り込むとnpmへの通信は拒否されました。
Fullに設定した場合は、今回試した3つの宛先すべてに到達できています。

Customでの接続結果
同じ「拒否」でも、npmはHTTP 403で curl_exit=0、httpbin.orgは接続時点で失敗して curl_exit=56

許可されていない宛先は、プロキシとの接続の段階で CONNECT tunnel failed, response 403 となり、curl の終了コードは56でした。
一方でnpmレジストリへのリクエストは、接続自体は確立したうえでHTTP 403が返り、curl の終了コードは0でした。
そのため、接続の可否をシェルスクリプトで判定するなら、終了コードだけでなくHTTPステータスコードまで確認するのが確実です。

公式ドキュメントにおける設定区分は次のとおりです。

  • なし(None): 通常の外向き通信を拒否

  • Trusted: デフォルトの許可先

  • Custom: 指定した許可先

  • Full: 任意のドメイン

GitHubやMCPコネクター、Claude自身のAnthropic APIへの接続などは別経路で処理されるため、Noneを「一切の通信が遮断される状態」と捉えないよう注意が必要です。

引用元:Configure cloud environments / Access levels

4. API認証情報を登録する

4.1. 環境変数との違い

API認証情報は、APIキーそのものをセッション内のコマンドへ渡すのではなく、指定したホストへのアウトバウンドリクエストに対して後から付与する設定です。
公式ドキュメントによると、セッションのVMからリクエストが送信された後、Anthropicのエージェントプロキシが認証ヘッダーなどを付与する仕組みと説明されています。

Anthropic's agent proxy adds the key to requests for the hosts you list, after each request leaves the session's VM.

引用元:Configure cloud environments / Add API credentials

環境変数と並べると、値が置かれる場所の違いは次のとおりです。
環境変数はVMの中にあるのでコマンドから読めますが、API認証情報のキーはVMの外のプロキシだけが持っています。

たとえば Authorization: Bearer ... が必要な外部APIであっても、Claudeに生キーを見せることなく認証済みのリクエストを送信させることができます。

4.2. 作成済み環境の編集画面から追加する

私の画面では、クラウド環境を新規作成する初期フォームにはAPI認証情報の入力欄がありませんでした。
環境を作成したあと、編集画面を開き直すことで環境変数の下に設定欄が表示されます。

環境の編集画面に表示されるAPI認証情報の欄
編集画面では環境変数の下に「API認証情報」と「認証情報を追加」が並ぶ

「認証情報を追加」を開き、今回は次の値を設定しました。
なお、この文字列は実際のサービスでは使用できないダミー値です。

項目 今回の値
名前 env-lab-dummy
認証情報タイプ Bearer
許可ウェブサイト httpbin.org
ヘッダー名 Authorization
プレフィックス Bearer
値 not-a-real-key-env-lab-20260922

ダミーBearer認証情報の入力画面
値の欄は入力中も伏せ字で表示される

認証方式の選択肢には、次の9種類が表示されていました。

  • Basic

  • Bearer

  • Body parameter

  • AWS SigV4

  • GCP access token

  • GCP IAP

  • OAuth 2.0 JWT bearer

  • OAuth 2.0 client credentials

  • MCP Connector

今回実際に検証したのはBearerのみです。

認証情報タイプの選択肢
Bearerを含めて9種類が選べる

追加フォームで「連携/連携させる」をクリックすると保存されました。
環境編集画面全体の「変更を保存」を押さなくても一覧に即時反映され、保存後にキーの値そのものを再表示・再編集する欄は用意されていませんでした。

保存後の認証情報の一覧
一覧には名前と許可ウェブサイトだけが表示され、値は見えない

4.3. Noneでも登録先へ接続できた

ネットワーク設定をNone(外向き通信なし)にしたまま、既存のセッションで次のコマンドを実行してみました。
httpbin.org/headers は受け取ったヘッダーをレスポンス本文として返すため、本物のAPIキーでは絶対に試さず、必ずダミー値を使ってください。

python3 - <<'PYTHON'
import json
import os
import subprocess

# httpbin.org にリクエストを送り、自身に付与されたリクエストヘッダーを取得する
r = subprocess.run(
    ["curl", "-sS", "--connect-timeout", "8", "--max-time", "20",
     "https://httpbin.org/headers"],
    capture_output=True, text=True, check=True,
)
headers = json.loads(r.stdout).get("headers", {})
auth = headers.get("Authorization", "")

# 1. Authorizationヘッダーが付与されているか確認
print("Authorization exists:", "Authorization" in headers)
# 2. Bearerトークン形式になっているか確認
print("Starts with Bearer:", auth.startswith("Bearer "))
# 3. トークンの文字数を確認(生の値を出力せずに長さをチェック)
print("Length:", len(auth))
# 4. 登録したAPIキーがVM内の環境変数に漏れていないか確認
print(any("not-a-real-key-env-lab-20260922" in v for v in os.environ.values()))
PYTHON

実際の出力結果です。

Authorization exists: True
Starts with Bearer: True
Length: 38
False

None設定で認証ヘッダーが付き、環境変数にダミーキーがないことを確認
ネットワーク設定はNoneのまま、httpbin.orgへのリクエストにBearerヘッダーが付いた

登録前は拒否されていたホストへリクエストが通り、Authorizationヘッダーも付与されていました。
一方で、ダミーキーを含む環境変数は存在しませんでした(出力末尾の False)。
ただし、この確認は環境変数だけを対象にしたもので、VM内のファイル全体をくまなく探したわけではない点はお含みおきください。

同じセッションで、3章と同じ3つの宛先への接続も確かめました。

ネットワーク設定 example.com registry.npmjs.org httpbin.org
なし(None)+httpbin.orgを認証情報に登録 拒否(接続時) 403 200

None+認証情報登録時の接続結果
通るようになったのは、認証情報の許可ウェブサイトに入れたhttpbin.orgだけ

公式ドキュメントでも、API認証情報に登録された送信先は通常のネットワークアクセス制限とは独立して到達可能になると説明されています。
許可ウェブサイトには、利用予定のAPIホストを必要最小限の範囲で指定するのが安全です。

引用元:Configure cloud environments / Add API credentials

4.4. セットアップスクリプト中には付与されない

「セットアップスクリプト内でプライベートなパッケージやリポジトリを取得したい場合、API認証情報が自動で付与されるのか」も気になるところです。

そこでネットワーク設定をFullにしたうえで、2章で動かしたセットアップスクリプトの末尾に、httpbin.org/headers を呼び出す処理を追加してみました。

#!/bin/bash
set -eu
printf "setup_revision=3\n" > /tmp/claude-env-lab.txt
printf "setup_LAB_REV=%s\n" "${LAB_REV-unset}" >> /tmp/claude-env-lab.txt
date -u +%FT%TZ >> /tmp/claude-env-lab.txt
export LAB_EXPORTED=from_setup

# --- ここから下を追加 ---
# セットアップスクリプト実行中に httpbin.org へリクエストを送り、ログファイルへ追記する
python3 - <<'PYTHON' >> /tmp/claude-env-lab.txt
import json
import subprocess

r = subprocess.run(
    ["curl", "-sS", "--connect-timeout", "8", "--max-time", "20",
     "https://httpbin.org/headers"],
    capture_output=True, text=True,
)
# curl の終了コードをログファイルに記録
print("setup_curl_exit=" + str(r.returncode))

if r.returncode == 0:
    # 通信成功時:ヘッダーを解析して Authorization ヘッダーが付与されているか判定
    data = json.loads(r.stdout)
    print("setup_authorization_present=" + str("Authorization" in data.get("headers", {})))
else:
    # タイムアウト等で失敗した場合
    print("setup_request_failed")
PYTHON

Full+API認証情報の状態でセットアップスクリプトを差し替えた編集画面
ネットワークはFull、API認証情報は登録したまま、セットアップスクリプト内にAPI呼び出しを記述

スクリプトが残したログファイルを確認した結果です。

setup_curl_exit=0
setup_authorization_present=False

この出力は次の2つを表しています。

  • setup_curl_exit=0: ネットワークがFullのため、セットアップスクリプト内からの外部通信(curl)自体はエラーなく正常に完了したこと

  • setup_authorization_present=False: 返ってきたリクエストヘッダーの中に、API認証情報で登録した Authorization ヘッダーが含まれていなかったこと

セットアップ中のリクエストに認証ヘッダーが付かなかった結果
通信自体は成功(curl_exit=0)したが、Authorizationヘッダーは付いていない(False)

つまり、通信自体は成功したものの 認証ヘッダーは付与されていませんでした。

この理由は公式ドキュメントに明記されています。
認証ヘッダーを付与する「エージェントプロキシ」に接続されるのは、セットアップスクリプトがすべて完了して Claude Code が起動した後 だからです。

Setup script requests: Claude Code connects to the agent proxy when it launches, after the setup script has run

引用元:Configure cloud environments / Add API credentials

そのため、「API認証情報に登録しておけば、セットアップスクリプト中の通信にも自動でキーが付与される」ということはありません。セットアップスクリプト内で認証が必要な通信を行う場合は、別の手段を検討する必要があります。

5. 設定変更は、どのタイミングで反映されたか

環境編集画面には「環境への変更は新しいセッションに適用されます。」と表示されます。
公式ドキュメントでも、環境変数はセッション起動時に一度だけコピーされ、実行中のセッションは開始時の値を保持し続けると説明されています。

Each session copies the environment's values once, at startup, into ordinary environment variables that any command Claude runs can read. Because running sessions don't re-read the configuration, editing or adding variables affects sessions you start afterward; sessions already running keep the values they started with.

引用元:Configure cloud environments / Set environment variables

実際に、Trusted・LAB_REV=before で始めたセッションのあと、環境を LAB_REV=after・Noneに変更して保存し、既存のセッションへ追加で依頼してみました。

LAB_REV=after・Noneに変更した編集画面
環境変数を LAB_REV=after に、ネットワークアクセスを「なし」に変えて保存する

結果は次のとおりでした。

操作 結果
最初のセッションで測定 LAB_REVはbefore、npmは200
環境設定をafter・Noneに変更して保存 保存完了
既存のセッションへ追加依頼 LAB_REVはbefore、npmは200
新規セッションで測定 LAB_REVはafter、npmは403

設定変更後も同じセッションでは変更前の値のままだった
設定変更後も、既存のセッションでは LAB_REV=before、npmも200のまま保持されていた

公式ドキュメントの説明どおり、設定を変更しても実行中の既存セッションには反映されず、開始時の値(LAB_REV=before、npm通信成功)がそのまま残っていました。
変更後の設定が反映されたのは、設定保存後に新しく作成したセッションからです。

そのため、環境設定を変更した場合は既存のセッションを使い続けるのではなく、新規セッションを作成して作業するのが確実です。

6. おわりに

今回の検証を通じて分かったポイントをまとめます。

設定項目・観点 検証で分かったこと
環境変数 セッション内のコマンドから直接読み取れる。秘匿すべきAPIキーは平文で置かず、API認証情報を使うのが安全
セットアップスクリプト 実行時点では設定画面の環境変数が渡されない(未定義)。スクリプト内で export した変数もセッションには引き継がれない
ネットワークアクセス デフォルトの通信制御を行う(None / Trusted / Custom / Full)。拒否時はプロキシへのCONNECT段階で失敗する(curl exit=56)
API認証情報 プロキシがアウトバウンド通信に認証ヘッダーを付与する。ネットワークが「None」でも登録した許可先へは通信可能になる
セットアップとAPI認証 Claude Code起動前に動くセットアップスクリプトの通信には、API認証情報のヘッダーは付与されない
設定変更の反映 実行中の既存セッションには変更が反映されない。変更後は新規セッションを作成して作業する必要がある

実際に手を動かして検証してみたことで、コマンドから直接参照できる「環境変数」と、プロキシ経由でヘッダーを注入する「API認証情報」の役割の違いが明確になりました。
セッションの外部接続を制限する際は、ネットワークアクセス設定だけでなく、API認証情報の送信先ホストも含めて設計・確認していきたいと思います。

参考


Claudeならクラスメソッドにお任せください

クラスメソッドは、Anthropic社とリセラー契約を締結しています。各種製品ガイドから、業種別の活用法、フェーズごとのお悩み解決などサービス支援ページにまとめております。まずはご覧いただき、お気軽にご相談ください。

サービス詳細を見る

この記事をシェアする

AI白書

関連記事