Автентифікація через довірений проксі
⚠️ Функція, чутлива до безпеки. У цьому режимі автентифікація повністю делегується вашому reverse proxy. Помилка в налаштуванні може відкрити ваш Gateway для неавторизованого доступу. Уважно прочитайте цю сторінку перед увімкненням.
Коли використовувати
Використовуйте режим автентифікаціїtrusted-proxy, коли:
- Ви запускаєте OpenClaw за проксі з урахуванням ідентичності (Pomerium, Caddy + OAuth, nginx + oauth2-proxy, Traefik + forward auth)
- Ваш проксі обробляє всю автентифікацію й передає ідентичність користувача через заголовки
- Ви працюєте в середовищі Kubernetes або контейнерів, де проксі є єдиним шляхом до Gateway
- Ви отримуєте помилки WebSocket
1008 unauthorized, тому що браузери не можуть передавати токени в payload WS
Коли НЕ використовувати
- Якщо ваш проксі не автентифікує користувачів (а лише завершує TLS або працює як load balancer)
- Якщо існує будь-який шлях до Gateway в обхід проксі (дірки у firewall, доступ із внутрішньої мережі)
- Якщо ви не впевнені, що ваш проксі правильно прибирає/перезаписує forwarded-заголовки
- Якщо вам потрібен лише особистий доступ одного користувача (розгляньте Tailscale Serve + loopback для простішого налаштування)
Як це працює
- Ваш reverse proxy автентифікує користувачів (OAuth, OIDC, SAML тощо)
- Проксі додає заголовок з ідентичністю автентифікованого користувача (наприклад,
x-forwarded-user: nick@example.com) - OpenClaw перевіряє, що запит надійшов від довіреної IP-адреси проксі (налаштовується в
gateway.trustedProxies) - OpenClaw витягує ідентичність користувача з налаштованого заголовка
- Якщо все перевірено, запит авторизується
Поведінка прив’язки для Control UI
Коли активнийgateway.auth.mode = "trusted-proxy" і запит проходить перевірки
довіреного проксі, сеанси WebSocket Control UI можуть підключатися без
ідентичності прив’язки пристрою.
Наслідки:
- Прив’язка більше не є основним механізмом доступу до Control UI в цьому режимі.
- Ефективним механізмом керування доступом стають ваша політика автентифікації reverse proxy і
allowUsers. - Тримайте ingress gateway заблокованим лише до IP довіреного проксі (
gateway.trustedProxies+ firewall).
Конфігурація
- Автентифікація trusted-proxy відхиляє запити з loopback-джерела (
127.0.0.1,::1, loopback CIDR). - Reverse proxy на тому самому хості через loopback не задовольняють вимоги trusted-proxy auth.
- Для reverse proxy на тому самому хості через loopback натомість використовуйте автентифікацію token/password або маршрутизуйте через не-loopback адресу довіреного проксі, яку OpenClaw може перевірити.
- Не-loopback розгортання Control UI і далі потребують явного
gateway.controlUi.allowedOrigins.
Довідник із конфігурації
| Поле | Обов’язково | Опис |
|---|---|---|
gateway.trustedProxies | Так | Масив IP-адрес проксі, яким можна довіряти. Запити з інших IP відхиляються. |
gateway.auth.mode | Так | Має бути "trusted-proxy" |
gateway.auth.trustedProxy.userHeader | Так | Назва заголовка, що містить ідентичність автентифікованого користувача |
gateway.auth.trustedProxy.requiredHeaders | Ні | Додаткові заголовки, які мають бути присутні, щоб запит вважався довіреним |
gateway.auth.trustedProxy.allowUsers | Ні | Allowlist ідентичностей користувачів. Порожньо означає всіх автентифікованих користувачів. |
TLS termination і HSTS
Використовуйте одну точку TLS termination і задавайте HSTS саме там.Рекомендований шаблон: TLS termination на проксі
Коли ваш reverse proxy обробляє HTTPS дляhttps://control.example.com, задавайте
Strict-Transport-Security на проксі для цього домену.
- Добре підходить для розгортань, відкритих в інтернет.
- Зберігає сертифікати й політику посилення HTTP в одному місці.
- OpenClaw може залишатися на loopback HTTP за проксі.
TLS termination на Gateway
Якщо OpenClaw сам напряму обслуговує HTTPS (без проксі, що завершує TLS), задайте:strictTransportSecurity приймає рядкове значення заголовка або false для явного вимкнення.
Рекомендації щодо розгортання
- Спочатку використовуйте короткий max age (наприклад,
max-age=300) під час перевірки трафіку. - Переходьте до довготривалих значень (наприклад,
max-age=31536000) лише після достатньої впевненості. - Додавайте
includeSubDomainsлише якщо кожен піддомен готовий до HTTPS. - Використовуйте preload лише якщо ви свідомо відповідаєте вимогам preload для всього набору своїх доменів.
- Локальна розробка лише на loopback не отримує користі від HSTS.
Приклади налаштування проксі
Pomerium
Pomerium передає ідентичність уx-pomerium-claim-email (або інших заголовках claims) і JWT у x-pomerium-jwt-assertion.
Caddy з OAuth
Caddy з плагіномcaddy-security може автентифікувати користувачів і передавати заголовки ідентичності.
nginx + oauth2-proxy
oauth2-proxy автентифікує користувачів і передає ідентичність уx-auth-request-email.
Traefik з Forward Auth
Змішана конфігурація токенів
OpenClaw відхиляє неоднозначні конфігурації, у яких одночасно активні іgateway.auth.token (або OPENCLAW_GATEWAY_TOKEN), і режим trusted-proxy. Змішані конфігурації токенів можуть призвести до того, що loopback-запити тихо автентифікуватимуться через неправильний шлях автентифікації.
Якщо під час запуску ви бачите помилку mixed_trusted_proxy_token:
- Приберіть спільний токен під час використання режиму trusted-proxy, або
- Змініть
gateway.auth.modeна"token", якщо ви справді хочете автентифікацію на основі токена.
Заголовок областей оператора
Автентифікація trusted-proxy — це HTTP-режим з передаванням ідентичності, тому виклики можуть за бажанням оголошувати області оператора черезx-openclaw-scopes.
Приклади:
x-openclaw-scopes: operator.readx-openclaw-scopes: operator.read,operator.writex-openclaw-scopes: operator.admin,operator.write
- Коли заголовок присутній, OpenClaw враховує оголошений набір областей.
- Коли заголовок присутній, але порожній, запит оголошує жодної операторської області.
- Коли заголовок відсутній, звичайні HTTP API з передаванням ідентичності повертаються до стандартного типового набору операторських областей.
- Plugin HTTP routes з автентифікацією gateway за замовчуванням вужчі: коли
x-openclaw-scopesвідсутній, їхня runtime-область повертається доoperator.write. - HTTP-запити з браузера все одно мають проходити
gateway.controlUi.allowedOrigins(або навмисний fallback-режим через Host-header) навіть після успішної trusted-proxy auth.
- Явно надсилайте
x-openclaw-scopes, коли хочете, щоб trusted-proxy-запит був вужчим за типові значення, або коли gateway-auth plugin route потребує чогось сильнішого за область write.
Контрольний список безпеки
Перш ніж увімкнути trusted-proxy auth, перевірте:- Проксі — єдиний шлях: порт Gateway закритий firewall для всіх, крім вашого проксі
- trustedProxies мінімальний: лише фактичні IP-адреси вашого проксі, а не цілі підмережі
- Немає loopback-джерела проксі: trusted-proxy auth блокується для запитів із loopback-джерела
- Проксі прибирає заголовки: ваш проксі перезаписує (а не додає)
x-forwarded-*заголовки від клієнтів - TLS termination: ваш проксі обробляє TLS; користувачі підключаються через HTTPS
- allowedOrigins задано явно: не-loopback Control UI використовує явний
gateway.controlUi.allowedOrigins - allowUsers задано (рекомендовано): обмеження відомими користувачами замість дозволу будь-кому з автентифікацією
- Немає змішаної конфігурації токенів: не задавайте одночасно
gateway.auth.tokenіgateway.auth.mode: "trusted-proxy"
Аудит безпеки
openclaw security audit позначить trusted-proxy auth як знахідку рівня critical. Це навмисно — нагадування, що ви делегуєте безпеку вашій конфігурації проксі.
Аудит перевіряє:
- Базове попередження/нагадування
gateway.trusted_proxy_authрівня warning/critical - Відсутню конфігурацію
trustedProxies - Відсутню конфігурацію
userHeader - Порожній
allowUsers(дозволяє будь-якому автентифікованому користувачу) - Wildcard або відсутню політику browser-origin на відкритих поверхнях Control UI
Усунення несправностей
trusted_proxy_untrusted_source
Запит надійшов не з IP у gateway.trustedProxies. Перевірте:
- Чи правильний IP проксі? (IP контейнерів Docker можуть змінюватися)
- Чи є перед проксі ще один load balancer?
- Використайте
docker inspectабоkubectl get pods -o wide, щоб знайти фактичні IP
trusted_proxy_loopback_source
OpenClaw відхилив trusted-proxy-запит із loopback-джерела.
Перевірте:
- Чи проксі підключається з
127.0.0.1/::1? - Чи намагаєтеся ви використовувати trusted-proxy auth із reverse proxy на тому самому хості через loopback?
- Використовуйте автентифікацію token/password для reverse proxy на тому самому хості через loopback, або
- Маршрутизуйте через не-loopback адресу довіреного проксі й тримайте цю IP-адресу в
gateway.trustedProxies.
trusted_proxy_user_missing
Заголовок користувача був порожній або відсутній. Перевірте:
- Чи налаштований проксі на передавання заголовків ідентичності?
- Чи правильна назва заголовка? (без урахування регістру, але написання має значення)
- Чи користувач справді автентифікований на проксі?
trusted*proxy_missing_header*\*
Один з обов’язкових заголовків був відсутній. Перевірте:
- Конфігурацію проксі для цих конкретних заголовків
- Чи не прибираються заголовки десь у ланцюжку
trusted_proxy_user_not_allowed
Користувач автентифікований, але відсутній у allowUsers. Додайте його або приберіть allowlist.
trusted_proxy_origin_not_allowed
Автентифікація trusted-proxy пройшла успішно, але заголовок браузера Origin не пройшов перевірки origin для Control UI.
Перевірте:
gateway.controlUi.allowedOriginsмістить точний browser origin- Ви не покладаєтеся на wildcard origin, якщо тільки свідомо не хочете дозволити всіх
- Якщо ви свідомо використовуєте fallback-режим через Host-header,
gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=trueзадано навмисно
WebSocket усе ще не працює
Переконайтеся, що ваш проксі:- Підтримує оновлення WebSocket (
Upgrade: websocket,Connection: upgrade) - Передає заголовки ідентичності під час запитів на оновлення WebSocket (а не лише для HTTP)
- Не має окремого шляху автентифікації для WebSocket-з’єднань
Міграція з автентифікації через токен
Якщо ви переходите з автентифікації через токен на trusted-proxy:- Налаштуйте проксі на автентифікацію користувачів і передавання заголовків
- Окремо протестуйте налаштування проксі (curl із заголовками)
- Оновіть конфігурацію OpenClaw для trusted-proxy auth
- Перезапустіть Gateway
- Перевірте WebSocket-з’єднання з Control UI
- Запустіть
openclaw security auditі перегляньте знахідки
Пов’язане
- Безпека — повний посібник із безпеки
- Конфігурація — довідник із конфігурації
- Віддалений доступ — інші шаблони віддаленого доступу
- Tailscale — простіша альтернатива для доступу лише через tailnet