Documentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
使用する場面
次の場合はtrusted-proxy 認証モードを使用します。
- OpenClaw を ID 認識プロキシ(Pomerium、Caddy + OAuth、nginx + oauth2-proxy、Traefik + forward auth)の背後で実行している。
- プロキシがすべての認証を処理し、ヘッダー経由でユーザー ID を渡す。
- Kubernetes またはコンテナ環境で、プロキシが Gateway への唯一の経路である。
- ブラウザーが WS ペイロードでトークンを渡せないため、WebSocket
1008 unauthorizedエラーが発生している。
使用しない場面
- プロキシがユーザーを認証しない場合(単なる TLS 終端またはロードバランサー)。
- プロキシを迂回して Gateway に到達できる経路が少しでもある場合(ファイアウォールの穴、内部ネットワークアクセス)。
- プロキシが転送ヘッダーを正しく削除または上書きしているか不明な場合。
- 個人の単一ユーザーアクセスだけが必要な場合(より簡単な設定として Tailscale Serve + ループバックを検討してください)。
仕組み
Control UI ペアリングの動作
gateway.auth.mode = "trusted-proxy" が有効で、リクエストが trusted-proxy チェックを通過した場合、Control UI WebSocket セッションはデバイスペアリング ID なしで接続できます。
影響:
- このモードでは、ペアリングは Control UI アクセスの主なゲートではなくなります。
- リバースプロキシの認証ポリシーと
allowUsersが実効的なアクセス制御になります。 - Gateway への入口は信頼済みプロキシ IP のみに制限してください(
gateway.trustedProxies+ ファイアウォール)。
設定
設定リファレンス
信頼するプロキシ IP アドレスの配列。他の IP からのリクエストは拒否されます。
"trusted-proxy" である必要があります。認証済みユーザー ID を含むヘッダー名。
リクエストを信頼するために存在している必要がある追加ヘッダー。
ユーザー ID の許可リスト。空の場合、すべての認証済みユーザーを許可します。
同一ホストのループバックリバースプロキシのサポートをオプトインします。デフォルトは
false です。TLS 終端と HSTS
TLS 終端点を 1 つ使用し、そこで HSTS を適用します。- プロキシ TLS 終端(推奨)
- Gateway TLS 終端
リバースプロキシが
https://control.example.com の HTTPS を処理する場合、そのドメインの Strict-Transport-Security をプロキシで設定します。- インターネット公開デプロイに適しています。
- 証明書と HTTP 強化ポリシーを 1 か所に保てます。
- OpenClaw はプロキシ背後のループバック HTTP のままにできます。
ロールアウトガイダンス
- トラフィックを検証している間は、まず短い max age(例:
max-age=300)から始めます。 - 十分に確信が持てた後でのみ、長期間の値(例:
max-age=31536000)へ増やします。 - すべてのサブドメインが HTTPS 対応済みの場合にのみ、
includeSubDomainsを追加します。 - ドメインセット全体で preload 要件を意図的に満たす場合にのみ、プリロードを使用します。
- ループバック専用のローカル開発では、HSTS の利点はありません。
プロキシ設定例
Pomerium
Pomerium
Pomerium は Pomerium 設定スニペット:
x-pomerium-claim-email(または他のクレームヘッダー)で ID を渡し、x-pomerium-jwt-assertion で JWT を渡します。OAuth を使用した Caddy
OAuth を使用した Caddy
caddy-security Plugin を使用した Caddy は、ユーザーを認証して ID ヘッダーを渡せます。nginx + oauth2-proxy
nginx + oauth2-proxy
oauth2-proxy はユーザーを認証し、nginx 設定スニペット:
x-auth-request-email で ID を渡します。forward auth を使用した Traefik
forward auth を使用した Traefik
混在トークン設定
OpenClaw は、gateway.auth.token(または OPENCLAW_GATEWAY_TOKEN)と trusted-proxy モードの両方が同時に有効な曖昧な設定を拒否します。混在トークン設定では、ループバックリクエストが誤った認証経路で暗黙的に認証される可能性があります。
起動時に mixed_trusted_proxy_token エラーが表示される場合:
- trusted-proxy モードを使用する場合は共有トークンを削除する、または
- トークンベースの認証を意図している場合は、
gateway.auth.modeを"token"に切り替える。
gateway.auth.password / OPENCLAW_GATEWAY_PASSWORD で認証できます。trusted-proxy モードでは、トークンフォールバックは意図的にサポートされていません。
オペレータースコープヘッダー
Trusted-proxy 認証は ID を伴う HTTP モードであるため、呼び出し元は任意でx-openclaw-scopes によりオペレータースコープを宣言できます。
例:
x-openclaw-scopes: operator.readx-openclaw-scopes: operator.read,operator.writex-openclaw-scopes: operator.admin,operator.write
- ヘッダーが存在する場合、OpenClaw は宣言されたスコープセットを尊重します。
- ヘッダーが存在するが空の場合、リクエストはオペレータースコープが ない ことを宣言します。
- ヘッダーが存在しない場合、通常の ID を伴う HTTP API は標準のオペレーター既定スコープセットにフォールバックします。
- Gateway 認証の Plugin HTTP ルート はデフォルトでより狭くなります。
x-openclaw-scopesが存在しない場合、そのランタイムスコープはoperator.writeにフォールバックします。 - ブラウザー送信元の HTTP リクエストは、trusted-proxy 認証に成功した後でも、
gateway.controlUi.allowedOrigins(または意図的な Host ヘッダーフォールバックモード)を通過する必要があります。
x-openclaw-scopes を明示的に送信してください。
セキュリティチェックリスト
trusted-proxy 認証を有効にする前に、次を確認してください。- プロキシが唯一の経路: Gateway ポートは、プロキシ以外のすべてからファイアウォールで遮断されています。
- trustedProxies は最小限: サブネット全体ではなく、実際のプロキシ IP のみです。
- ループバックのプロキシソースは意図的: trusted-proxy 認証は、同一ホストのプロキシ向けに
gateway.auth.trustedProxy.allowLoopbackが明示的に有効化されていない限り、ループバックソースのリクエストをフェイルクローズします。 - プロキシがヘッダーを除去: プロキシはクライアントからの
x-forwarded-*ヘッダーを追記ではなく上書きします。 - TLS 終端: プロキシが TLS を処理し、ユーザーは HTTPS 経由で接続します。
- allowedOrigins は明示的: 非ループバックのコントロール UI は明示的な
gateway.controlUi.allowedOriginsを使用します。 - allowUsers が設定されている(推奨): 認証済みの全員を許可するのではなく、既知のユーザーに制限します。
- トークン設定が混在していない:
gateway.auth.tokenとgateway.auth.mode: "trusted-proxy"の両方を設定しないでください。 - ローカルパスワードのフォールバックは非公開: 内部の直接呼び出し元向けに
gateway.auth.passwordを構成する場合は、非プロキシのリモートクライアントが直接到達できないように Gateway ポートをファイアウォールで遮断してください。
セキュリティ監査
openclaw security audit は trusted-proxy 認証に critical 重大度の検出結果を付けます。これは意図的です。セキュリティをプロキシ設定に委任していることを思い出すためのものです。
監査では次をチェックします。
- 基本の
gateway.trusted_proxy_authwarning/critical リマインダー trustedProxies構成の欠落userHeader構成の欠落- 空の
allowUsers(認証済みユーザーをすべて許可) - 同一ホストのプロキシソース向けに有効化された
allowLoopback - 公開されたコントロール UI サーフェスでのワイルドカードまたは欠落したブラウザーオリジンポリシー
トラブルシューティング
trusted_proxy_untrusted_source
trusted_proxy_untrusted_source
リクエストが
gateway.trustedProxies 内の IP から来ていません。確認してください。- プロキシ IP は正しいですか?(Docker コンテナーの IP は変わることがあります。)
- プロキシの前にロードバランサーがありますか?
- 実際の IP を見つけるには
docker inspectまたはkubectl get pods -o wideを使用してください。
trusted_proxy_loopback_source
trusted_proxy_loopback_source
OpenClaw はループバックソースの trusted-proxy リクエストを拒否しました。確認してください。
- プロキシは
127.0.0.1/::1から接続していますか? - 同一ホストのループバックリバースプロキシで trusted-proxy 認証を使おうとしていますか?
- プロキシを経由しない内部の同一ホストクライアントには、トークン/パスワード認証を優先するか、
- 非ループバックの信頼済みプロキシアドレスを経由し、その IP を
gateway.trustedProxiesに保持するか、 - 意図的な同一ホストのリバースプロキシでは、
gateway.auth.trustedProxy.allowLoopback = trueを設定し、ループバックアドレスをgateway.trustedProxiesに保持し、プロキシが ID ヘッダーを除去または上書きすることを確認してください。
trusted_proxy_user_missing
trusted_proxy_user_missing
ユーザーヘッダーが空、または欠落しています。確認してください。
- プロキシは ID ヘッダーを渡すように構成されていますか?
- ヘッダー名は正しいですか?(大文字小文字は区別されませんが、スペルは重要です)
- ユーザーは実際にプロキシで認証されていますか?
trusted_proxy_missing_header_*
trusted_proxy_missing_header_*
必須ヘッダーが存在しませんでした。確認してください。
- その特定のヘッダーに関するプロキシ構成。
- チェーン内のどこかでヘッダーが除去されていないか。
trusted_proxy_user_not_allowed
trusted_proxy_user_not_allowed
ユーザーは認証されていますが、
allowUsers に含まれていません。追加するか、許可リストを削除してください。trusted_proxy_origin_not_allowed
trusted_proxy_origin_not_allowed
Trusted-proxy 認証は成功しましたが、ブラウザーの
Origin ヘッダーがコントロール UI のオリジンチェックを通過しませんでした。確認してください。gateway.controlUi.allowedOriginsに正確なブラウザーオリジンが含まれている。- allow-all 動作を意図的に望んでいる場合を除き、ワイルドカードオリジンに依存していない。
- Host ヘッダーのフォールバックモードを意図的に使用する場合は、
gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=trueが意図的に設定されている。
WebSocket still failing
WebSocket still failing
プロキシが次を満たしていることを確認してください。
- WebSocket アップグレードをサポートしている(
Upgrade: websocket、Connection: upgrade)。 - WebSocket アップグレードリクエストで ID ヘッダーを渡している(HTTP だけではない)。
- WebSocket 接続用に別の認証パスを持っていない。