Gateway
विश्वसनीय प्रॉक्सी प्रमाणीकरण
कब उपयोग करें
trusted-proxy auth मोड का उपयोग तब करें जब:
- आप OpenClaw को किसी identity-aware proxy (Pomerium, Caddy + OAuth, nginx + oauth2-proxy, Traefik + forward auth) के पीछे चलाते हैं।
- आपका proxy पूरा प्रमाणीकरण संभालता है और headers के जरिए user identity पास करता है।
- आप Kubernetes या container परिवेश में हैं जहां proxy ही Gateway तक पहुंचने का एकमात्र रास्ता है।
- आपको WebSocket
1008 unauthorizedत्रुटियां मिल रही हैं क्योंकि browsers WS payloads में tokens पास नहीं कर सकते।
कब उपयोग न करें
- यदि आपका proxy users को authenticate नहीं करता (सिर्फ TLS terminator या load balancer है)।
- यदि Gateway तक कोई ऐसा रास्ता है जो proxy को bypass करता है (firewall holes, internal network access)।
- यदि आप सुनिश्चित नहीं हैं कि आपका proxy forwarded headers को सही तरह strip/overwrite करता है या नहीं।
- यदि आपको केवल व्यक्तिगत single-user access चाहिए (सरल setup के लिए Tailscale Serve + loopback पर विचार करें)।
यह कैसे काम करता है
Proxy user को authenticate करता है
आपका reverse proxy users को authenticate करता है (OAuth, OIDC, SAML, आदि)।
Proxy एक identity header जोड़ता है
Proxy authenticated user identity के साथ एक header जोड़ता है (जैसे, x-forwarded-user: nick@example.com)।
Gateway trusted source सत्यापित करता है
OpenClaw जांचता है कि request किसी trusted proxy IP से आई है (gateway.trustedProxies में configured)।
Gateway identity निकालता है
OpenClaw configured header से user identity निकालता है।
Authorize
यदि सब कुछ सही पाया जाता है, तो request authorized होती है।
Control UI pairing व्यवहार
जब gateway.auth.mode = "trusted-proxy" सक्रिय हो और request trusted-proxy checks पास कर ले, तो Control UI WebSocket sessions device pairing identity के बिना connect कर सकते हैं।
Scope implications:
- Device-less Control UI WebSocket sessions connect करते हैं लेकिन default रूप से कोई operator scopes प्राप्त नहीं करते। OpenClaw requested scope list को
[]पर clear कर देता है ताकि ऐसा session जो approved paired device/token से bound नहीं है, permissions self-declare न कर सके। - यदि सफल WebSocket connect के बाद methods
missing scopeके साथ fail हों, तो HTTPS का उपयोग करें ताकि browser device identity generate कर सके और pairing complete कर सके। देखें Control UI insecure HTTP। - केवल break-glass:
gateway.controlUi.dangerouslyDisableDeviceAuth=truedevice identity के बिना भी requested scopes को preserve करता है। यह गंभीर security downgrade है; जल्दी revert करें। देखें Control UI insecure HTTP।
Reverse-proxy scope capping:
- यदि आपका proxy Control UI WebSocket upgrade request पर
x-openclaw-scopesभेजता है, तो OpenClaw session scopes को requested scopes और declared scopes के intersection तक cap करता है। यह header scopes grant नहीं करता; यह केवल session द्वारा रखे जा सकने वाले scopes को narrow करता है।
Implications:
- इस mode में Control UI access के लिए pairing अब primary gate नहीं है।
- आपकी reverse proxy auth policy और
allowUserseffective access control बन जाते हैं। - gateway ingress को केवल trusted proxy IPs तक locked रखें (
gateway.trustedProxies+ firewall)।
Custom WebSocket clients Control UI sessions नहीं हैं। gateway.controlUi.dangerouslyDisableDeviceAuth arbitrary client.mode: "backend" या CLI-shaped clients को scopes grant नहीं करता। Custom automation को device identity/pairing, reserved direct-local client.id: "gateway-client" backend helper path, या admin HTTP RPC plugin का उपयोग करना चाहिए जब HTTP request/response surface बेहतर fit हो।
कॉन्फ़िगरेशन
{ gateway: { // Trusted-proxy auth expects requests from a non-loopback trusted proxy source by default bind: "lan", // CRITICAL: Only add your proxy's IP(s) here trustedProxies: ["10.0.0.1", "172.17.0.1"], auth: { mode: "trusted-proxy", trustedProxy: { // Header containing authenticated user identity (required) userHeader: "x-forwarded-user", // Optional: headers that MUST be present (proxy verification) requiredHeaders: ["x-forwarded-proto", "x-forwarded-host"], // Optional: restrict to specific users (empty = allow all) allowUsers: ["nick@example.com", "admin@company.org"], // Optional: allow a same-host loopback proxy after explicit opt-in allowLoopback: false, }, }, },}कॉन्फ़िगरेशन संदर्भ
gateway.trustedProxiesstring[]requiredTrust करने के लिए proxy IP addresses की array। अन्य IPs से आने वाली requests reject की जाती हैं।
gateway.auth.modestringrequired"trusted-proxy" होना चाहिए।
gateway.auth.trustedProxy.userHeaderstringrequiredAuthenticated user identity रखने वाले header का नाम।
gateway.auth.trustedProxy.requiredHeadersstring[]अतिरिक्त headers जो request को trusted मानने के लिए present होने चाहिए।
gateway.auth.trustedProxy.allowUsersstring[]User identities की allowlist। Empty का अर्थ है सभी authenticated users को allow करना।
gateway.auth.trustedProxy.allowLoopbackbooleanSame-host loopback reverse proxies के लिए opt-in support। Defaults to false।
TLS termination और HSTS
एक TLS termination point का उपयोग करें और HSTS वहीं apply करें।
Proxy TLS termination (अनुशंसित)
जब आपका reverse proxy https://control.example.com के लिए HTTPS संभालता है, तो उस domain के लिए proxy पर Strict-Transport-Security set करें।
- Internet-facing deployments के लिए अच्छा fit।
- Certificate + HTTP hardening policy को एक जगह रखता है।
- OpenClaw proxy के पीछे loopback HTTP पर रह सकता है।
उदाहरण header value:
Strict-Transport-Security: max-age=31536000; includeSubDomainsGateway TLS termination
यदि OpenClaw स्वयं सीधे HTTPS serve करता है (कोई TLS-terminating proxy नहीं), तो set करें:
{ gateway: { tls: { enabled: true }, http: { securityHeaders: { strictTransportSecurity: "max-age=31536000; includeSubDomains", }, }, },}strictTransportSecurity string header value स्वीकार करता है, या explicit रूप से disable करने के लिए false।
Rollout मार्गदर्शन
- Traffic validate करते समय पहले short max age से start करें (उदाहरण के लिए
max-age=300)। - केवल confidence high होने के बाद long-lived values तक बढ़ाएं (उदाहरण के लिए
max-age=31536000)। includeSubDomainsकेवल तब add करें जब हर subdomain HTTPS-ready हो।- Preload का उपयोग केवल तब करें जब आप अपने full domain set के लिए जानबूझकर preload requirements पूरी करते हों।
- Loopback-only local development को HSTS से लाभ नहीं होता।
Proxy setup examples
Pomerium
Pomerium identity को x-pomerium-claim-email (या अन्य claim headers) में और JWT को x-pomerium-jwt-assertion में पास करता है।
{ gateway: { bind: "lan", trustedProxies: ["10.0.0.1"], // Pomerium's IP auth: { mode: "trusted-proxy", trustedProxy: { userHeader: "x-pomerium-claim-email", requiredHeaders: ["x-pomerium-jwt-assertion"], }, }, },}Pomerium config snippet:
routes: - from: https://openclaw.example.com to: http://openclaw-gateway:18789 policy: - allow: or: - email: is: nick@example.com pass_identity_headers: trueCaddy with OAuth
caddy-security plugin वाला Caddy users को authenticate कर सकता है और identity headers पास कर सकता है।
{ gateway: { bind: "lan", trustedProxies: ["10.0.0.1"], // Caddy/sidecar proxy IP auth: { mode: "trusted-proxy", trustedProxy: { userHeader: "x-forwarded-user", }, }, },}Caddyfile snippet:
openclaw.example.com { authenticate with oauth2_provider authorize with policy1 reverse_proxy openclaw:18789 { header_up X-Forwarded-User {http.auth.user.email} }}nginx + oauth2-proxy
oauth2-proxy users को authenticate करता है और identity को x-auth-request-email में पास करता है।
{ gateway: { bind: "lan", trustedProxies: ["10.0.0.1"], // nginx/oauth2-proxy IP auth: { mode: "trusted-proxy", trustedProxy: { userHeader: "x-auth-request-email", }, }, },}nginx config snippet:
location / { auth_request /oauth2/auth; auth_request_set $user $upstream_http_x_auth_request_email; proxy_pass http://openclaw:18789; proxy_set_header X-Auth-Request-Email $user; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade";}Traefik with forward auth
{ gateway: { bind: "lan", trustedProxies: ["172.17.0.1"], // Traefik container IP auth: { mode: "trusted-proxy", trustedProxy: { userHeader: "x-forwarded-user", }, }, },}Mixed token configuration
OpenClaw ऐसी ambiguous configurations को reject करता है जहां gateway.auth.token (या OPENCLAW_GATEWAY_TOKEN) और trusted-proxy mode दोनों एक साथ active हों। Mixed token configs loopback requests को गलत auth path पर चुपचाप authenticate करा सकते हैं।
यदि startup पर आपको mixed_trusted_proxy_token error दिखे:
- Trusted-proxy mode का उपयोग करते समय shared token remove करें, या
- यदि आप token-based auth चाहते हैं तो
gateway.auth.modeको"token"पर switch करें।
Loopback विश्वसनीय-प्रॉक्सी पहचान हेडर अब भी बंद-रूप में विफल होते हैं: समान-होस्ट कॉलर को चुपचाप प्रॉक्सी उपयोगकर्ताओं के रूप में प्रमाणित नहीं किया जाता। आंतरिक OpenClaw कॉलर जो प्रॉक्सी को बायपास करते हैं, इसके बजाय gateway.auth.password / OPENCLAW_GATEWAY_PASSWORD से प्रमाणित हो सकते हैं। विश्वसनीय-प्रॉक्सी मोड में टोकन फ़ॉलबैक जानबूझकर असमर्थित रहता है।
ऑपरेटर स्कोप हेडर
विश्वसनीय-प्रॉक्सी प्रमाणीकरण एक पहचान-वहन करने वाला HTTP मोड है, इसलिए कॉलर HTTP API अनुरोधों पर x-openclaw-scopes के साथ वैकल्पिक रूप से ऑपरेटर स्कोप घोषित कर सकते हैं।
ध्यान दें: WebSocket स्कोप Gateway प्रोटोकॉल हैंडशेक और डिवाइस पहचान बाइंडिंग से निर्धारित होते हैं। Control UI WebSocket अपग्रेड अनुरोधों पर, x-openclaw-scopes केवल सहमति प्राप्त सत्र स्कोप पर एक सीमा है, अनुदान नहीं। विश्वसनीय-प्रॉक्सी के साथ WebSocket स्कोप व्यवहार के लिए, Control UI पेयरिंग व्यवहार देखें।
उदाहरण:
x-openclaw-scopes: operator.readx-openclaw-scopes: operator.read,operator.writex-openclaw-scopes: operator.admin,operator.write
व्यवहार:
- जब हेडर मौजूद होता है, OpenClaw घोषित स्कोप सेट का सम्मान करता है।
- जब हेडर मौजूद होता है लेकिन खाली होता है, अनुरोध कोई ऑपरेटर स्कोप घोषित नहीं करता।
- जब हेडर अनुपस्थित होता है, सामान्य पहचान-वहन करने वाले HTTP API मानक ऑपरेटर डिफ़ॉल्ट स्कोप सेट पर वापस जाते हैं।
- Gateway-प्रमाणीकरण plugin HTTP रूट डिफ़ॉल्ट रूप से अधिक संकरे हैं: जब
x-openclaw-scopesअनुपस्थित होता है, उनका रनटाइम स्कोपoperator.writeपर वापस जाता है। - ब्राउज़र-मूल HTTP अनुरोधों को विश्वसनीय-प्रॉक्सी प्रमाणीकरण सफल होने के बाद भी
gateway.controlUi.allowedOrigins(या जानबूझकर Host-हेडर फ़ॉलबैक मोड) पास करना होता है। - Control UI WebSocket सत्रों के लिए, अपग्रेड अनुरोध पर मौजूद होने पर
x-openclaw-scopesएक स्कोप सीमा है। खाली मान से कोई स्कोप नहीं मिलता।
व्यावहारिक नियम: जब आप चाहते हैं कि कोई विश्वसनीय-प्रॉक्सी अनुरोध डिफ़ॉल्ट से संकरा हो, या जब किसी gateway-auth plugin रूट को write स्कोप से अधिक मजबूत कुछ चाहिए, तब x-openclaw-scopes स्पष्ट रूप से भेजें।
सुरक्षा चेकलिस्ट
विश्वसनीय-प्रॉक्सी प्रमाणीकरण सक्षम करने से पहले, सत्यापित करें:
- [ ] प्रॉक्सी ही एकमात्र पथ है: Gateway पोर्ट आपके प्रॉक्सी के अलावा हर चीज़ से फ़ायरवॉल किया गया है।
- [ ] trustedProxies न्यूनतम है: केवल आपके वास्तविक प्रॉक्सी IP, पूरे सबनेट नहीं।
- [ ] Loopback प्रॉक्सी स्रोत जानबूझकर है: loopback-स्रोत अनुरोधों के लिए विश्वसनीय-प्रॉक्सी प्रमाणीकरण बंद-रूप में विफल होता है, जब तक कि समान-होस्ट प्रॉक्सी के लिए
gateway.auth.trustedProxy.allowLoopbackस्पष्ट रूप से सक्षम न हो। - [ ] प्रॉक्सी हेडर हटाता है: आपका प्रॉक्सी क्लाइंट से आने वाले
x-forwarded-*हेडर को ओवरराइट करता है (जोड़ता नहीं)। - [ ] TLS समाप्ति: आपका प्रॉक्सी TLS संभालता है; उपयोगकर्ता HTTPS से कनेक्ट करते हैं।
- [ ] allowedOrigins स्पष्ट है: non-loopback Control UI स्पष्ट
gateway.controlUi.allowedOriginsका उपयोग करता है। - [ ] allowUsers सेट है (अनुशंसित): किसी भी प्रमाणित व्यक्ति को अनुमति देने के बजाय ज्ञात उपयोगकर्ताओं तक सीमित करें।
- [ ] मिश्रित टोकन कॉन्फ़िग नहीं है:
gateway.auth.tokenऔरgateway.auth.mode: "trusted-proxy"दोनों सेट न करें। - [ ] स्थानीय पासवर्ड फ़ॉलबैक निजी है: यदि आप आंतरिक प्रत्यक्ष कॉलरों के लिए
gateway.auth.passwordकॉन्फ़िगर करते हैं, तो Gateway पोर्ट को फ़ायरवॉल रखें ताकि non-proxy रिमोट क्लाइंट सीधे उस तक न पहुंच सकें।
सुरक्षा ऑडिट
openclaw security audit विश्वसनीय-प्रॉक्सी प्रमाणीकरण को critical गंभीरता वाली खोज के साथ फ़्लैग करेगा। यह जानबूझकर है — यह याद दिलाता है कि आप सुरक्षा को अपनी प्रॉक्सी सेटअप को सौंप रहे हैं।
ऑडिट इनकी जांच करता है:
- आधार
gateway.trusted_proxy_authचेतावनी/critical रिमाइंडर - अनुपस्थित
trustedProxiesकॉन्फ़िगरेशन - अनुपस्थित
userHeaderकॉन्फ़िगरेशन - खाली
allowUsers(किसी भी प्रमाणित उपयोगकर्ता को अनुमति देता है) - समान-होस्ट प्रॉक्सी स्रोतों के लिए सक्षम
allowLoopback - उजागर Control UI सतहों पर वाइल्डकार्ड या अनुपस्थित ब्राउज़र-मूल नीति
समस्या निवारण
trusted_proxy_untrusted_source
अनुरोध gateway.trustedProxies में मौजूद किसी IP से नहीं आया। जांचें:
- क्या प्रॉक्सी IP सही है? (Docker कंटेनर IP बदल सकते हैं।)
- क्या आपके प्रॉक्सी के सामने कोई लोड बैलेंसर है?
- वास्तविक IP खोजने के लिए
docker inspectयाkubectl get pods -o wideका उपयोग करें।
trusted_proxy_loopback_source
OpenClaw ने loopback-स्रोत विश्वसनीय-प्रॉक्सी अनुरोध अस्वीकार कर दिया।
जांचें:
- क्या प्रॉक्सी
127.0.0.1/::1से कनेक्ट कर रहा है? - क्या आप समान-होस्ट loopback reverse proxy के साथ विश्वसनीय-प्रॉक्सी प्रमाणीकरण का उपयोग करने की कोशिश कर रहे हैं?
सुधार:
- उन आंतरिक समान-होस्ट क्लाइंट के लिए token/password प्रमाणीकरण को प्राथमिकता दें जो प्रॉक्सी से होकर नहीं जाते, या
- किसी non-loopback विश्वसनीय प्रॉक्सी पते से रूट करें और उस IP को
gateway.trustedProxiesमें रखें, या - जानबूझकर समान-होस्ट reverse proxy के लिए,
gateway.auth.trustedProxy.allowLoopback = trueसेट करें, loopback पते कोgateway.trustedProxiesमें रखें, और सुनिश्चित करें कि प्रॉक्सी पहचान हेडर को हटाता या ओवरराइट करता है।
trusted_proxy_user_missing
उपयोगकर्ता हेडर खाली या अनुपस्थित था। जांचें:
- क्या आपका प्रॉक्सी पहचान हेडर पास करने के लिए कॉन्फ़िगर है?
- क्या हेडर नाम सही है? (case-insensitive है, लेकिन वर्तनी मायने रखती है)
- क्या उपयोगकर्ता वास्तव में प्रॉक्सी पर प्रमाणित है?
trusted_proxy_missing_header_*
आवश्यक हेडर मौजूद नहीं था। जांचें:
- उन विशिष्ट हेडरों के लिए आपका प्रॉक्सी कॉन्फ़िगरेशन।
- क्या श्रृंखला में कहीं हेडर हटाए जा रहे हैं।
trusted_proxy_user_not_allowed
उपयोगकर्ता प्रमाणित है लेकिन allowUsers में नहीं है। या तो उन्हें जोड़ें या allowlist हटाएं।
trusted_proxy_origin_not_allowed
विश्वसनीय-प्रॉक्सी प्रमाणीकरण सफल हुआ, लेकिन ब्राउज़र Origin हेडर ने Control UI origin जांच पास नहीं की।
जांचें:
gateway.controlUi.allowedOriginsमें सटीक ब्राउज़र origin शामिल है।- आप वाइल्डकार्ड origins पर निर्भर नहीं हैं, जब तक कि आप जानबूझकर allow-all व्यवहार नहीं चाहते।
- यदि आप जानबूझकर Host-हेडर फ़ॉलबैक मोड उपयोग करते हैं, तो
gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=trueसोच-समझकर सेट है।
कनेक्शन सफल होता है लेकिन मेथड अनुपस्थित स्कोप रिपोर्ट करते हैं
WebSocket कनेक्ट होता है, लेकिन chat.history, sessions.list, या
models.list missing scope: operator.read के साथ विफल होता है।
सामान्य कारण:
- डिवाइस-रहित Control UI सत्र: विश्वसनीय-प्रॉक्सी प्रमाणीकरण डिवाइस पहचान के बिना WebSocket कनेक्शन को स्वीकार कर सकता है, लेकिन OpenClaw डिज़ाइन के अनुसार डिवाइस-रहित सत्रों पर स्कोप साफ़ कर देता है।
- कस्टम बैकएंड क्लाइंट:
gateway.controlUi.dangerouslyDisableDeviceAuthControl UI तक सीमित है और मनमाने बैकएंड या CLI-जैसे WebSocket क्लाइंट को स्कोप नहीं देता। - अत्यधिक संकरा
x-openclaw-scopes: यदि आपका प्रॉक्सी Control UI WebSocket अपग्रेड अनुरोध पर यह हेडर inject करता है, तो सत्र स्कोप उसी सेट तक सीमित हो जाते हैं। खाली हेडर मान से कोई स्कोप नहीं मिलता।
सुधार:
- Control UI के लिए, HTTPS का उपयोग करें ताकि ब्राउज़र डिवाइस पहचान बना सके और पेयरिंग पूरी कर सके।
- कस्टम ऑटोमेशन के लिए, डिवाइस पहचान/पेयरिंग, reserved direct-local
gateway-clientबैकएंड helper path, या admin HTTP RPC का उपयोग करें। gateway.controlUi.dangerouslyDisableDeviceAuth: trueका उपयोग केवल अस्थायी Control UI आपातकालीन पथ के रूप में करें।
WebSocket अब भी विफल हो रहा है
सुनिश्चित करें कि आपका प्रॉक्सी:
- WebSocket अपग्रेड का समर्थन करता है (
Upgrade: websocket,Connection: upgrade)। - WebSocket अपग्रेड अनुरोधों पर पहचान हेडर पास करता है (केवल HTTP पर नहीं)।
- WebSocket कनेक्शनों के लिए अलग auth path नहीं रखता।
टोकन प्रमाणीकरण से माइग्रेशन
यदि आप टोकन प्रमाणीकरण से विश्वसनीय-प्रॉक्सी पर जा रहे हैं:
प्रॉक्सी कॉन्फ़िगर करें
उपयोगकर्ताओं को प्रमाणित करने और हेडर पास करने के लिए अपना प्रॉक्सी कॉन्फ़िगर करें।
प्रॉक्सी को स्वतंत्र रूप से टेस्ट करें
प्रॉक्सी सेटअप को स्वतंत्र रूप से टेस्ट करें (headers के साथ curl)।
OpenClaw कॉन्फ़िग अपडेट करें
OpenClaw कॉन्फ़िग को विश्वसनीय-प्रॉक्सी प्रमाणीकरण के साथ अपडेट करें।
Gateway पुनः शुरू करें
Gateway पुनः शुरू करें।
WebSocket टेस्ट करें
Control UI से WebSocket कनेक्शन टेस्ट करें।
ऑडिट
openclaw security audit चलाएं और findings की समीक्षा करें।
संबंधित
- कॉन्फ़िगरेशन — कॉन्फ़िग संदर्भ
- रिमोट एक्सेस — अन्य रिमोट एक्सेस पैटर्न
- सुरक्षा — पूर्ण सुरक्षा गाइड
- Tailscale — केवल-tailnet एक्सेस के लिए सरल विकल्प