Skip to main content
Функція, критична для безпеки. У цьому режимі автентифікацію повністю делеговано зворотному проксі. Неправильна конфігурація може відкрити неавторизований доступ до вашого Gateway. Уважно прочитайте цю сторінку перед увімкненням.

Коли використовувати

  • Ви запускаєте OpenClaw за проксі з підтримкою ідентифікації (Pomerium, Caddy + OAuth, nginx + oauth2-proxy, Traefik + forward auth).
  • Ваш проксі виконує всю автентифікацію та передає ідентичність користувача через заголовки.
  • Ви працюєте в середовищі Kubernetes або контейнерів, де проксі є єдиним шляхом до Gateway.
  • Ви стикаєтеся з помилками WebSocket 1008 unauthorized, оскільки браузери не можуть передавати токени в корисному навантаженні WS.

Коли НЕ використовувати

  • Ваш проксі не автентифікує користувачів, а лише завершує TLS або балансує навантаження.
  • Існує будь-який шлях до Gateway в обхід проксі (прогалини в міжмережевому екрані, доступ із внутрішньої мережі).
  • Ви не впевнені, що проксі правильно видаляє або перезаписує переспрямовані заголовки.
  • Вам потрібен лише особистий однокористувацький доступ (натомість розгляньте Tailscale Serve + local loopback).

Як це працює

1

Проксі автентифікує користувача

Ваш зворотний проксі автентифікує користувачів (OAuth, OIDC, SAML тощо).
2

Проксі додає заголовок ідентичності

Проксі додає заголовок з ідентичністю автентифікованого користувача (наприклад, x-forwarded-user: nick@example.com).
3

Gateway перевіряє довірене джерело

OpenClaw перевіряє, що запит надійшов із довіреної IP-адреси проксі (gateway.trustedProxies), а не з власної адреси local loopback або локального інтерфейсу Gateway.
4

Gateway отримує ідентичність

OpenClaw зчитує обов’язкові заголовки, а потім ідентичність користувача з налаштованого заголовка.
5

Авторизація

Якщо всі перевірки успішні й користувач проходить перевірку allowUsers (якщо її налаштовано), запит авторизується.

Конфігурація

Правила середовища виконання в порядку перевірки
  1. Вихідна IP-адреса запиту має відповідати gateway.trustedProxies з урахуванням CIDR, інакше запит буде відхилено (trusted_proxy_untrusted_source).
  2. Запити з джерела local loopback (127.0.0.1, ::1) відхиляються, якщо не встановлено gateway.auth.trustedProxy.allowLoopback = true і loopback-адресу також не додано до trustedProxies (trusted_proxy_loopback_source). Ця перевірка виконується до перевірки заголовків, тому джерело local loopback завершується цією помилкою, навіть якщо обов’язкові заголовки також відсутні.
  3. Джерела не з local loopback, які відповідають одній із власних адрес локальних мережевих інтерфейсів хоста Gateway, відхиляються для захисту від підміни (trusted_proxy_local_interface_source). Якщо не вдається виконати саме виявлення інтерфейсів, запит також відхиляється (trusted_proxy_local_interface_check_failed).
  4. requiredHeaders і userHeader мають бути наявні та не можуть бути порожніми.
  5. Якщо allowUsers не порожній, він має містити отриманого користувача.
Дані переспрямованих заголовків мають пріоритет над локальністю local loopback для прямого локального резервного механізму. Якщо запит надходить через local loopback, але містить заголовок Forwarded, будь-який X-Forwarded-* або X-Real-IP, ці дані унеможливлюють використання прямого локального резервного механізму пароля та перевірки ідентичності пристрою, хоча автентифікація через довірений проксі все одно завершується помилкою через джерело local loopback.allowLoopback надає локальним процесам на хості Gateway такий самий рівень довіри, як і зворотному проксі. Вмикайте його лише тоді, коли Gateway усе ще захищений міжмережевим екраном від прямого віддаленого доступу, а локальний проксі видаляє або перезаписує надані клієнтом заголовки ідентичності.Внутрішні клієнти Gateway, трафік яких не проходить через зворотний проксі, мають використовувати gateway.auth.password / OPENCLAW_GATEWAY_PASSWORD, а не заголовки ідентичності довіреного проксі. Для розгортань Control UI не через local loopback усе ще потрібно явно налаштувати gateway.controlUi.allowedOrigins.

Довідник із конфігурації

string[]
обов'язково
Масив довірених IP-адрес проксі або діапазонів CIDR. Запити з інших IP-адрес відхиляються.
string
обов'язково
Значення має бути "trusted-proxy".
string
обов'язково
Назва заголовка, що містить ідентичність автентифікованого користувача.
string[]
Додаткові заголовки, які мають бути наявні, щоб запит вважався довіреним.
string[]
Список дозволених ідентичностей користувачів. Порожній список означає, що дозволено всіх автентифікованих користувачів.
boolean
за замовчуванням:"false"
Підтримка зворотних проксі через local loopback на тому самому хості, що вмикається явно.
Вмикайте allowLoopback лише тоді, коли локальний зворотний проксі є передбаченою межею довіри. Будь-який локальний процес, здатний підключитися до Gateway, може спробувати надіслати проксі-заголовки ідентичності, тому залишайте прямий доступ до Gateway приватним для хоста та вимагайте заголовки, якими керує проксі, як-от x-forwarded-proto, або підписаний заголовок підтвердження, якщо ваш проксі його підтримує.

Поведінка сполучення Control UI

Коли режим gateway.auth.mode = "trusted-proxy" активний і запит проходить перевірки довіреного проксі, сеанси WebSocket Control UI можуть підключатися без ідентичності сполученого пристрою. Наслідки для областей доступу:
  • Сеанси WebSocket Control UI без пристрою підключаються, але за замовчуванням не отримують жодних операторських областей доступу. OpenClaw очищає список запитаних областей доступу до [], щоб сеанс, не прив’язаний до схваленого сполученого пристрою або токена, не міг самостійно оголошувати дозволи.
  • Якщо після успішного підключення WebSocket методи завершуються помилкою missing scope, використовуйте 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 + міжмережевий екран).
Власні клієнти WebSocket не є сеансами Control UI. gateway.controlUi.dangerouslyDisableDeviceAuth не надає областей доступу довільним клієнтам із client.mode: "backend" або клієнтам у формі CLI. Власна автоматизація має використовувати ідентичність пристрою та сполучення, зарезервований прямий локальний допоміжний шлях серверної частини client.id: "gateway-client" або Plugin адміністрування HTTP RPC, якщо інтерфейс запитів і відповідей HTTP краще відповідає потребам.

Заголовок операторських областей доступу

Автентифікація через довірений проксі — це режим HTTP, що містить ідентичність, тому виклики можуть за бажанням оголошувати операторські області доступу за допомогою x-openclaw-scopes у запитах HTTP API. Примітка: області доступу WebSocket визначаються рукостисканням протоколу Gateway і прив’язкою ідентичності пристрою. У запитах на оновлення з’єднання WebSocket Control UI x-openclaw-scopes лише обмежує узгоджені області доступу сеансу, а не надає їх. Див. Поведінка сполучення Control UI. Приклади:
  • x-openclaw-scopes: operator.read
  • x-openclaw-scopes: operator.read,operator.write
  • x-openclaw-scopes: operator.admin,operator.write
Поведінка:
  • Якщо заголовок наявний, OpenClaw враховує оголошений набір областей доступу.
  • Якщо заголовок наявний, але порожній, запит не оголошує жодних операторських областей доступу.
  • Якщо заголовок відсутній, звичайні HTTP API, що містять ідентичність, використовують стандартний набір операторських областей доступу за замовчуванням (operator.admin, operator.read, operator.write, operator.approvals, operator.pairing, operator.talk.secrets).
  • Маршрути HTTP Plugin, що використовують автентифікацію Gateway, за замовчуванням мають вужчі права: якщо x-openclaw-scopes відсутній, їхня область доступу середовища виконання обмежується лише operator.write.
  • HTTP-запити з браузерного джерела мають пройти перевірку gateway.controlUi.allowedOrigins або навмисно налаштованого резервного режиму на основі заголовка Host навіть після успішної автентифікації через довірений проксі.
Практичне правило: явно надсилайте x-openclaw-scopes, коли потрібно звузити права запиту через довірений проксі порівняно зі стандартними або коли маршруту Plugin з автентифікацією Gateway потрібні ширші права, ніж область запису.

Завершення TLS та HSTS

Використовуйте одну точку завершення TLS і застосовуйте HSTS у ній.
Якщо ваш зворотний проксі обробляє HTTPS для https://control.example.com, установіть Strict-Transport-Security на проксі для цього домену.
  • Добре підходить для розгортань із доступом з інтернету.
  • Зберігає політику сертифікатів і посилення безпеки HTTP в одному місці.
  • OpenClaw може продовжувати працювати через HTTP на local loopback за проксі.
Приклад значення заголовка:

Рекомендації щодо розгортання

  • Спочатку встановіть короткий максимальний термін, наприклад max-age=300, на час перевірки трафіку.
  • Збільшуйте його до тривалих значень, наприклад max-age=31536000, лише після досягнення високої впевненості.
  • Додавайте includeSubDomains, лише якщо кожен піддомен готовий до HTTPS.
  • Використовуйте попереднє завантаження, лише якщо свідомо виконуєте його вимоги для повного набору доменів.
  • Локальна розробка лише через local loopback не отримує переваг від HSTS.

Приклади налаштування проксі

Pomerium передає ідентичність у x-pomerium-claim-email або інших заголовках тверджень, а JWT — у x-pomerium-jwt-assertion.
Фрагмент конфігурації Pomerium:
Caddy з Plugin caddy-security може автентифікувати користувачів і передавати заголовки ідентичності.
Фрагмент Caddyfile:
oauth2-proxy автентифікує користувачів і передає ідентифікаційні дані в x-auth-request-email.
Фрагмент конфігурації nginx:

Змішана конфігурація токенів

Gateway відхиляє запуск автентифікації через довірений проксі, якщо також налаштовано спільний токен (gateway.auth.token або OPENCLAW_GATEWAY_TOKEN). Ці два способи взаємовиключні, оскільки спільний токен дозволив би викликам із того самого хоста автентифікуватися цілком іншим шляхом, ніж перевірені проксі ідентифікаційні дані, які має забезпечувати цей режим. Якщо запуск завершується помилкою на кшталт gateway auth mode is trusted-proxy, but a shared token is also configured:
  • Видаліть спільний токен під час використання режиму довіреного проксі або
  • Змініть gateway.auth.mode на "token", якщо ви плануєте автентифікацію на основі токена.
Заголовки ідентифікаційних даних довіреного проксі для local loopback усе одно працюють за принципом безпечної відмови: виклики з того самого хоста не автентифікуються неявно як користувачі проксі. Внутрішні клієнти OpenClaw, які обходять проксі, натомість можуть автентифікуватися за допомогою gateway.auth.password / OPENCLAW_GATEWAY_PASSWORD. Резервна автентифікація за токеном навмисно не підтримується в режимі довіреного проксі.

Контрольний список безпеки

Перш ніж увімкнути автентифікацію через довірений проксі, перевірте:
  • Проксі — єдиний шлях: порт Gateway захищено брандмауером від усіх підключень, крім вашого проксі.
  • Мінімальний список trustedProxies: лише фактичні IP-адреси ваших проксі, а не цілі підмережі.
  • Джерело проксі через local loopback вибрано свідомо: автентифікація через довірений проксі працює за принципом безпечної відмови для запитів із джерелом local loopback, якщо gateway.auth.trustedProxy.allowLoopback явно не ввімкнено для проксі на тому самому хості.
  • Проксі видаляє заголовки: ваш проксі перезаписує (а не доповнює) отримані від клієнтів заголовки x-forwarded-*.
  • Завершення TLS: ваш проксі обробляє TLS; користувачі підключаються через HTTPS.
  • allowedOrigins задано явно: Control UI поза local loopback використовує явно заданий gateway.controlUi.allowedOrigins.
  • allowUsers налаштовано (рекомендовано): обмежте доступ відомими користувачами замість дозволу всім автентифікованим користувачам.
  • Немає змішаної конфігурації токенів: не задавайте одночасно gateway.auth.token і gateway.auth.mode: "trusted-proxy".
  • Локальний резервний пароль є приватним: якщо ви налаштували gateway.auth.password для внутрішніх прямих клієнтів, захистіть порт Gateway брандмауером, щоб віддалені клієнти поза проксі не могли підключитися до нього безпосередньо.

Аудит безпеки

openclaw security audit позначає автентифікацію через довірений проксі результатом із критичним рівнем серйозності. Це навмисно: таке попередження нагадує, що ви делегуєте безпеку конфігурації проксі. Аудит перевіряє:
  • Базове попередження або критичне нагадування gateway.trusted_proxy_auth.
  • Відсутню конфігурацію trustedProxies.
  • Відсутню конфігурацію userHeader.
  • Порожній список allowUsers (дозволяє доступ будь-якому автентифікованому користувачу).
  • Увімкнений allowLoopback для джерел проксі на тому самому хості.
Окремі результати, не пов’язані безпосередньо з довіреним проксі, також застосовуються щоразу, коли Control UI доступний ззовні: шаблон * або відсутній gateway.controlUi.allowedOrigins, а також резервне визначення джерела за заголовком Host.

Усунення несправностей

Запит надійшов не з IP-адреси, зазначеної в gateway.trustedProxies. Перевірте:
  • Чи правильна IP-адреса проксі? (IP-адреси контейнерів Docker можуть змінюватися.)
  • Чи є перед вашим проксі балансувальник навантаження?
  • Скористайтеся docker inspect або kubectl get pods -o wide, щоб знайти фактичні IP-адреси.
OpenClaw відхилив запит до довіреного проксі з джерелом local loopback.Перевірте:
  • Чи підключається проксі з 127.0.0.1 / ::1?
  • Чи намагаєтеся ви використовувати автентифікацію через довірений проксі зі зворотним проксі local loopback на тому самому хості?
Виправлення:
  • Надавайте перевагу автентифікації за токеном або паролем для внутрішніх клієнтів на тому самому хості, які не проходять через проксі, або
  • Спрямовуйте трафік через адресу довіреного проксі, яка не належить до local loopback, і залиште цю IP-адресу в gateway.trustedProxies, або
  • Для навмисно налаштованого зворотного проксі на тому самому хості задайте gateway.auth.trustedProxy.allowLoopback = true, залиште адресу local loopback у gateway.trustedProxies і переконайтеся, що проксі видаляє або перезаписує заголовки ідентифікаційних даних.
IP-адреса джерела запиту збіглася з однією з власних адрес мережевих інтерфейсів хоста Gateway, що не належать до local loopback (і не є проксі). Це захист від підробленого трафіку з того самого хоста в мережах Tailscale або мостових мережах Docker. ..._check_failed означає, що під час виявлення інтерфейсів сталася помилка, тому OpenClaw працює за принципом безпечної відмови.Перевірте:
  • Чи надсилає процес безпосередньо на хості Gateway заголовки ідентифікаційних даних в обхід проксі?
  • Чи працює проксі в тому самому просторі мережевих імен, що й Gateway, з IP-адресою, яка також відображається як локальний інтерфейс?
Виправлення: спрямовуйте трафік проксі через адресу, яка також не прив’язана локально до хоста Gateway, або використовуйте allowLoopback лише для справжньої конфігурації проксі на тому самому хості.
Заголовок користувача був порожнім або відсутнім. Перевірте:
  • Чи налаштовано проксі для передавання заголовків ідентифікаційних даних?
  • Чи правильна назва заголовка? (Регістр не враховується, але написання має значення.)
  • Чи справді користувач автентифікований на проксі?
Обов’язковий заголовок був відсутній. Перевірте:
  • Конфігурацію проксі для відповідних заголовків.
  • Чи не видаляються заголовки на якомусь етапі ланцюжка.
Користувач автентифікований, але його немає в allowUsers. Додайте його або видаліть список дозволених користувачів.
gateway.auth.mode має значення "trusted-proxy", але gateway.trustedProxies порожній або відсутній сам gateway.auth.trustedProxy. Усі запити відхиляються, доки не буде налаштовано обидва параметри.
Автентифікація через довірений проксі успішна, але заголовок браузера Origin не пройшов перевірки джерела Control UI.Перевірте:
  • gateway.controlUi.allowedOrigins містить точне джерело браузера.
  • Ви не покладаєтеся на джерела з шаблоном *, якщо лише навмисно не бажаєте дозволити всі джерела.
  • Якщо ви навмисно використовуєте режим резервного визначення за заголовком Host, параметр gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true задано свідомо.
WebSocket підключається, але chat.history, sessions.list або models.list завершується помилкою missing scope: operator.read.Поширені причини:
  • Сеанс Control UI без пристрою: автентифікація через довірений проксі може дозволити з’єднання WebSocket без ідентифікаційних даних пристрою, але OpenClaw навмисно очищає області доступу в сеансах без пристрою.
  • Власний клієнт серверної частини: gateway.controlUi.dangerouslyDisableDeviceAuth діє лише в межах Control UI і не надає областей доступу довільним клієнтам WebSocket серверної частини або клієнтам у формі CLI.
  • Надто вузький x-openclaw-scopes: якщо ваш проксі додає цей заголовок до запиту оновлення WebSocket Control UI, області доступу сеансу обмежуються цим набором. Порожнє значення заголовка не надає жодних областей доступу.
Виправлення:
  • Для Control UI використовуйте HTTPS, щоб браузер міг створити ідентифікаційні дані пристрою та завершити сполучення.
  • Для власної автоматизації використовуйте ідентифікаційні дані пристрою та сполучення, зарезервований допоміжний шлях серверної частини gateway-client для прямих локальних підключень або адміністративний HTTP RPC.
  • Використовуйте gateway.controlUi.dangerouslyDisableDeviceAuth: true лише як тимчасовий аварійний спосіб доступу до Control UI.
Переконайтеся, що ваш проксі:
  • Підтримує оновлення WebSocket (Upgrade: websocket, Connection: upgrade).
  • Передає заголовки ідентифікаційних даних у запитах оновлення WebSocket (а не лише HTTP).
  • Не має окремого шляху автентифікації для з’єднань WebSocket.

Перехід з автентифікації за токеном

1

Configure the proxy

Налаштуйте проксі для автентифікації користувачів і передавання заголовків.
2

Test the proxy independently

Перевірте конфігурацію проксі окремо (curl із заголовками).
3

Update OpenClaw config

Оновіть конфігурацію OpenClaw, додавши автентифікацію через довірений проксі.
4

Restart the Gateway

Перезапустіть Gateway.
5

Test WebSocket

Перевірте з’єднання WebSocket із Control UI.
6

Audit

Виконайте openclaw security audit і перегляньте результати.

Пов’язані матеріали