まずゲートウェイのネットワークを計画してください。 サインイン時、Claude Code は、ホスト名がパブリック IP アドレスに解決される Claude apps gateway を拒否します。インターネットから到達できないアドレスであっても同様です。Claude apps gateway は、シェルコマンドを実行するフックを含む設定をユーザーのマシンにプッシュできます。このチェックは、ユーザーがパブリックインターネット上の悪意のあるゲートウェイに誤ってサインインするのを防ぐのに役立ちます。自社のゲートウェイもインターネットから切り離しておいてください。ゲートウェイを実行する場所を選ぶ前に、ゲートウェイのアドレスを選んでください。通常は、ユーザーが内部ネットワーク上または VPN 経由でアクセスするプライベートアドレスです。内部ネットワークがパブリック IPv4 範囲を使用している場合は、ゲートウェイとユーザーのマシンの両方を含む範囲を 1 つ指定できます。Claude Code は、その一致をゲートウェイが内部ネットワーク上にあることを示すものとみなします。ゲートウェイのアドレスを選択する を参照してください。どちらもネットワークに合わない場合は、Anthropic のアカウントチームにお問い合わせください。
gateway.yaml ファイルのすべてのオプションについては、設定リファレンス を参照してください。
本番環境のデプロイメントは順序立てた 4 つのステップに従い、以下のセクションがそれに対応しています。最初の 2 つは選択を行う場所です。後の 2 つは、実行中に参照するリファレンス資料です。
- ID プロバイダーをセットアップする:OAuth クライアントを登録し、Okta、Entra、Google の IdP 固有の注記を確認します
- ゲートウェイをデプロイする:ピン留めされたコンテナイメージをビルドし、Kubernetes、Cloud Run、または独自のプラットフォームで実行します。このセクションではコスト、バイパス、複数ゲートウェイ、サーバーレスの決定についても説明します
- 運用をセットアップする:ログ、ヘルスプローブ、障害時の動作、シークレットローテーション、アップグレード。監視とランブックを配線するときに参照するリファレンス
- セキュリティ体制を確認する:データがどこを流れるか、脅威モデル、コンプライアンスの回答。セキュリティレビュー用のリファレンス
ID プロバイダーのセットアップ
単一のリダイレクト URIhttps://<gateway>/oauth/callback を持つ機密 OAuth/OpenID Connect(OIDC)ウェブアプリケーションを ID プロバイダーに登録し、ゲートウェイアクセスを持つべきユーザーまたはグループに割り当てます。ゲートウェイは、登録のクライアントシークレットを使用して IdP に対して認証します。IdP が代わりに証明書認証情報を使用する場合は、登録にアップロードした証明書を使用して認証します。
任意の OIDC 準拠 IdP が機能します:Okta、Microsoft Entra ID、Google Workspace、Keycloak、Dex、PingFederate など。IdP は 3 つの要件を満たす必要があります:
/.well-known/openid-configurationを提供します。本番環境では HTTPS 経由です。ゲートウェイはhttp://issuer を受け入れ、ループバック issuer は追加でCLAUDE_GATEWAY_ALLOW_LOOPBACK=1が必要です- 認可コードフローをサポートします。PKCE(Proof Key for Code Exchange)はデフォルトで有効です。サポートしない IdP の場合は
oidc.use_pkce: falseで無効にします - id_token で
emailと必要に応じてgroupsを返すか、oidc.userinfo_fallback: trueで userinfo エンドポイントから提供します
oidc.ca_cert_pem を設定します。
いくつかのプロバイダーはメールとグループクレームを異なる方法で処理します:
- Okta:
https://example.okta.comの org 認可サーバーは、emailとgroupsを省略した薄い id_token を返すため、issuer として使用する場合は常にoidc.userinfo_fallback: trueを設定します。https://example.okta.com/oauth2/defaultなどのカスタム認可サーバーは、id_token にemailと必要に応じてgroupsを含め、直接発行し、フォールバックは不要です。Okta はoidc.scopesでgroupsスコープがリクエストされ、アプリのグループクレームフィルターが許可する場合にのみgroupsを発行します。userinfo_fallbackは IdP がリクエストされなかったクレームを埋めることはできません。 - Microsoft Entra ID:
issuer=https://login.microsoftonline.com/<tenant-id>/v2.0。Entra はグループ名ではなくグループオブジェクト ID を発行するため、managed.policies.match.groupsで GUID を使用するか、人間が読める名前のためにアプリロールを使用します。テナントがgroupsの代わりにrolesの下でロールを発行する場合は、oidc.groups_claim: rolesを設定します。 - Google Workspace:
issuer=https://accounts.google.com。Google の id_token はグループを含みません。Google を IdP として、グループベースのallowed_groupsまたはmanaged.policiesを使用するには、oidc.google_groupsを設定します。これは、ドメイン全体の委任を持つサービスアカウントを使用して Admin SDK Directory API を通じて各ユーザーのグループを検索します。これなしで、メンバーシップゲーティングにoidc.allowed_email_domainsを使用し、ポリシー割り当てにmanaged.policies.match.email_domainを使用します。Google は標準のoffline_accessスコープも無視します。リフレッシュトークンの場合は、oidc.scopes: [openid, profile, email]とoidc.extra_auth_params: { access_type: offline, prompt: consent }を設定します。
デプロイ
ゲートウェイは単一のステートレス Linux バイナリで、Postgres を通じて調整されるため、環境内で他のステートレスサービスをデプロイするのと同じ方法でデプロイします。ゲートウェイはネットワーク内に置き、開発者が HTTPS 経由で到達でき、ゲートウェイから IdP に到達できるようにします。また、本番認証情報を保持する他のサービスと同様に扱います。 デプロイメントを実行する場所を超えて形作るいくつかの決定があります:- コスト:ゲートウェイの個別ライセンスまたはシートごとの料金はありません。ゲートウェイは
claudeバイナリの一部であるため、既存のコミットメントを通じて推論に対して支払い、実行するコンピュートに対して支払います。 - バイパス:ゲートウェイは、モデルへの唯一のルートがそれを通過することを強制しません。独自の認証情報を持つ開発者は引き続きプロバイダーを直接呼び出すことができるため、そのパスを閉じることはネットワークポリシーの決定です。例えば、
api.anthropic.comへのエグレスをゲートウェイ以外からブロックします。そのエグレスをブロックすると、各開発者のマシンからapi.anthropic.comを呼び出す WebFetch ドメインセーフティチェック も破壊されます。管理ポリシーでskipWebFetchPreflight: trueを設定して無効にします。 - 複数ゲートウェイ:各ゲートウェイは独自の設定を持つ個別のデプロイメントで、CLI はゲートウェイホスト名ごとに信頼と認証情報を保存するため、チームは競合なしに異なるゲートウェイを使用できます。複数の OIDC issuer を提供するには、個別のインスタンスを実行します。
- サーバーレス:Cloud Run は機能します。
min-instances: 1を設定して、コールド OIDC ディスカバリーを回避します。Lambda と Cloud Functions は機能しません。ゲートウェイは長時間実行 HTTP サーバーであるためです。
listen.trusted_proxies をプロキシのソース範囲に設定して、ゲートウェイが X-Forwarded-For からクライアント IP を読み込みます。ゲートウェイは TCP ピアが信頼されている場合にのみヘッダーを尊重します。Google Cloud と AWS の実装例には、トポロジーごとに具体的な値があります。信頼されたプロキシなしでは、すべてのリクエストはプロキシの IP から来ているように見え、IP ごとのレート制限を 1 つの共有バケットに折りたたみ、監査イベントにプロキシの IP を記録します。
ゲートウェイのデバイス認可とトークンエンドポイントへのリクエストをリダイレクトしないでください。例えば、HTTP から HTTPS へのリダイレクトやホスト正規化の書き換えなどです。Claude Code はこれらのリクエストでリダイレクトに従わないため、ingress ルールがそれらをリダイレクトするとサインインとトークン更新が破壊されます。
プロキシに、ゲートウェイのキープアライブ間隔より長いアイドルタイムアウトを与えます。これは上流に依存します:
provider: anthropic以外のすべての上流では、ゲートウェイはストリームが約 15 秒間サイレント状態になった後、SSEpingを 1 回書き込みます。provider: anthropicでは、ゲートウェイは Anthropic API 独自の ping を含む応答をそのまま渡します。
ゲートウェイのアドレスを選択する
Claude Code は、次の 2 つの方法のいずれかでゲートウェイのアドレスを受け付けます:- プライベートアドレス:ゲートウェイを内部ロードバランサーまたは VPN の背後に配置し、RFC 1918 や CGNAT
100.64.0.0/10などのプライベートアドレスにのみ解決されるホスト名を使用します。ユーザーのマシンはどのアドレスでもかまいません。プライベートネットワークの前提条件 に、受け付けられる範囲が記載されています。 - 宣言済みブロック:内部ネットワークが組織所有のパブリック IPv4 空間を使用している場合は、そのブロックを
gatewayInternalNetworks管理設定に記載します。ゲートウェイとユーザーのマシンの両方がそのブロック内にある必要があります。所有するパブリックアドレス空間上のゲートウェイを許可する を参照してください。
コンテナイメージ
標準 Claude Code リリースのネイティブclaude バイナリの周りに独自のイメージをビルドします:
- ピン留めされたリリースからイメージアーキテクチャの Linux ビルドをダウンロードします。ダウンロード URL については、特定のバージョンをインストールする を参照してください。
- バイナリの整合性とコード署名 で説明されているように、リリースの GPG 署名付き
manifest.jsonに対して検証します。 - ビルドコンテキストにコピーします。
- glibc ベースのイメージ:glibc ビルドの唯一の動的依存関係は glibc ライブラリです。Musl ベースのイメージには
linux-x64-muslまたはlinux-arm64-muslビルドが必要で、その唯一の動的依存関係は musl です。 - 書き込み可能な状態ディレクトリ:ゲートウェイは任意のユーザーとして実行されますが、最小限のイメージには書き込み可能なホームがありません。
CLAUDE_CONFIG_DIRを/tmp/.claudeなどの書き込み可能なパスに設定します。 - コンテナコマンド:
claude gateway --config /etc/claude/gateway.yaml。設定ファイルは読み取り専用でマウントされ、シークレットは環境変数として提供されます。ゲートウェイはlisten.portでリッスンします。デフォルトは8080です。
Kubernetes
ゲートウェイをデプロイメントとして実行します。他のステートレスサービスと同様です:- ConfigMap から設定をマウントし、Secret からシークレットをマウントします。YAML で
${file:/path/to/secret}または環境変数を通じてシークレットを参照します - Ingress で TLS を終了し、
listen.public_urlを Ingress ホスト名に設定します - readiness プローブを
GET /readyzに、liveness プローブをGET /healthzに指定します
upstreams リファレンス にはプラットフォームごとのセットアップ詳細があります。クロスクラウドペアリング(例えば GKE 上の Amazon Bedrock 上流)の場合は、上流の auth ブロックで明示的な認証情報を設定します。
Cloud Run
サービスを以下のように設定します:listen.portをデフォルトの8080のままにします。これは Cloud Run のデフォルトPORTと一致するか、port: ${PORT}を設定しますpublic_urlを外部到達可能なオリジンに設定します。本番環境では、これは通常、内部ロードバランサーのホスト名です。/loginは パブリックアドレスを拒否 し、*.run.appURL はそれに解決するため、Cloud Run URL だけはcurlまたはブラウザスモークテストにのみ機能します。例外は、*.run.appが Private Service Connect と Cloud DNS プライベートゾーンを通じてプライベートに解決するネットワークです。そのトポロジーでは、Cloud Run URL は有効なpublic_urlです。Google Cloud の実装例 は両方をカバーしています。- シークレットボリュームとして設定をマウントします
min-instances: 1を設定して、最初のリクエストでコールド OIDC ディスカバリーを回避します
ゲートウェイ URL を開発者マシンにプッシュする
ゲートウェイが稼働したら、MDM を通じて、または OS ごとのmanaged-settings.json を直接書き込むことで、管理設定を通じて各開発者のマシンに forceLoginMethod、forceLoginGatewayUrl、および parentSettingsBehavior: "merge" をプッシュします。
キーをデプロイしたら、Claude Code はマシン上の残存する API キーまたは claude.ai ログインの使用を停止するため、サインイン指示と一緒にプッシュを計画します。Administrator policy requires a Cloud gateway sign-in は開発者が見るメッセージについて説明しています。
各メカニズムがポリシーを保存する場所については where each mechanism stores the policy を参照し、Claude Desktop bootstrapUrl 相当については Client-side managed settings を参照してください。
大規模なロールアウト
サインインはクライアント IP アドレスごとにレート制限されており、デフォルトは小規模なチームに適しています。各アドレスは 10 分ごとに 30 回のサインイン開始と 10 回のコード送信を取得します。数千人の開発者へのロールアウトは、次の 2 つの理由のいずれかで、最初の朝にこれらの制限に達する可能性があります:- ゲートウェイがロードバランサーの向こう側を見ることができません。
listen.trusted_proxiesがない場合、すべての開発者はロードバランサーのアドレスから来ているように見え、1 つの制限を共有します。ゲートウェイは、X-Forwarded-Forヘッダーを初めて無視したときに警告をログに記録します。ロードバランサーがlisten.trusted_proxiesに含めるべきもの である場合は、他の何かを変更する前にそれを記載してください。それでも開発者が 1 つのアドレスを共有している場合は、rate_limitsを引き上げます。 - 多くの開発者が少数の NAT または VPN エグレスアドレスを共有しています。
trusted_proxiesが正しい場合でも、それらのアドレスの制限を共有します。rate_limitsを引き上げて適合させます。
max のサイズを決定するには、開発者をそれらが共有するエグレスアドレスで割ります。1 つの window_seconds 期間内にそれらのうち何人がサインインするかを推定します。デフォルトは 10 分です。その後、リトライと Claude Code と Claude Desktop の両方にサインインする開発者をカバーするために 2 倍にします。
例えば、10,000 人の開発者が 4 つのエグレスアドレスの背後にあり、1 時間にわたって均等にサインインします。これは、アドレスごとに 2,500 人の開発者で、各 10 分ごとに約 420 人です。これを 2 倍にして 1,000 に切り上げます。以下の例は両方の制限を 1,000 に設定します:
device_verify は、別の開発者のサインインコードを推測するのを防ぐものであるため、推定が必要な限りだけそれを引き上げます。これらの制限でも、コードは 20 文字のアルファベットから 8 文字で、10 分後に期限切れになるため、推測は実用的なままです。User-code brute-force resistance を参照してください。
IdP がリフレッシュトークンを発行する場合、Claude Code はセッションをサイレントに更新するため、ロールアウト後に制限を戻すことができます。リフレッシュトークンがない場合、開発者は session.ttl_hours ごとに再度サインインします。その定常状態レートの両方の制限のサイズを決定し、それらを引き上げたままにします。
制限に達すると、Claude Code v2.1.274 以降は The gateway is limiting sign-in attempts right now を表示します。v2.1.274 以降のゲートウェイは、検証ページに Too many attempts came from your network address を表示し、確認する設定を表示します。また、変更する設定に名前を付ける sign-in refused ログ行も書き込みます。
運用
ゲートウェイがトラフィックを処理するようになると、日々の運用はログの確認、ヘルスチェック、そして自社のスケジュールに沿ったシークレットのローテーションになります。以下の各サブセクションでは、それぞれの作業に加え、Postgres に保存される内容と、アップグレードおよびロールバック時の挙動について説明します。ログ
ゲートウェイは 2 種類のストリームを stderr に書き出します。どちらも JSON で扱いやすい形式です。-
監査イベント: セキュリティに関わるイベントごとに 1 行の JSON を出力します。stderr をログアグリゲーターにパイプしてください。
出力されるイベントは
config.load、session.mint、session.refresh、device.authorize、device.verify、device.callback、auth.denied、access.denied、access.public_client、inference、managed.serve、desktop_bootstrap.serve、desktop_bootstrap.denied、spend.blocked、admin.denied、admin.limit.upsert、admin.limit.deleteです。フィールドはイベントによって異なります。- 成功した mint および refresh イベントには
sub、email、client_ip、および結果が含まれます auth.deniedとaccess.deniedには理由とクライアント IP が含まれ、auth.deniedにはさらにリクエストパスが含まれます。これらの拒否の時点ではユーザー ID が存在しないためです。access.deniedの理由のうち 2 つは、イベントに含まれる内容を変えます。xff_unparseable: 読み取れなかったX-Forwarded-Forのエントリもイベントに含まれますclient_ip_unknown:access_controlリストが設定されている状態で接続にピアアドレスがなかったため、イベントにクライアント IP は含まれません
access.public_clientには、access_control.allow_cidrsが空の状態でパブリックアドレスから届いた、プロセスごとの最初のリクエストのクライアント IP が含まれます。ゲートウェイはそのリクエストを通常どおり処理します。このイベントは、ゲートウェイがパブリックインターネットから到達可能である可能性を示します。何がパブリックとみなされるか、および推奨される許可リストについては、access_controlリファレンスを参照してください。inferenceには、どのアップストリームがリクエストを処理したかと、レスポンスのステータスが記録されますdesktop_bootstrap.deniedには、拒否された Claude Desktop のブートストラップ取得が、理由(not_configured、policy_not_opted_in、またはno_policy_matched)およびユーザーの ID とともに記録されますguardrail.traceには、どのフィルターが発動したかが記録されます。一致したテキストは記録されませんadmin.deniedには、拒否された管理 API の認証試行が、クライアント IP、メソッド、パス、理由とともに記録されます。提示された鍵情報は記録されません。理由は、x-api-keyが提示されたもののどの設定済みキーとも一致しなかった場合はinvalid_key、Authorizationヘッダーのみが提示され、それがadmin.admin_groupsのゲートウェイセッションとして検証されなかった場合はbearer_rejected、どちらのヘッダーも提示されなかった場合はno_credentialsです
- 成功した mint および refresh イベントには
-
運用ログ: 起動、警告、アップストリームのエラーについて、
[gateway]というプレフィックスの付いた人間が読める形式の行を出力します。詳細度はCLAUDE_GATEWAY_LOG_LEVEL環境変数で制御し、debug、info、warn、errorのいずれかを指定できます。デフォルトはinfoです。debugでは、サインインとリフレッシュのたびに id_token に含まれるクレームの名前(値ではありません)もログに記録され、userinfo_fallbackが何らかのクレームを提供した場合は userinfo クレームの名前も記録されます。これにより、PII をログに残さずにemail_claimとgroups_claimの設定を診断できます。この設定は監査イベントには影響せず、監査イベントは常に出力されます。
運用ログを JSON として書き出す
ログコレクターが各行のレベルを JSON フィールドから読み取る場合は、ゲートウェイの環境でCLAUDE_GATEWAY_LOG_FORMAT=json を設定します。ゲートウェイサーバーで Claude Code v2.1.319 以降が必要です。
これにより、各運用ログ行は severity、time、message を持つ 1 つのオブジェクトになります。
severity は大文字で表したログレベルで、warn は WARNING と書かれます。起動の失敗は ERROR の行になります。
同じく stderr に出力される監査イベントは変わりません。監査イベントには ts と evt が含まれ、severity は含まれません。
ヘルスチェック
ゲートウェイは、liveness プローブとしてGET /healthz を、readiness プローブとして GET /readyz を提供します。/readyz はストアに到達可能かどうかを検証します。store.readiness_grace_seconds を設定した場合、ストアが応答しなくなってからその秒数が経過するまで、/readyz は ready を報告し続けます。
どちらのエンドポイントも access_control.allow_cidrs の対象外であるため、アクセスを制限したリスナーでもプローブは動作し続けます。
/.well-known/oauth-authorization-server の OAuth ディスカバリードキュメントも、設定の読み込み、OIDC ディスカバリー、アップストリームクライアントの構築、Postgres のマイグレーションがすべて成功した後にのみ 200 を返すため、エンドツーエンドの起動チェックとしても使えます。
アップストリームへの同時リクエスト
デフォルトでは、各ゲートウェイレプリカがアップストリームに同時に送信するリクエストは最大 256 件です。ストリーミングレスポンスは、ストリームが終了するまでこの上限にカウントされます。 レプリカが上限に達している間に届いたリクエストは、ゲートウェイ内で空きスロットを待ちます。開発者からは、レスポンスの開始が遅い、またはハングしているように見えます。provider: anthropic のアップストリームでは、timeouts.upstream_ttfb_ms より長く待ったリクエストはそのアップストリームをあきらめ、後続のアップストリームがそれを処理しない場合は 502 で失敗します。
upstream requests: を含む起動時のログ行に、有効な上限が表示されます。レプリカで開いているリクエストが上限を超えている間は、client requests are open を含む警告も最大で 1 分に 1 回ログに記録されます。
より多くのリクエストを同時に処理するには、2 つの方法があります。
- レプリカを追加する。
- 各レプリカの上限を引き上げる。ゲートウェイコンテナで
BUN_CONFIG_MAX_HTTP_REQUESTS環境変数を 1 から 65535 までの整数に設定し、コンテナを再起動します。
client requests are open の警告をログに記録するときの CPU レベルよりも低い値をターゲットに設定してください。
load_test_mode を使用した負荷テストでは、リクエストはこの上限で待機しませんが、レプリカは引き続き client requests are open の警告をログに記録します。
API_TIMEOUT_MS をゲートウェイの最初のバイトまでの時間より大きく保つ
応答のないリクエストをより早く再試行するために API_TIMEOUT_MS を下げる場合は、ゲートウェイがストリーミングレスポンスの最初のバイトを送信するまでにかかる時間より大きい値を保ってください。それより長く待つリクエストはタイムアウトし、同じだけ待つ再試行もそれぞれタイムアウトして、最初のバイトの期限によって終了しない限り、最終的にターンが Request timed out で終了します。
provider: anthropic: アップストリームが最初のイベントを送信するまでにかかる最長時間より大きい値をAPI_TIMEOUT_MSに設定します。- その他すべてのアップストリーム: アップストリームがレスポンスヘッダーを返すまでにかかる最長時間より 20 秒以上大きい値を設定します。ゲートウェイは、アップストリームの最初のイベントがそれより早く届かない限り、それらのヘッダーの約 15 秒後に最初の keepalive
pingを送信します。v2.1.229 より古いゲートウェイは ping を送信しないため、その場合はprovider: anthropicのルールを使用してください。
最初のバイトの期限で応答のないリクエストをより早く再試行する
Claude Code が応答のないストリーミングリクエストをより早く再試行するようにするには、開発者のマシンでCLAUDE_STREAM_FIRST_BYTE_TIMEOUT_MS を設定して、最初のバイトの期限を与えます。この期限は、最初の試行がレスポンスヘッダーを待つ時間を制限します。期限がない場合、その試行は 5〜6 分待つことがあります。開発者のマシンで Claude Code v2.1.307 以降が必要です。
この変数には、ミリ秒単位の正の整数を、ゲートウェイポリシーの env ブロックまたは開発者のシェルで設定します。値はゲートウェイの最長の最初のバイトまでの時間より大きく保ってください。そうしないと、ヘッダーの返却に時間がかかる正常なリクエストを Claude Code が中止して再送信する可能性があります。次の例では、開発者のシェルで 60 秒を設定します。
API_TIMEOUT_MS を下げていた場合は、その値を削除してください。そうしないと、応答のない再送信 1 回でターンが No response from API で終了する可能性があります。
期限が発動したことを確認するには、開発者にデバッグログを有効にして Claude Code を起動してもらい、ログで [first-byte] no response headers を検索します。
障害時の挙動
Postgres がダウンした場合、ゲートウェイ自体はサインイン済みの開発者へのサービスを継続し、新規のサインインは失敗します。開発者が実際に作業を続けられるかどうかは、オーケストレーターが readiness をどう扱うかによって決まります。- 既存のセッション: ベアラートークンは JWT シークレットでローカルに検証され、セッションのリフレッシュはストアにアクセスせず、ゲートウェイプロセスは引き続き推論を処理できます
- 新規のサインイン: デバイスフローとそのレート制限カウンターは Postgres に保存されているため、Postgres が復旧するまで失敗します
- 利用額上限の適用: デフォルトでは障害中はフェイルオープンになるため、推論は引き続き流れます。計測なしで稼働するよりもブロックしたい場合は、フェイルクローズに切り替えてください
- Readiness: デフォルトでは、Postgres に到達できなくなるとすぐに
/readyzが not-ready を報告するため、すべてのレプリカが同時に readiness チェックに失敗します。チェックに合格したレプリカにのみトラフィックが届く環境では、ゲートウェイがまだ処理できる推論を含むすべてのトラフィックが、Postgres が復旧するまで失敗します。/healthzの liveness プローブはその間も合格し続けます。
ttl_hours まで機能し、新規のログインは失敗します。セッションのリフレッシュには再試行を求める応答が返され、IdP が復旧すると成功します。IdP のメンテナンス時間が頻繁にある場合は、ttl_hours を長めに設定してください。
Readiness の猶予期間
データベースのフェイルオーバーのような短時間の Postgres 障害の間もサインイン済みの開発者が作業を続けられるようにするには、store.readiness_grace_seconds をフェイルオーバーにかかる時間より長い値(たとえば 300)に設定します。利用額上限が有効でデフォルトのフェイルオープン動作の場合、ready のままのレプリカを経由するリクエストは Postgres が復旧するまで計測されないため、値はフェイルオーバーをカバーできる範囲でできるだけ小さくしてください。enforcement.fail_closed_on_error: true を設定した場合、レプリカが readiness チェックに合格している間でも、Postgres が復旧するまでゲートウェイはサインイン済みの開発者の推論を 429 の spend limit unavailable メッセージで拒否します。
この設定には、ゲートウェイサーバーで Claude Code v2.1.282 以降が必要です。それより前のゲートウェイはこのキーを検出すると起動を拒否するため、キーを追加する前にすべてのレプリカをアップグレードしてください。ロールバックについてはアップグレードで説明しています。
代わりに readiness プローブを /healthz に向けた場合も、障害中にレプリカはプローブに合格し続けますが、/healthz は not-ready を報告することがないため、Postgres 接続が復旧しないレプリカも合格し続けます。
JWT シークレットのローテーション
既存のセッションが有効なままになるよう、署名シークレットは段階的にローテーションします。- 新しいシークレットを生成します。それを
session.jwt_secret配列の先頭に追加します。 - デプロイをロールします。新しいトークンは新しいシークレットで署名され、古いトークンも引き続き検証されます。
ttl_hoursに余裕を加えた時間が経過したら、古いシークレットを削除して再度ロールします。
ttl_hours 以内に終了します。
Postgres
ゲートウェイは状態を PostgreSQL データベースに保存します。- データベース: PostgreSQL 本体(セルフホストまたはマネージド)で、最小バージョン以降のもの。分散 SQL データベースなど、Postgres プロトコルを実装しているだけのデータベースはサポートされていません。
- アドレス:
store.postgres_urlには 1 つのホストを指定します。データベースに複数のノードがある場合は、マネージドサービスのエンドポイント、ロードバランサー、仮想 IP など、それらの前段にあるアドレスを使用してください。フェイルオーバーにかかる時間より長い readiness の猶予期間を設定してください。
_migrations テーブルを保持し、いずれも起動時のマイグレーションによって作成されます。
30 秒ごとのループが TTL を過ぎた
kv の行を期限切れにし、1 時間ごとのスイープが利用額テーブルの保持期間を適用するため、無制限に増え続けるものはありません。利用額上限が設定されていない場合、書き込まれるのは kv のみです。ゲートウェイは起動時およびアップグレードのたびに独自のスキーママイグレーションを適用するため、そのデータベースロールにはテーブルを作成および変更する権限が必要です。その権限付与の範囲を狭く保つため、ゲートウェイ専用のデータベースまたはスキーマを指定してください。
利用額上限を使用している場合、データベースを失うと開発者の再ログインだけでなく、利用額の追跡と上限も失われるため、定期的にバックアップを取ってください。保持期間を待たずに退職した開発者 1 人のデータを即座に消去するには、DELETE FROM principal_emails WHERE principal = '<sub>' を直接実行します。これにより、その開発者のメールアドレス、名前、グループを保持する唯一のテーブルから削除されます。spend と admin_audit の行は、仮名化された OIDC の sub のみを参照します。
接続プールのサイズを決める
各レプリカは最大store.max_connections 個の Postgres 接続を開きます。デフォルトは 5 です。レプリカ数 × store.max_connections が、データベースがゲートウェイ用に残している接続数以下になるようにしてください。
- レプリカ数: 同時に稼働する最大数を数えます。オートスケーリングの最大値(オートスケールしていない場合はレプリカ数)から始め、ローリングアップデートで古いレプリカを停止する前に起動される追加のレプリカを加えます。デフォルト設定の Amazon ECS や Cloud Run では、それが同数に及ぶことがあります。
- 残りの接続数: データベースの
max_connectionsから、データベースが予約している分と他のクライアントが保持している分を差し引きます。PostgreSQL はsuperuser_reserved_connectionsを予約しており、デフォルトは 3 です。マネージドサービスではさらに多く予約されている場合があるため、そのドキュメントを確認してください。
max_connections が 50 で、他のクライアントが 2 つの接続を保持しているデータベースでは、残りは 50 − 3 − 2 = 45 となるため、合計は収まります。
合計が収まらない場合は、次のいずれかを変更します。
- データベース:
max_connectionsを引き上げる - レプリカ: 稼働数を減らすか、ローリングアップデートで起動する追加のレプリカを減らすようオーケストレーターを設定する
- プール:
store.max_connectionsを下げる。ただし、利用額上限が有効な場合は、各レプリカの負荷に十分な大きさを保ってください。そうしないと、利用額チェックが接続を待つ間にタイムアウトする可能性があり、ゲートウェイはspend check failed: spend precheck timed outをログに記録します。
アップグレード
レプリカはステートレスであるため、ローリング再起動でゲートウェイの状態が失われることはありません。ゲートウェイは起動時にスキーママイグレーションを実行するため、新しいバイナリをデプロイするとデータベースが自動的にマイグレーションされます。同時に稼働するレプリカは Postgres のアドバイザリーロックで直列化されるため、各マイグレーションを適用するのは 1 つのレプリカのみです。 ローリング再起動やスケールインのように、オーケストレーターがSIGTERM でレプリカを停止すると、ゲートウェイは新しい接続の受け付けを停止し、処理中のリクエストとストリームが完了するのを待ってから終了します。最大 25 秒(ドレインウィンドウと呼びます)待機し、その後もまだ開いているものを閉じます。ターミナルでの Ctrl+C のような SIGINT でも同じドレインが開始され、ドレイン中に 2 回目のシグナルを受け取ると、開いているリクエストを閉じて直ちに終了します。ドレインにはゲートウェイ v2.1.274 以降が必要です。
長い生成は数分間ストリーミングされることがあります。Kubernetes と Amazon ECS では、それらのストリームにより多くの時間を与えるために、次の 2 つを一緒に引き上げてください。
- ドレインウィンドウ: ゲートウェイコンテナで
CLAUDE_GATEWAY_DRAIN_TIMEOUT_MS環境変数を、120000のようなミリ秒単位の正の整数に設定します。120sのような他の形式の値はゲートウェイに無視され、デフォルトの 25 秒が維持されます - オーケストレーターの猶予期間: Kubernetes では
terminationGracePeriodSeconds、Amazon ECS ではstopTimeout
preStop フックの所要時間も加えてください。猶予期間のカウントは、ゲートウェイが SIGTERM を受け取った時点ではなく、フックが実行される前から始まるためです。
プラットフォームによっては、ドレインを実行できる時間に上限がある場合もあります。
- Fargate 上の Amazon ECS:
stopTimeoutは最大 120 秒までです - Cloud Run:
SIGTERMの 10 秒後にインスタンスを停止するため、ドレインウィンドウの値にかかわらず、開いているストリームに与えられる時間は最大 10 秒です
drain window over after を含む警告をログに記録し、切断したリクエストの数を数え、引き上げるべき 2 つの設定の名前を示します。
マイグレーションは追記のみであるため、認識しているマイグレーションが少ない以前のバイナリへのロールバックは安全です。以前のバイナリは余分な行を無視します。また、ロールバック時には YAML が古いバイナリのスキーマに対して再検証されるため、新しいリリースで導入されたキーを採用した設定は、古いバイナリでの起動に失敗します。ロールバックする前に新しいキーを削除してください。
ゲートウェイのバージョンは自社のイメージで固定するため、新しい Claude Code リリースの修正(セキュリティ修正を含む)がデプロイ環境に反映されるのは、固定バージョンを更新して再デプロイしたときだけです。本番環境の認証情報を保持する他のサービスと同じパッチ適用サイクルにゲートウェイを含めてください。
セキュリティ
このセクションは、セキュリティレビューが尋ねる質問に答えます:ゲートウェイを通じてどのデータが流れ、どこに行くか、設計が防御する攻撃、コンプライアンスアンケートに属する回答。データフロー
脅威モデルの概要
ゲートウェイはネットワーク境界内に位置しますが、個々の開発者ラップトップは信頼されていないと見なされます。設計はこれを 3 つの方法で説明します:- 開発者は生の上流キーの代わりに短命の JWT を保持します。CLI からゲートウェイへのレッグは RFC 8628 デバイスグラントを使用し、ゲートウェイの IdP との認可コード交換はデフォルト設定で PKCE を実行するため、インターセプトされた IdP 認可コードは無用です。
- デバイス検証ページは同一オリジン POST と RFC 8628 §5.1 ごとの IP ごとのレート制限を実装します。ユーザーコードブルートフォース耐性 を参照してください。
-
ゲートウェイの IdP、OTLP コレクター、および
provider: anthropic上流へのリクエストは、サーバー側リクエストフォージェリ(SSRF)ガードを通じて行われます。DNS を解決し、リンクローカルとクラウドメタデータアドレスをブロックし、デフォルトではループバックをブロックし、接続を解決された IP にピン留めするため、オペレーター影響 URL はクラウドメタデータエンドポイントにリダイレクトできません。RFC 1918 プライベート範囲は意図的に許可されます。IdP と OTLP コレクターは一般的にプライベート IP に存在するため。その他のプロバイダーの場合、ゲートウェイは設定をロードするときにそれらのアドレスまたはメタデータホスト名を指定するbase_urlを拒否し、プロバイダーの SDK は DNS チェックなしで接続します。 プロキシのみのエグレス をオンにすると、そのアドレスチェックはフォワードプロキシに移動します:ゲートウェイはホスト名を渡し、プロキシのアロウリストはそれらの宛先を拒否する必要があります。 ゲートウェイが正当に到達する必要があるもの(ローカル開発 IdP やサイドカー OTLP コレクター(localhostなど))がループバック上に存在する場合にのみ、ゲートウェイの環境でCLAUDE_GATEWAY_ALLOW_LOOPBACK=1を設定します。変数はすべてのオペレーター設定 URL のループバックブロックを緩和し、ポッドがクラウドメタデータエンドポイントに到達できるかどうかをチェックするブート時警告もスキップするため、コレクターに独自の内部アドレスを与えることをお勧めします。
- 侵害されたゲートウェイホスト:ホストは上流認証情報を保持し、管理設定 をすべての接続された開発者に配布するため、ゲートウェイの設定の制御は MDM の制御に匹敵します。CLI の 承認ダイアログ はシェル対応設定のサイレント変更を制限しますが、ホストセキュリティに置き換わりません。
- 悪意のある OIDC プロバイダー:プロバイダーはゲートウェイが信頼する id_token に署名するため、任意のアイデンティティを主張できます。IdP の検証と保護はあなたの責任です。
ユーザーコードブルートフォース耐性
開発者が/device 検証ページに入力する user_code は、20 文字のアルファベットから引き出された 8 文字です。これは 20⁸ または約 2.56×10¹⁰ の組み合わせを生成し、10 分後に期限切れになります。
ゲートウェイは rate_limits を通じて設定可能なデバイスグラントエンドポイントに IP ごとのレート制限を適用します。多くの開発者が単一の共有企業 NAT アドレスからサインインする場合は、制限を上げます。大規模ロールアウト は、それらのサイズを決定する方法を示しています。制限はサインインフローにのみ適用され、推論には適用されません。
コンプライアンス体制
- データレジデンシー:ゲートウェイ自体のデータプレーンは、Anthropic API が設定された上流の場合を除き、Anthropic に何も送信しません。その場合、既存のデータ処理契約が推論パスに適用されます。テレメトリ、監査、アイデンティティ、設定は設定した宛先にのみ行きます。
- ホストプロセストラフィック:ホストプロセスは Claude Code CLI です。
claude gatewayは Amazon Bedrock および Google Cloud の Agent Platform デプロイメントと同じサードパーティルールの下で実行され、Anthropic に何も送信しません。v2.1.227 より前では、ホストプロセスは製品バージョンとプラットフォームなどのスタートアップテレメトリを送信していました。これはコンテナ環境でCLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1を設定することでオフにできました。これらのリリースはまた、ボート時に本文または認証情報なしで 1 つのHEADリクエストをhttps://api.anthropic.comの/api/helloに送信していました。または環境がANTHROPIC_BASE_URLを設定した場合はそれに、環境がHTTPS_PROXYなどのプロキシ変数または mTLS クライアント証明書も設定していない限り。彼らは応答を無視したため、エグレスファイアウォールでそのリクエストをブロックしてもゲートウェイに影響しませんでした。 - クライアント分析:CLI はゲートウェイにサインインしている間、独自の使用分析とエラー報告を無効にします。最初のサインイン前に、CLI はまだ Anthropic にスタートアップイベントを送信します。これには、管理設定がゲートウェイサインインを強制するマシンも含まれます。これらもオフにするには、ゲートウェイサインインを強制する同じ クライアント側管理設定 で
DISABLE_TELEMETRYを配信します。 - エラー報告:CLI はモデルリクエストが Anthropic のファーストパーティ API 以外のエンドポイント(Amazon Bedrock やカスタム
ANTHROPIC_BASE_URLなど)に行くときはいつでもエラー報告をオフにします。 - クライアントマシン:開発者の CLI は、
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1とskipWebFetchPreflight: trueが設定されていない限り、WebFetch ホスト名チェックとバージョンチェックを Anthropic に送信し続けます。プラグインマーケットプレイスのリクエスト には独自のオフスイッチがあります。データ使用 を参照してください。 - サーベイ評価:ゲートウェイにサインインしている間、CLI は Anthropic バウンド評価アップロードを分析ストリームと一緒に無効にするため、評価を Anthropic に送信しません。
- トランスクリプト共有:サーベイのトランスクリプト共有プロンプトで「はい」を選択すると、Anthropic にアップロードする代わりに
~/.claude/feedback-bundles/の下にローカルファイルを書き込みます。 - クライアント更新:更新チェックはゲートウェイトラフィックとは別です。独自の配布を通じてバージョンをピン留めし、ラップトップがリリースをフェッチしてはいけない場合は
DISABLE_UPDATESを設定します。DISABLE_AUTOUPDATERはバックグラウンド更新のみを停止し、claude updateは引き続き機能します。 - TLS:本番環境で
public_urlを HTTPS 経由で提供します。ゲートウェイ自体のリスナー経由でlisten.tlsを使用するか、プレーン HTTP レプリカの前の TLS 終了 ingress からlisten.public_urlを設定します。どちらの場合でも。ゲートウェイはプレーン HTTP を拒否しません。IdP は本番環境で HTTPS を提供する必要があり、Postgres は?sslmode=requireをサポートします。ingress でStrict-Transport-Securityを設定します。 - 脆弱性開示:セキュリティ問題の報告 に従います
プラグインマーケットプレイスのリクエスト
Claude Code は、プラグインマーケットプレイスをゲートウェイ経由ではなく、各開発者のマシンから直接取得します。ホストの一覧は ネットワークアクセス要件 に記載されています。 開発者が初めてインタラクティブなターミナルセッションを開始すると、Claude Code は公式マーケットプレイスclaude-plugins-official を登録します。カタログは downloads.claude.ai からダウンロードされ、それが失敗した場合は github.com からクローンされます。その後の更新については 自動更新されるマーケットプレイスとプラグイン で説明しています。
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1 では最初の登録は止まりません。次のいずれかの管理設定で止めることができます:
- マーケットプレイスリスト:そのマーケットプレイスを含まない
strictKnownMarketplaces許可リスト、またはそのマーケットプレイスを指定するblockedMarketplacesエントリ - 環境変数:管理設定の
envブロック でCLAUDE_CODE_DISABLE_OFFICIAL_MARKETPLACE_AUTOINSTALLを"1"に設定
cli または code ブロック に加えて、クライアント側管理設定 でも選択した設定を配信してください。
トラブルシューティング
ご質問やフィードバックについては、Claude Code サポートをご利用いただくか、Claude Code GitHub リポジトリで issue を開いてください。Anthropic のアカウントチームに問い合わせることもできます。問題を報告する際は、以下の情報を含めてください。- Gateway の問題: gateway の stderr(該当するウィンドウの)、
gateway.yaml(シークレットは削除)、gateway のバージョン(ランディングページの/と/managed/settingsのx-cc-gateway-versionレスポンスヘッダーに表示)、および最近の変更内容 - ログイン問題: 開発者が
claude --debug-file ./claude-debug.txtを実行して再現し、そのファイルと同じウィンドウの gateway の監査ログを送信 - 推論の問題: リクエストされたモデル、設定されたアップストリーム、およびリクエストの gateway 監査ログ(どのアップストリームがそれを処理したか、およびレスポンスステータスを記録)
Cloud gateway sign-in was not completed メッセージには gateway ホスト名が示されます。Claude Code がピンされたフィンガープリントと提示されたフィンガープリントの両方を持つ場合、メッセージにはそれぞれの最初の 16 文字も表示されます。
Claude Code がゲートウェイサインイン後に couldn't load your organization's managed settings を報告する場合、Claude Code は理由を示し、その場で再起動して、会話を再開します。Claude Code が再起動できない場合(例えば、バックグラウンドセッション)、Claude Code はセッションを終了し、サインインを保持します。
サインイン後にリクエストヘッダーが大きすぎる
開発者が多数の IdP グループに所属している場合、サインイン後に開発者のリクエストが431 エラーで失敗することがあります。
gateway は、リクエストのヘッダーの合計が 256 KiB(limits.max_request_header_bytes を設定している場合はその値)を超えると 431 で応答します。これらのリクエストについては、ログ行も監査イベントも書き込みません。v2.1.284 より前の gateway バージョンは、16 KiB を超えると 431 で応答します。
以下のうち、gateway に該当する最初の項目から対応してください。
- v2.1.284 より古い gateway: gateway をアップグレードしてください
limits.max_request_header_bytesが設定されている: 値を上げるか、キーを削除してください- いずれにも該当しない、またはその後も
431が続く: IdP が発行するグループを減らしてください。Okta、Microsoft Entra ID、Google Workspace がグループを提供する方法については、Identity provider setup を参照してください
oidc.allowed_groups: サインインできるユーザーを決定しますadmin.admin_groups: gateway セッションで管理 API を呼び出せるユーザーを決定しますmanaged.policies内のmatch.groups: 開発者に適用されるポリシーを決定します- アップストリームの
groups: 開発者に対応するアップストリームを決定します rbac_group支出上限: 開発者に適用されるグループ上限を決定します
長い思考がプロキシのタイムアウトで終わる
アップストリームがprovider: anthropic の場合は、代わりに Anthropic API アップストリームでの長い思考を参照してください。そちらでも CLAUDE_STREAM_IDLE_TIMEOUT_MS を上げますが、時間とエラーが異なります。
長い思考の後にターンが失敗し、プロキシが約 12.5 分間開いたままのリクエストを 1 件記録し、その後 504 エラーを連続して記録する場合は、ゲートウェイのポリシーで CLAUDE_STREAM_IDLE_TIMEOUT_MS を上げてください。例えば、プロキシのアイドルタイムアウトが 240 秒の場合、連続するのは 10 件のリクエストで、それぞれが 240 秒で切断されます。
- 最初のリクエスト: 最初のレスポンスイベントである
message_startを配信した後、Claude が思考している間は ping のみを運ぶストリームです。デフォルト設定では、Claude Code は約 12.5 分後にこのストリームを終了します。 - 残りの 10 件: 同じリクエストをストリーミングなしで送信し、その後再試行したもので、デフォルトでは合計 10 回送信されます。これらには ping が届かないため、応答が遅いとプロキシのタイムアウトに達します。
原因を確認する
開発者にclaude --debug-file ./claude-debug.txt で失敗を再現してもらい、そのファイルで次の行を検索してください。
CLAUDE_CODE_DISABLE_NONSTREAMING_FALLBACK を 1 に設定している場合、ストリーミングなしのリクエストは発生せず、ターンは API Error: Stream idle timeout - no chunks received で終了します。同じ修正が適用されます。
値を選ぶ
2 列目が最も長い思考の間をカバーするCLAUDE_STREAM_IDLE_TIMEOUT_MS の値を選んでください。それがわからない場合は 1800000 から始めてください。ストリームは、この値より約 7.5 分長く ping のみで維持できます。
ゲートウェイが ping を送り続けている間にアップストリームがハングした場合、開発者も Claude Code がストリームを諦めるまでそれだけの時間待つことになります。完全に無音になった接続は、ボディのアイドルタイムアウトがこの変数に従わないため、引き続き 5〜6 分後に終了します。
ポリシーで値を配信する
対象とする開発者にすでに Claude Code の設定を配信しているgateway.yaml 内の各ポリシーに、env エントリを追加してください。そのポリシーにすでにある code、cli、または settings キーの下に配置します。まず値を試すには、1 つのグループに一致するポリシーから始めてください。ポリシーの一致と継承の仕組みについては、managed を参照してください。この例では、cli をキーとする match: {} ポリシーにエントリを追加します。
cli キーを使うと、ターミナル、IDE 拡張機能、Agent SDK のセッションが対象になります。Claude Desktop の Code タブについては、cli または code を選ぶを参照してください。
編集したファイルを読み込むようにゲートウェイを再起動してください。その後、開発者に Claude Code を再起動してもらい、CLAUDE_STREAM_IDLE_TIMEOUT_MS を取得させてください。
Anthropic API アップストリームでの長い思考
provider: anthropic がモデルの唯一のアップストリームで、プロキシが約 20 分間開いたままのリクエストを 1 件記録し、その後 502 または 504 エラーを記録する場合は、ゲートウェイのポリシーで CLAUDE_STREAM_IDLE_TIMEOUT_MS を上げてください。
- 長いリクエスト:
message_startを配信した後、Claude が思考している間は ping のみを運ぶストリームです。Claude Code はデフォルト設定では約 20 分後にこれを終了し、変数を上げるとそれより後に終了します。 - エラー: その後 Claude Code がストリーミングなしで送信するリクエストです。それぞれがゲートウェイからの
502で失敗するか、プロキシのタイムアウトがゲートウェイの待機時間より短い場合はプロキシの504で失敗します。その待機時間はtimeouts.upstream_ttfb_msですが、この修正のために上げる必要はありません。
900000 では 30 分、1800000 では 45 分です。その後、ポリシーで値を配信するの手順に従ってください。
関連
- Claude apps gateway の概要:クイックスタートと開発者接続
- 設定リファレンス:すべての
gateway.yamlオプション