Коли використовувати
Використовуйте режим автентифікаціїtrusted-proxy, коли:
- Ви запускаєте OpenClaw за проксі з урахуванням ідентичності (Pomerium, Caddy + OAuth, nginx + oauth2-proxy, Traefik + forward auth).
- Ваш проксі обробляє всю автентифікацію та передає ідентичність користувача через заголовки.
- Ви працюєте в Kubernetes або контейнерному середовищі, де проксі є єдиним шляхом до Gateway.
- Ви отримуєте помилки WebSocket
1008 unauthorized, бо браузери не можуть передавати токени в корисному навантаженні WS.
Коли НЕ використовувати
- Якщо ваш проксі не автентифікує користувачів (лише TLS-термінатор або балансувальник навантаження).
- Якщо існує будь-який шлях до Gateway в обхід проксі (прогалини у firewall, доступ з внутрішньої мережі).
- Якщо ви не впевнені, чи ваш проксі коректно видаляє/перезаписує переслані заголовки.
- Якщо вам потрібен лише персональний однокористувацький доступ (розгляньте Tailscale Serve + loopback для простішого налаштування).
Як це працює
Проксі автентифікує користувача
Ваш зворотний проксі автентифікує користувачів (OAuth, OIDC, SAML тощо).
Проксі додає заголовок ідентичності
Проксі додає заголовок з ідентичністю автентифікованого користувача (наприклад,
x-forwarded-user: nick@example.com).Gateway перевіряє довірене джерело
OpenClaw перевіряє, що запит надійшов від довіреної IP-адреси проксі (налаштовано в
gateway.trustedProxies).Поведінка сполучення Control UI
Коли активнийgateway.auth.mode = "trusted-proxy" і запит проходить перевірки trusted-proxy, WebSocket-сеанси Control UI можуть підключатися без ідентичності сполученого пристрою.
Наслідки для області дії:
- WebSocket-сеанси Control UI без пристрою підключаються, але типово не отримують операторських областей дії. OpenClaw очищає список запитаних областей дії до
[], щоб сеанс, не прив’язаний до схваленого сполученого пристрою/токена, не міг самостійно оголошувати дозволи. - Якщо методи завершуються помилкою
missing scopeпісля успішного WebSocket-підключення, використовуйте HTTPS, щоб браузер міг згенерувати ідентичність пристрою та завершити сполучення. Див. небезпечний HTTP Control UI. - Лише аварійний обхід:
gateway.controlUi.dangerouslyDisableDeviceAuth=trueзберігає запитані області дії навіть без ідентичності пристрою. Це суттєве зниження рівня безпеки; швидко скасуйте. Див. небезпечний HTTP Control UI.
- Якщо ваш проксі надсилає
x-openclaw-scopesу запиті оновлення WebSocket для Control UI, OpenClaw обмежує області дії сеансу перетином запитаних і оголошених областей дії. Цей заголовок не надає областей дії; він лише звужує те, що може мати сеанс.
- Сполучення більше не є основним бар’єром для доступу до Control UI в цьому режимі.
- Ваша політика автентифікації зворотного проксі та
allowUsersстають фактичним контролем доступу. - Тримайте вхідний доступ до gateway обмеженим лише довіреними IP-адресами проксі (
gateway.trustedProxies+ firewall).
gateway.controlUi.dangerouslyDisableDeviceAuth не надає областей дії довільним клієнтам client.mode: "backend" або клієнтам у стилі CLI. Власна автоматизація має використовувати ідентичність/сполучення пристрою, зарезервований прямий локальний допоміжний шлях backend client.id: "gateway-client" або Plugin admin HTTP RPC, коли поверхня HTTP-запит/відповідь підходить краще.
Конфігурація
Довідник конфігурації
Масив IP-адрес проксі, яким слід довіряти. Запити з інших IP-адрес відхиляються.
Має бути
"trusted-proxy".Ім’я заголовка, що містить ідентичність автентифікованого користувача.
Додаткові заголовки, які мають бути присутні, щоб запит вважався довіреним.
Список дозволених ідентичностей користувачів. Порожнє значення означає дозволити всіх автентифікованих користувачів.
Явне ввімкнення підтримки same-host loopback зворотних проксі. Типово
false.TLS-термінація та HSTS
Використовуйте одну точку TLS-термінації та застосовуйте HSTS там.- TLS-термінація на проксі (рекомендовано)
- TLS-термінація на Gateway
Коли ваш зворотний проксі обробляє HTTPS для
https://control.example.com, задайте Strict-Transport-Security на проксі для цього домену.- Добре підходить для розгортань, доступних з інтернету.
- Тримає політику сертифікатів і HTTP-захисту в одному місці.
- OpenClaw може залишатися на loopback HTTP за проксі.
Рекомендації з розгортання
- Спершу почніть із короткого max age (наприклад,
max-age=300), поки перевіряєте трафік. - Збільшуйте до довготривалих значень (наприклад,
max-age=31536000) лише після високої впевненості. - Додавайте
includeSubDomainsлише якщо кожен піддомен готовий до HTTPS. - Використовуйте preload лише якщо ви свідомо відповідаєте вимогам preload для повного набору доменів.
- Локальна розробка лише через loopback не отримує користі від HSTS.
Приклади налаштування проксі
Pomerium
Pomerium
Pomerium передає ідентичність у Фрагмент конфігурації Pomerium:
x-pomerium-claim-email (або інших claim-заголовках) і JWT у x-pomerium-jwt-assertion.Caddy з OAuth
Caddy з OAuth
Caddy з Plugin Фрагмент Caddyfile:
caddy-security може автентифікувати користувачів і передавати заголовки ідентичності.nginx + oauth2-proxy
nginx + oauth2-proxy
oauth2-proxy автентифікує користувачів і передає ідентичність у Фрагмент конфігурації nginx:
x-auth-request-email.Traefik із forward auth
Traefik із forward auth
Змішана конфігурація токенів
OpenClaw відхиляє неоднозначні конфігурації, де одночасно активніgateway.auth.token (або OPENCLAW_GATEWAY_TOKEN) і режим trusted-proxy. Змішані конфігурації токенів можуть призвести до того, що loopback-запити тихо автентифікуватимуться неправильним шляхом автентифікації.
Якщо під час запуску ви бачите помилку mixed_trusted_proxy_token:
- Видаліть спільний токен, коли використовуєте режим trusted-proxy, або
- Перемкніть
gateway.auth.modeна"token", якщо ви маєте намір використовувати автентифікацію на основі токенів.
gateway.auth.password / OPENCLAW_GATEWAY_PASSWORD. Резервний варіант із токеном у режимі trusted-proxy навмисно не підтримується.
Заголовок операторських scopes
Автентифікація trusted-proxy є HTTP-режимом, що передає ідентичність, тож виклики можуть необов’язково оголошувати операторські scopes за допомогоюx-openclaw-scopes в HTTP API-запитах.
Примітка: WebSocket scopes визначаються handshake протоколу Gateway і прив’язкою ідентичності пристрою. У запитах Control UI на WebSocket upgrade x-openclaw-scopes є лише обмеженням negotiated session scopes, а не наданням прав. Про поведінку WebSocket scope з trusted-proxy див. поведінку pairing Control UI.
Приклади:
x-openclaw-scopes: operator.readx-openclaw-scopes: operator.read,operator.writex-openclaw-scopes: operator.admin,operator.write
- Коли заголовок присутній, OpenClaw враховує оголошений набір scopes.
- Коли заголовок присутній, але порожній, запит оголошує, що операторських scopes немає.
- Коли заголовок відсутній, звичайні HTTP API, що передають ідентичність, повертаються до стандартного набору операторських scopes за замовчуванням.
- Plugin HTTP routes з Gateway-автентифікацією типово мають вужчі права: коли
x-openclaw-scopesвідсутній, їхній runtime scope повертається доoperator.write. - HTTP-запити з браузерним origin усе ще мають пройти
gateway.controlUi.allowedOrigins(або навмисний fallback-режим Host-заголовка) навіть після успішної trusted-proxy auth. - Для WebSocket-сеансів Control UI
x-openclaw-scopesє обмеженням scopes, коли він присутній у upgrade-запиті. Порожнє значення не дає жодних scopes.
x-openclaw-scopes явно, коли хочете, щоб trusted-proxy-запит був вужчим за типові значення, або коли Plugin route з gateway-auth потребує чогось сильнішого за write scope.
Контрольний список безпеки
Перш ніж увімкнути trusted-proxy auth, перевірте:- Proxy є єдиним шляхом: порт Gateway закритий firewall для всього, крім вашого proxy.
- trustedProxies мінімальний: лише фактичні IP-адреси вашого proxy, а не цілі підмережі.
- Джерело loopback proxy є навмисним: trusted-proxy auth завершується відмовою для запитів із loopback-джерела, якщо
gateway.auth.trustedProxy.allowLoopbackне ввімкнено явно для proxy на тому самому хості. - Proxy прибирає заголовки: ваш proxy перезаписує (а не додає)
x-forwarded-*заголовки від клієнтів. - TLS termination: ваш proxy обробляє TLS; користувачі підключаються через HTTPS.
- allowedOrigins задано явно: Control UI не з loopback використовує явний
gateway.controlUi.allowedOrigins. - allowUsers задано (рекомендовано): обмежте доступ відомими користувачами замість дозволяти всім автентифікованим.
- Без змішаної конфігурації токенів: не задавайте одночасно
gateway.auth.tokenіgateway.auth.mode: "trusted-proxy". - Локальний fallback пароля приватний: якщо ви налаштовуєте
gateway.auth.passwordдля внутрішніх прямих викликів, тримайте порт Gateway за firewall, щоб віддалені клієнти не через proxy не могли звернутися до нього напряму.
Аудит безпеки
openclaw security audit позначить trusted-proxy auth знахідкою з критичною серйозністю. Це навмисно — нагадування, що ви делегуєте безпеку налаштуванню свого proxy.
Аудит перевіряє:
- Базове попередження/критичне нагадування
gateway.trusted_proxy_auth - Відсутню конфігурацію
trustedProxies - Відсутню конфігурацію
userHeader - Порожній
allowUsers(дозволяє будь-якого автентифікованого користувача) - Увімкнений
allowLoopbackдля proxy-джерел на тому самому хості - Wildcard або відсутню політику браузерного origin на відкритих поверхнях Control UI
Усунення несправностей
trusted_proxy_untrusted_source
trusted_proxy_untrusted_source
Запит надійшов не з IP у
gateway.trustedProxies. Перевірте:- Чи правильний IP proxy? (IP контейнерів Docker можуть змінюватися.)
- Чи є load balancer перед вашим proxy?
- Використайте
docker inspectабоkubectl get pods -o wide, щоб знайти фактичні IP-адреси.
trusted_proxy_loopback_source
trusted_proxy_loopback_source
OpenClaw відхилив trusted-proxy-запит із loopback-джерела.Перевірте:
- Чи proxy підключається з
127.0.0.1/::1? - Чи намагаєтеся ви використати trusted-proxy auth із loopback reverse proxy на тому самому хості?
- Надавайте перевагу token/password auth для внутрішніх клієнтів на тому самому хості, які не проходять через proxy, або
- Маршрутизуйте через trusted proxy address не з loopback і тримайте цю IP-адресу в
gateway.trustedProxies, або - Для навмисного reverse proxy на тому самому хості задайте
gateway.auth.trustedProxy.allowLoopback = true, тримайте loopback-адресу вgateway.trustedProxiesі переконайтеся, що proxy прибирає або перезаписує заголовки ідентичності.
trusted_proxy_user_missing
trusted_proxy_user_missing
Заголовок користувача був порожній або відсутній. Перевірте:
- Чи ваш proxy налаштований передавати заголовки ідентичності?
- Чи правильна назва заголовка? (без урахування регістру, але написання важливе)
- Чи користувач справді автентифікований на proxy?
trusted_proxy_missing_header_*
trusted_proxy_missing_header_*
Обов’язкового заголовка не було. Перевірте:
- Конфігурацію proxy для цих конкретних заголовків.
- Чи заголовки не прибираються десь у ланцюжку.
trusted_proxy_user_not_allowed
trusted_proxy_user_not_allowed
Користувач автентифікований, але його немає в
allowUsers. Або додайте його, або видаліть allowlist.trusted_proxy_origin_not_allowed
trusted_proxy_origin_not_allowed
Trusted-proxy auth успішна, але браузерний заголовок
Origin не пройшов перевірки origin Control UI.Перевірте:gateway.controlUi.allowedOriginsмістить точний браузерний origin.- Ви не покладаєтеся на wildcard origins, якщо не хочете навмисно дозволити все.
- Якщо ви навмисно використовуєте fallback-режим Host-заголовка,
gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=trueзадано свідомо.
Connection succeeds but methods report missing scope
Connection succeeds but methods report missing scope
WebSocket підключається, але
chat.history, sessions.list або
models.list завершується помилкою missing scope: operator.read.Типові причини:- Сеанс Control UI без пристрою: trusted-proxy auth може допустити WebSocket-з’єднання без ідентичності пристрою, але OpenClaw за задумом очищає scopes у сеансах без пристрою.
- Custom backend client:
gateway.controlUi.dangerouslyDisableDeviceAuthмає scope Control UI і не надає scopes довільним backend або CLI-подібним WebSocket-клієнтам. - Надто вузький
x-openclaw-scopes: якщо ваш proxy вставляє цей заголовок у WebSocket upgrade-запит Control UI, scopes сеансу обмежуються цим набором. Порожнє значення заголовка не дає жодних scopes.
- Для Control UI використовуйте HTTPS, щоб браузер міг згенерувати ідентичність пристрою та завершити pairing.
- Для custom automation використовуйте device identity/pairing, зарезервований direct-local шлях backend helper
gateway-clientабо admin HTTP RPC. - Використовуйте
gateway.controlUi.dangerouslyDisableDeviceAuth: trueлише як тимчасовий break-glass шлях Control UI.
WebSocket still failing
WebSocket still failing
Переконайтеся, що ваш proxy:
- Підтримує WebSocket upgrades (
Upgrade: websocket,Connection: upgrade). - Передає заголовки ідентичності у WebSocket upgrade-запитах (не лише HTTP).
- Не має окремого auth path для WebSocket-з’єднань.
Міграція з token auth
Якщо ви переходите з token auth на trusted-proxy:Пов’язане
- Конфігурація — довідник конфігурації
- Віддалений доступ — інші шаблони віддаленого доступу
- Безпека — повний посібник із безпеки
- Tailscale — простіша альтернатива для доступу лише з tailnet