Gateway
Güvenilir proxy kimlik doğrulaması
Ne zaman kullanılmalı
trusted-proxy kimlik doğrulama modunu şu durumlarda kullanın:
- OpenClaw’ı bir kimlik farkındalıklı proxy arkasında çalıştırıyorsanız (Pomerium, Caddy + OAuth, nginx + oauth2-proxy, Traefik + forward auth).
- Proxy’niz tüm kimlik doğrulamayı yönetiyor ve kullanıcı kimliğini başlıklar aracılığıyla iletiyorsa.
- Proxy’nin Gateway’e giden tek yol olduğu bir Kubernetes veya konteyner ortamındaysanız.
- Tarayıcılar WS yüklerinde token iletemediği için WebSocket
1008 unauthorizedhataları alıyorsanız.
Ne zaman kullanılmamalı
- Proxy’niz kullanıcıların kimliğini doğrulamıyorsa (yalnızca TLS sonlandırıcı veya yük dengeleyiciyse).
- Gateway’e proxy’yi atlayan herhangi bir yol varsa (güvenlik duvarı açıkları, dahili ağ erişimi).
- Proxy’nizin iletilen başlıkları doğru şekilde kaldırıp kaldırmadığından/üzerine yazıp yazmadığından emin değilseniz.
- Yalnızca kişisel tek kullanıcılı erişime ihtiyacınız varsa (daha basit kurulum için Tailscale Serve + loopback’i değerlendirin).
Nasıl çalışır
Proxy kullanıcının kimliğini doğrular
Ters proxy’niz kullanıcıların kimliğini doğrular (OAuth, OIDC, SAML vb.).
Proxy bir kimlik başlığı ekler
Proxy, kimliği doğrulanmış kullanıcı kimliğini içeren bir başlık ekler (örn. x-forwarded-user: nick@example.com).
Gateway güvenilir kaynağı doğrular
OpenClaw, isteğin bir güvenilir proxy IP’sinden geldiğini denetler (gateway.trustedProxies içinde yapılandırılır).
Gateway kimliği çıkarır
OpenClaw, kullanıcı kimliğini yapılandırılmış başlıktan çıkarır.
Yetkilendirme
Her şey doğrulanırsa istek yetkilendirilir.
Control UI eşleştirme davranışı
gateway.auth.mode = "trusted-proxy" etkin olduğunda ve istek trusted-proxy denetimlerinden geçtiğinde, Control UI WebSocket oturumları cihaz eşleştirme kimliği olmadan bağlanabilir.
Kapsam etkileri:
- Cihazsız Control UI WebSocket oturumları bağlanır ancak varsayılan olarak operatör kapsamı almaz. OpenClaw istenen kapsam listesini
[]olarak temizler; böylece onaylanmış eşleştirilmiş bir cihaza/token’a bağlı olmayan bir oturum izinleri kendi kendine beyan edemez. - Başarılı bir WebSocket bağlantısından sonra yöntemler
missing scopeile başarısız olursa, tarayıcının cihaz kimliği oluşturabilmesi ve eşleştirmeyi tamamlayabilmesi için HTTPS kullanın. Bkz. Control UI güvenli olmayan HTTP. - Yalnızca acil durum için:
gateway.controlUi.dangerouslyDisableDeviceAuth=true, cihaz kimliği olmasa bile istenen kapsamları korur. Bu ciddi bir güvenlik düşürmesidir; hızla geri alın. Bkz. Control UI güvenli olmayan HTTP.
Ters proxy kapsam sınırlaması:
- Proxy’niz Control UI WebSocket yükseltme isteğinde
x-openclaw-scopesgönderirse, OpenClaw oturum kapsamlarını istenen kapsamlar ile beyan edilen kapsamların kesişimiyle sınırlar. Bu başlık kapsam vermez; yalnızca oturumun sahip olabileceklerini daraltır.
Etkiler:
- Bu modda eşleştirme artık Control UI erişimi için birincil kapı değildir.
- Ters proxy kimlik doğrulama ilkeniz ve
allowUsersetkin erişim denetimi haline gelir. - Gateway girişini yalnızca güvenilir proxy IP’leriyle kilitli tutun (
gateway.trustedProxies+ güvenlik duvarı).
Özel WebSocket istemcileri Control UI oturumları değildir. gateway.controlUi.dangerouslyDisableDeviceAuth, rastgele client.mode: "backend" veya CLI biçimli istemcilere kapsam vermez. Özel otomasyon, cihaz kimliği/eşleştirme, ayrılmış doğrudan-yerel client.id: "gateway-client" backend yardımcı yolu veya HTTP istek/yanıt yüzeyi daha uygunsa admin HTTP RPC plugin kullanmalıdır.
Yapılandırma
{ gateway: { // Trusted-proxy kimlik doğrulaması varsayılan olarak non-loopback güvenilir proxy kaynağından gelen istekleri bekler bind: "lan", // KRİTİK: Buraya yalnızca proxy’nizin IP’lerini ekleyin trustedProxies: ["10.0.0.1", "172.17.0.1"], auth: { mode: "trusted-proxy", trustedProxy: { // Kimliği doğrulanmış kullanıcı kimliğini içeren başlık (zorunlu) userHeader: "x-forwarded-user", // İsteğe bağlı: bulunması ZORUNLU başlıklar (proxy doğrulaması) requiredHeaders: ["x-forwarded-proto", "x-forwarded-host"], // İsteğe bağlı: belirli kullanıcılarla sınırla (boş = tümüne izin ver) allowUsers: ["nick@example.com", "admin@company.org"], // İsteğe bağlı: açıkça kabul edildikten sonra aynı ana makinedeki loopback proxy’ye izin ver allowLoopback: false, }, }, },}Yapılandırma referansı
gateway.trustedProxiesstring[]requiredGüvenilecek proxy IP adresleri dizisi. Diğer IP’lerden gelen istekler reddedilir.
gateway.auth.modestringrequired"trusted-proxy" olmalıdır.
gateway.auth.trustedProxy.userHeaderstringrequiredKimliği doğrulanmış kullanıcı kimliğini içeren başlık adı.
gateway.auth.trustedProxy.requiredHeadersstring[]İsteğin güvenilir sayılması için bulunması gereken ek başlıklar.
gateway.auth.trustedProxy.allowUsersstring[]Kullanıcı kimlikleri izin listesi. Boş olması tüm kimliği doğrulanmış kullanıcılara izin verileceği anlamına gelir.
gateway.auth.trustedProxy.allowLoopbackbooleanAynı ana makinedeki loopback ters proxy’ler için açıkça etkinleştirilen destek. Varsayılan değer false.
TLS sonlandırma ve HSTS
Tek bir TLS sonlandırma noktası kullanın ve HSTS’yi orada uygulayın.
Proxy TLS sonlandırması (önerilir)
Ters proxy’niz https://control.example.com için HTTPS’yi yönetiyorsa, bu etki alanı için Strict-Transport-Security değerini proxy’de ayarlayın.
- İnternete açık dağıtımlar için uygundur.
- Sertifika + HTTP sertleştirme ilkesini tek yerde tutar.
- OpenClaw proxy arkasında loopback HTTP üzerinde kalabilir.
Örnek başlık değeri:
Strict-Transport-Security: max-age=31536000; includeSubDomainsGateway TLS sonlandırması
OpenClaw HTTPS’yi doğrudan kendisi sunuyorsa (TLS sonlandıran proxy yoksa), şunu ayarlayın:
{ gateway: { tls: { enabled: true }, http: { securityHeaders: { strictTransportSecurity: "max-age=31536000; includeSubDomains", }, }, },}strictTransportSecurity bir dize başlık değeri kabul eder veya açıkça devre dışı bırakmak için false.
Dağıtım rehberi
- Trafiği doğrularken önce kısa bir maksimum yaşla başlayın (örneğin
max-age=300). - Uzun ömürlü değerlere (örneğin
max-age=31536000) yalnızca güven yüksek olduktan sonra yükseltin. includeSubDomainsdeğerini yalnızca her alt etki alanı HTTPS’ye hazırsa ekleyin.- Preload’ı yalnızca tüm etki alanı kümeniz için preload gereksinimlerini bilinçli olarak karşılıyorsanız kullanın.
- Yalnızca loopback yerel geliştirme HSTS’den yararlanmaz.
Proxy kurulum örnekleri
Pomerium
Pomerium kimliği x-pomerium-claim-email içinde (veya diğer claim başlıklarında) ve JWT’yi x-pomerium-jwt-assertion içinde iletir.
{ gateway: { bind: "lan", trustedProxies: ["10.0.0.1"], // Pomerium'un IP'si auth: { mode: "trusted-proxy", trustedProxy: { userHeader: "x-pomerium-claim-email", requiredHeaders: ["x-pomerium-jwt-assertion"], }, }, },}Pomerium yapılandırma parçacığı:
routes: - from: https://openclaw.example.com to: http://openclaw-gateway:18789 policy: - allow: or: - email: is: nick@example.com pass_identity_headers: trueOAuth ile Caddy
caddy-security plugin’ine sahip Caddy, kullanıcıların kimliğini doğrulayabilir ve kimlik başlıklarını iletebilir.
{ gateway: { bind: "lan", trustedProxies: ["10.0.0.1"], // Caddy/sidecar proxy IP'si auth: { mode: "trusted-proxy", trustedProxy: { userHeader: "x-forwarded-user", }, }, },}Caddyfile parçacığı:
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 kullanıcıların kimliğini doğrular ve kimliği x-auth-request-email içinde iletir.
{ gateway: { bind: "lan", trustedProxies: ["10.0.0.1"], // nginx/oauth2-proxy IP'si auth: { mode: "trusted-proxy", trustedProxy: { userHeader: "x-auth-request-email", }, }, },}nginx yapılandırma parçacığı:
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";}forward auth ile Traefik
{ gateway: { bind: "lan", trustedProxies: ["172.17.0.1"], // Traefik konteyner IP'si auth: { mode: "trusted-proxy", trustedProxy: { userHeader: "x-forwarded-user", }, }, },}Karma token yapılandırması
OpenClaw, hem gateway.auth.token (veya OPENCLAW_GATEWAY_TOKEN) hem de trusted-proxy modunun aynı anda etkin olduğu belirsiz yapılandırmaları reddeder. Karma token yapılandırmaları, loopback isteklerinin sessizce yanlış kimlik doğrulama yolunda doğrulanmasına neden olabilir.
Başlangıçta mixed_trusted_proxy_token hatası görürseniz:
- trusted-proxy modunu kullanırken paylaşılan token’ı kaldırın veya
- Token tabanlı kimlik doğrulama amaçlıyorsanız
gateway.auth.modedeğerini"token"olarak değiştirin.
Loopback trusted-proxy kimlik üstbilgileri hâlâ güvenli kapalı şekilde başarısız olur: aynı ana makinedeki çağıranlar sessizce proxy kullanıcıları olarak kimlik doğrulamasından geçirilmez. Proxy'yi atlayan dahili OpenClaw çağıranları bunun yerine gateway.auth.password / OPENCLAW_GATEWAY_PASSWORD ile kimlik doğrulayabilir. Belirteç yedeği trusted-proxy modunda kasıtlı olarak desteklenmemeye devam eder.
Operatör kapsamları üstbilgisi
Trusted-proxy kimlik doğrulaması kimlik taşıyan bir HTTP modudur, bu yüzden çağıranlar HTTP API isteklerinde isteğe bağlı olarak x-openclaw-scopes ile operatör kapsamları bildirebilir.
Not: WebSocket kapsamları Gateway protokol el sıkışması ve cihaz kimliği bağlaması tarafından belirlenir. Control UI WebSocket yükseltme isteklerinde x-openclaw-scopes yalnızca görüşülen oturum kapsamları için bir üst sınırdır, bir yetki vermez. trusted-proxy ile WebSocket kapsam davranışı için bkz. Control UI eşleştirme davranışı.
Örnekler:
x-openclaw-scopes: operator.readx-openclaw-scopes: operator.read,operator.writex-openclaw-scopes: operator.admin,operator.write
Davranış:
- Üstbilgi mevcut olduğunda, OpenClaw bildirilen kapsam kümesini uygular.
- Üstbilgi mevcut ama boş olduğunda, istek hiçbir operatör kapsamı bildirmez.
- Üstbilgi yoksa, normal kimlik taşıyan HTTP API'leri standart varsayılan operatör kapsam kümesine geri döner.
- Gateway kimlik doğrulamalı plugin HTTP rotaları varsayılan olarak daha dardır:
x-openclaw-scopesyoksa, çalışma zamanı kapsamlarıoperator.writekapsamına geri döner. - Tarayıcı kaynaklı HTTP istekleri, trusted-proxy kimlik doğrulaması başarılı olduktan sonra bile
gateway.controlUi.allowedOriginsdenetiminden (veya bilinçli Host üstbilgisi yedek modundan) geçmelidir. - Control UI WebSocket oturumlarında,
x-openclaw-scopesyükseltme isteğinde mevcut olduğunda bir kapsam üst sınırıdır. Boş değer kapsam vermez.
Pratik kural: Bir trusted-proxy isteğinin varsayılanlardan daha dar olmasını istediğinizde veya gateway kimlik doğrulamalı bir plugin rotasının yazma kapsamından daha güçlü bir şeye ihtiyaç duyduğunda x-openclaw-scopes değerini açıkça gönderin.
Güvenlik kontrol listesi
trusted-proxy kimlik doğrulamasını etkinleştirmeden önce şunları doğrulayın:
- [ ] Proxy tek yoldur: Gateway bağlantı noktası, proxy'niz dışında her şeye karşı güvenlik duvarıyla kapatılmıştır.
- [ ] trustedProxies asgaridir: Tüm alt ağlar değil, yalnızca gerçek proxy IP'leriniz.
- [ ] Loopback proxy kaynağı bilinçlidir:
gateway.auth.trustedProxy.allowLoopbackaynı ana makinedeki bir proxy için açıkça etkinleştirilmediği sürece loopback kaynaklı isteklerde trusted-proxy kimlik doğrulaması güvenli kapalı şekilde başarısız olur. - [ ] Proxy üstbilgileri temizler: Proxy'niz istemcilerden gelen
x-forwarded-*üstbilgilerinin üzerine yazar (ekleme yapmaz). - [ ] TLS sonlandırma: Proxy'niz TLS'yi yönetir; kullanıcılar HTTPS üzerinden bağlanır.
- [ ] allowedOrigins açıktır: Loopback dışı Control UI açık
gateway.controlUi.allowedOriginskullanır. - [ ] allowUsers ayarlanmıştır (önerilir): Kimliği doğrulanmış herkese izin vermek yerine bilinen kullanıcılarla sınırlandırın.
- [ ] Karışık belirteç yapılandırması yoktur: Hem
gateway.auth.tokenhem degateway.auth.mode: "trusted-proxy"ayarlamayın. - [ ] Yerel parola yedeği özeldir: Dahili doğrudan çağıranlar için
gateway.auth.passwordyapılandırırsanız, proxy dışı uzak istemcilerin doğrudan erişememesi için Gateway bağlantı noktasını güvenlik duvarıyla kapalı tutun.
Güvenlik denetimi
openclaw security audit, trusted-proxy kimlik doğrulamasını critical önem derecesinde bir bulgu olarak işaretler. Bu kasıtlıdır — güvenliği proxy kurulumunuza devrettiğinize dair bir hatırlatmadır.
Denetim şunları kontrol eder:
- Temel
gateway.trusted_proxy_authuyarısı/kritik hatırlatıcısı - Eksik
trustedProxiesyapılandırması - Eksik
userHeaderyapılandırması - Boş
allowUsers(kimliği doğrulanmış herhangi bir kullanıcıya izin verir) - Aynı ana makine proxy kaynakları için etkinleştirilmiş
allowLoopback - Açığa çıkarılmış Control UI yüzeylerinde joker karakterli veya eksik tarayıcı kaynak ilkesi
Sorun giderme
trusted_proxy_untrusted_source
İstek gateway.trustedProxies içindeki bir IP'den gelmedi. Şunları kontrol edin:
- Proxy IP'si doğru mu? (Docker konteyner IP'leri değişebilir.)
- Proxy'nizin önünde bir yük dengeleyici var mı?
- Gerçek IP'leri bulmak için
docker inspectveyakubectl get pods -o widekullanın.
trusted_proxy_loopback_source
OpenClaw, loopback kaynaklı bir trusted-proxy isteğini reddetti.
Kontrol edin:
- Proxy
127.0.0.1/::1üzerinden mi bağlanıyor? - Aynı ana makinede loopback ters proxy ile trusted-proxy kimlik doğrulaması kullanmaya mı çalışıyorsunuz?
Düzeltme:
- Proxy'den geçmeyen dahili aynı ana makine istemcileri için belirteç/parola kimlik doğrulamasını tercih edin veya
- Loopback olmayan güvenilir bir proxy adresi üzerinden yönlendirin ve bu IP'yi
gateway.trustedProxiesiçinde tutun veya - Bilinçli bir aynı ana makine ters proxy için
gateway.auth.trustedProxy.allowLoopback = trueayarlayın, loopback adresinigateway.trustedProxiesiçinde tutun ve proxy'nin kimlik üstbilgilerini temizlediğinden veya üzerine yazdığından emin olun.
trusted_proxy_user_missing
Kullanıcı üstbilgisi boştu veya eksikti. Şunları kontrol edin:
- Proxy'niz kimlik üstbilgilerini geçirecek şekilde yapılandırılmış mı?
- Üstbilgi adı doğru mu? (büyük/küçük harfe duyarsızdır, ancak yazım önemlidir)
- Kullanıcının proxy'de kimliği gerçekten doğrulanmış mı?
trusted_proxy_missing_header_*
Gerekli bir üstbilgi mevcut değildi. Şunları kontrol edin:
- Bu belirli üstbilgiler için proxy yapılandırmanız.
- Üstbilgilerin zincirin bir yerinde temizlenip temizlenmediği.
trusted_proxy_user_not_allowed
Kullanıcının kimliği doğrulanmış, ancak allowUsers içinde değil. Ya kullanıcıyı ekleyin ya da izin listesini kaldırın.
trusted_proxy_origin_not_allowed
Trusted-proxy kimlik doğrulaması başarılı oldu, ancak tarayıcı Origin üstbilgisi Control UI kaynak denetimlerinden geçmedi.
Kontrol edin:
gateway.controlUi.allowedOriginstam tarayıcı kaynağını içeriyor.- Bilinçli olarak herkese izin verme davranışı istemediğiniz sürece joker karakterli kaynaklara güvenmiyorsunuz.
- Host üstbilgisi yedek modunu bilinçli olarak kullanıyorsanız,
gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=truebilinçli şekilde ayarlanmış.
Connection succeeds but methods report missing scope
WebSocket bağlanır, ancak chat.history, sessions.list veya
models.list, missing scope: operator.read hatasıyla başarısız olur.
Yaygın nedenler:
- Cihazsız Control UI oturumu: trusted-proxy kimlik doğrulaması WebSocket bağlantısını cihaz kimliği olmadan kabul edebilir, ancak OpenClaw tasarım gereği cihazsız oturumlarda kapsamları temizler.
- Özel arka uç istemcisi:
gateway.controlUi.dangerouslyDisableDeviceAuthControl UI kapsamındadır ve rastgele arka uç veya CLI biçimli WebSocket istemcilerine kapsam vermez. - Aşırı dar
x-openclaw-scopes: Proxy'niz bu üstbilgiyi Control UI WebSocket yükseltme isteğine ekliyorsa, oturum kapsamları bu kümeyle sınırlandırılır. Boş üstbilgi değeri kapsam vermez.
Düzeltme:
- Control UI için HTTPS kullanın, böylece tarayıcı cihaz kimliği oluşturabilir ve eşleştirmeyi tamamlayabilir.
- Özel otomasyon için cihaz kimliği/eşleştirme, ayrılmış doğrudan yerel
gateway-clientarka uç yardımcı yolu veya admin HTTP RPC kullanın. gateway.controlUi.dangerouslyDisableDeviceAuth: truedeğerini yalnızca geçici bir Control UI acil durum yolu olarak kullanın.
WebSocket still failing
Proxy'nizin şunları yaptığından emin olun:
- WebSocket yükseltmelerini destekler (
Upgrade: websocket,Connection: upgrade). - Kimlik üstbilgilerini WebSocket yükseltme isteklerinde geçirir (yalnızca HTTP'de değil).
- WebSocket bağlantıları için ayrı bir kimlik doğrulama yolu yoktur.
Belirteç kimlik doğrulamasından geçiş
Belirteç kimlik doğrulamasından trusted-proxy'ye geçiyorsanız:
Configure the proxy
Proxy'nizi kullanıcıların kimliğini doğrulayacak ve üstbilgileri geçirecek şekilde yapılandırın.
Test the proxy independently
Proxy kurulumunu bağımsız olarak test edin (üstbilgilerle curl).
Update OpenClaw config
OpenClaw yapılandırmasını trusted-proxy kimlik doğrulamasıyla güncelleyin.
Restart the Gateway
Gateway'i yeniden başlatın.
Test WebSocket
Control UI'dan WebSocket bağlantılarını test edin.
Audit
openclaw security audit çalıştırın ve bulguları gözden geçirin.
İlgili
- Yapılandırma — yapılandırma referansı
- Uzaktan erişim — diğer uzaktan erişim kalıpları
- Güvenlik — tam güvenlik kılavuzu
- Tailscale — yalnızca tailnet erişimi için daha basit alternatif