Khi nào nên dùng
Dùng chế độ xác thựctrusted-proxy khi:
- Bạn chạy OpenClaw phía sau một proxy nhận biết danh tính (Pomerium, Caddy + OAuth, nginx + oauth2-proxy, Traefik + forward auth).
- Proxy của bạn xử lý toàn bộ xác thực và truyền danh tính người dùng qua header.
- Bạn đang ở trong môi trường Kubernetes hoặc container, nơi proxy là đường dẫn duy nhất tới Gateway.
- Bạn gặp lỗi WebSocket
1008 unauthorizedvì trình duyệt không thể truyền token trong payload WS.
Khi nào KHÔNG nên dùng
- Nếu proxy của bạn không xác thực người dùng (chỉ là TLS terminator hoặc load balancer).
- Nếu có bất kỳ đường dẫn nào tới Gateway bỏ qua proxy (lỗ hổng firewall, truy cập mạng nội bộ).
- Nếu bạn không chắc proxy có loại bỏ/ghi đè chính xác các header được chuyển tiếp hay không.
- Nếu bạn chỉ cần truy cập cá nhân cho một người dùng (hãy cân nhắc Tailscale Serve + loopback để thiết lập đơn giản hơn).
Cách hoạt động
Proxy thêm header danh tính
Proxy thêm một header chứa danh tính người dùng đã xác thực (ví dụ:
x-forwarded-user: nick@example.com).Gateway xác minh nguồn tin cậy
OpenClaw kiểm tra rằng yêu cầu đến từ một IP proxy tin cậy (được cấu hình trong
gateway.trustedProxies).Hành vi ghép đôi của Control UI
Khigateway.auth.mode = "trusted-proxy" đang hoạt động và yêu cầu vượt qua các kiểm tra trusted-proxy, các phiên WebSocket của Control UI có thể kết nối mà không cần danh tính ghép đôi thiết bị.
Hệ quả về phạm vi:
- Các phiên WebSocket Control UI không có thiết bị vẫn kết nối, nhưng theo mặc định không nhận phạm vi operator nào. OpenClaw xóa danh sách phạm vi được yêu cầu thành
[]để một phiên không gắn với thiết bị/token đã ghép đôi được phê duyệt không thể tự khai báo quyền. - Nếu các phương thức thất bại với
missing scopesau khi kết nối WebSocket thành công, hãy dùng HTTPS để trình duyệt có thể tạo danh tính thiết bị và hoàn tất ghép đôi. Xem HTTP không an toàn của Control UI. - Chỉ dùng trong tình huống khẩn cấp:
gateway.controlUi.dangerouslyDisableDeviceAuth=truegiữ lại các phạm vi được yêu cầu ngay cả khi không có danh tính thiết bị. Đây là mức suy giảm bảo mật nghiêm trọng; hãy hoàn tác nhanh chóng. Xem HTTP không an toàn của Control UI.
- Nếu proxy của bạn gửi
x-openclaw-scopestrên yêu cầu nâng cấp WebSocket của Control UI, OpenClaw giới hạn phạm vi phiên vào phần giao giữa các phạm vi được yêu cầu và các phạm vi đã khai báo. Header này không cấp phạm vi; nó chỉ thu hẹp phạm vi mà phiên có thể giữ.
- Ghép đôi không còn là cổng kiểm soát chính cho quyền truy cập Control UI trong chế độ này.
- Chính sách xác thực của reverse proxy và
allowUserstrở thành cơ chế kiểm soát truy cập thực tế. - Chỉ cho phép Gateway ingress từ các IP proxy tin cậy (
gateway.trustedProxies+ firewall).
gateway.controlUi.dangerouslyDisableDeviceAuth không cấp phạm vi cho các client tùy ý có dạng client.mode: "backend" hoặc CLI. Tự động hóa tùy chỉnh nên dùng danh tính thiết bị/ghép đôi, đường dẫn helper backend direct-local dành riêng client.id: "gateway-client", hoặc Plugin admin HTTP RPC khi bề mặt yêu cầu/phản hồi HTTP phù hợp hơn.
Cấu hình
Tham chiếu cấu hình
Mảng địa chỉ IP proxy cần tin cậy. Yêu cầu từ các IP khác sẽ bị từ chối.
Phải là
"trusted-proxy".Tên header chứa danh tính người dùng đã xác thực.
Các header bổ sung phải có mặt để yêu cầu được tin cậy.
Danh sách cho phép các danh tính người dùng. Rỗng nghĩa là cho phép tất cả người dùng đã xác thực.
Hỗ trợ opt-in cho reverse proxy loopback cùng host. Mặc định là
false.TLS termination và HSTS
Dùng một điểm TLS termination và áp dụng HSTS tại đó.- TLS termination tại proxy (khuyến nghị)
- TLS termination tại Gateway
Khi reverse proxy của bạn xử lý HTTPS cho
https://control.example.com, hãy đặt Strict-Transport-Security tại proxy cho domain đó.- Phù hợp với các triển khai hướng ra internet.
- Giữ chứng chỉ + chính sách tăng cường bảo mật HTTP ở một nơi.
- OpenClaw có thể tiếp tục dùng HTTP loopback phía sau proxy.
Hướng dẫn triển khai dần
- Bắt đầu với max age ngắn trước (ví dụ
max-age=300) trong khi xác thực lưu lượng. - Chỉ tăng lên giá trị dài hạn (ví dụ
max-age=31536000) sau khi đã có độ tin cậy cao. - Chỉ thêm
includeSubDomainsnếu mọi subdomain đều đã sẵn sàng HTTPS. - Chỉ dùng preload nếu bạn chủ động đáp ứng các yêu cầu preload cho toàn bộ tập domain.
- Phát triển cục bộ chỉ dùng loopback không được lợi từ HSTS.
Ví dụ thiết lập proxy
Pomerium
Pomerium
Pomerium truyền danh tính trong Đoạn cấu hình Pomerium:
x-pomerium-claim-email (hoặc các header claim khác) và JWT trong x-pomerium-jwt-assertion.Caddy với OAuth
Caddy với OAuth
Caddy với Plugin Đoạn Caddyfile:
caddy-security có thể xác thực người dùng và truyền header danh tính.nginx + oauth2-proxy
nginx + oauth2-proxy
oauth2-proxy xác thực người dùng và truyền danh tính trong Đoạn cấu hình nginx:
x-auth-request-email.Traefik với forward auth
Traefik với forward auth
Cấu hình token hỗn hợp
OpenClaw từ chối các cấu hình mơ hồ khi cảgateway.auth.token (hoặc OPENCLAW_GATEWAY_TOKEN) và chế độ trusted-proxy cùng hoạt động. Cấu hình token hỗn hợp có thể khiến các yêu cầu loopback âm thầm xác thực trên đường dẫn xác thực sai.
Nếu bạn thấy lỗi mixed_trusted_proxy_token khi khởi động:
- Gỡ token dùng chung khi dùng chế độ trusted-proxy, hoặc
- Chuyển
gateway.auth.modesang"token"nếu bạn định dùng xác thực dựa trên token.
gateway.auth.password / OPENCLAW_GATEWAY_PASSWORD thay vào đó. Token fallback vẫn cố ý không được hỗ trợ trong chế độ trusted-proxy.
Header phạm vi operator
Xác thực trusted-proxy là chế độ HTTP mang danh tính, nên caller có thể tùy chọn khai báo phạm vi operator bằngx-openclaw-scopes trên các yêu cầu HTTP API.
Lưu ý: phạm vi WebSocket được xác định bởi Gateway protocol handshake và ràng buộc danh tính thiết bị. Trên các yêu cầu nâng cấp WebSocket của Control UI, x-openclaw-scopes chỉ là giới hạn trên các phạm vi phiên đã thương lượng, không phải cấp quyền. Để biết hành vi phạm vi WebSocket với trusted-proxy, xem hành vi ghép nối Control UI.
Ví dụ:
x-openclaw-scopes: operator.readx-openclaw-scopes: operator.read,operator.writex-openclaw-scopes: operator.admin,operator.write
- Khi header có mặt, OpenClaw tôn trọng tập phạm vi đã khai báo.
- Khi header có mặt nhưng rỗng, yêu cầu khai báo không có phạm vi operator.
- Khi header vắng mặt, các HTTP API mang danh tính thông thường fallback về tập phạm vi mặc định chuẩn của operator.
- Các plugin HTTP routes dùng gateway-auth hẹp hơn theo mặc định: khi
x-openclaw-scopesvắng mặt, phạm vi runtime của chúng fallback vềoperator.write. - Các yêu cầu HTTP có nguồn từ trình duyệt vẫn phải vượt qua
gateway.controlUi.allowedOrigins(hoặc chế độ Host-header fallback có chủ ý) ngay cả sau khi xác thực trusted-proxy thành công. - Đối với phiên WebSocket của Control UI,
x-openclaw-scopeslà giới hạn phạm vi khi có mặt trên yêu cầu nâng cấp. Giá trị rỗng tạo ra không có phạm vi nào.
x-openclaw-scopes rõ ràng khi bạn muốn một yêu cầu trusted-proxy hẹp hơn mặc định, hoặc khi một gateway-auth plugin route cần quyền mạnh hơn phạm vi ghi.
Danh sách kiểm tra bảo mật
Trước khi bật xác thực trusted-proxy, hãy xác minh:- Proxy là đường dẫn duy nhất: Cổng Gateway được firewall chặn khỏi mọi thứ ngoại trừ proxy của bạn.
- trustedProxies là tối thiểu: Chỉ các IP proxy thực tế của bạn, không phải toàn bộ subnet.
- Nguồn proxy loopback là có chủ ý: Xác thực trusted-proxy đóng khi lỗi đối với yêu cầu nguồn loopback trừ khi
gateway.auth.trustedProxy.allowLoopbackđược bật rõ ràng cho proxy cùng host. - Proxy loại bỏ header: Proxy của bạn ghi đè (không nối thêm) các header
x-forwarded-*từ client. - Kết thúc TLS: Proxy của bạn xử lý TLS; người dùng kết nối qua HTTPS.
- allowedOrigins là rõ ràng: Control UI không phải loopback dùng
gateway.controlUi.allowedOriginsrõ ràng. - allowUsers được đặt (khuyến nghị): Giới hạn ở người dùng đã biết thay vì cho phép bất kỳ ai đã xác thực.
- Không có cấu hình token trộn lẫn: Không đặt cả
gateway.auth.tokenvàgateway.auth.mode: "trusted-proxy". - Local password fallback là riêng tư: Nếu bạn cấu hình
gateway.auth.passwordcho caller trực tiếp nội bộ, hãy firewall cổng Gateway để client từ xa không qua proxy không thể truy cập trực tiếp.
Kiểm toán bảo mật
openclaw security audit sẽ gắn cờ xác thực trusted-proxy với phát hiện mức độ critical. Điều này là có chủ ý — đó là lời nhắc rằng bạn đang ủy quyền bảo mật cho thiết lập proxy của mình.
Kiểm toán kiểm tra:
- Cảnh báo/nhắc nhở critical cơ bản
gateway.trusted_proxy_auth - Thiếu cấu hình
trustedProxies - Thiếu cấu hình
userHeader allowUsersrỗng (cho phép bất kỳ người dùng đã xác thực nào)- Bật
allowLoopbackcho nguồn proxy cùng host - Chính sách nguồn trình duyệt wildcard hoặc bị thiếu trên các bề mặt Control UI được phơi bày
Khắc phục sự cố
trusted_proxy_untrusted_source
trusted_proxy_untrusted_source
Yêu cầu không đến từ IP trong
gateway.trustedProxies. Kiểm tra:- IP proxy có đúng không? (IP container Docker có thể thay đổi.)
- Có load balancer phía trước proxy của bạn không?
- Dùng
docker inspecthoặckubectl get pods -o wideđể tìm IP thực tế.
trusted_proxy_loopback_source
trusted_proxy_loopback_source
OpenClaw đã từ chối một yêu cầu trusted-proxy nguồn loopback.Kiểm tra:
- Proxy có đang kết nối từ
127.0.0.1/::1không? - Bạn có đang cố dùng xác thực trusted-proxy với reverse proxy loopback cùng host không?
- Ưu tiên xác thực token/password cho client nội bộ cùng host không đi qua proxy, hoặc
- Định tuyến qua một địa chỉ proxy đáng tin cậy không phải loopback và giữ IP đó trong
gateway.trustedProxies, hoặc - Với reverse proxy cùng host có chủ ý, đặt
gateway.auth.trustedProxy.allowLoopback = true, giữ địa chỉ loopback tronggateway.trustedProxies, và bảo đảm proxy loại bỏ hoặc ghi đè các header danh tính.
trusted_proxy_user_missing
trusted_proxy_user_missing
Header người dùng rỗng hoặc bị thiếu. Kiểm tra:
- Proxy của bạn có được cấu hình để truyền header danh tính không?
- Tên header có đúng không? (không phân biệt chữ hoa/thường, nhưng chính tả quan trọng)
- Người dùng có thực sự được xác thực tại proxy không?
trusted_proxy_missing_header_*
trusted_proxy_missing_header_*
Một header bắt buộc không có mặt. Kiểm tra:
- Cấu hình proxy của bạn cho các header cụ thể đó.
- Header có đang bị loại bỏ ở đâu đó trong chuỗi không.
trusted_proxy_user_not_allowed
trusted_proxy_user_not_allowed
Người dùng đã được xác thực nhưng không nằm trong
allowUsers. Hãy thêm họ hoặc xóa danh sách cho phép.trusted_proxy_origin_not_allowed
trusted_proxy_origin_not_allowed
Xác thực trusted-proxy thành công, nhưng header
Origin của trình duyệt không vượt qua kiểm tra nguồn Control UI.Kiểm tra:gateway.controlUi.allowedOriginsbao gồm đúng nguồn trình duyệt.- Bạn không dựa vào nguồn wildcard trừ khi bạn cố ý muốn hành vi cho phép tất cả.
- Nếu bạn cố ý dùng chế độ Host-header fallback,
gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=trueđược đặt có chủ ý.
Kết nối thành công nhưng các phương thức báo thiếu phạm vi
Kết nối thành công nhưng các phương thức báo thiếu phạm vi
WebSocket kết nối, nhưng
chat.history, sessions.list, hoặc
models.list lỗi với missing scope: operator.read.Nguyên nhân phổ biến:- Phiên Control UI không có thiết bị: xác thực trusted-proxy có thể cho phép kết nối WebSocket không có danh tính thiết bị, nhưng OpenClaw xóa phạm vi trên các phiên không có thiết bị theo thiết kế.
- Client backend tùy chỉnh:
gateway.controlUi.dangerouslyDisableDeviceAuththuộc phạm vi Control UI và không cấp phạm vi cho backend tùy ý hoặc các client WebSocket dạng CLI. x-openclaw-scopesquá hẹp: nếu proxy của bạn inject header này trên yêu cầu nâng cấp WebSocket của Control UI, phạm vi phiên bị giới hạn vào tập đó. Giá trị header rỗng tạo ra không có phạm vi nào.
- Với Control UI, dùng HTTPS để trình duyệt có thể tạo danh tính thiết bị và hoàn tất ghép nối.
- Với tự động hóa tùy chỉnh, dùng danh tính/ghép nối thiết bị, đường dẫn helper backend
gateway-clientdirect-local dành riêng, hoặc admin HTTP RPC. - Chỉ dùng
gateway.controlUi.dangerouslyDisableDeviceAuth: truenhư một đường dẫn break-glass tạm thời cho Control UI.
WebSocket vẫn lỗi
WebSocket vẫn lỗi
Bảo đảm proxy của bạn:
- Hỗ trợ nâng cấp WebSocket (
Upgrade: websocket,Connection: upgrade). - Truyền các header danh tính trên yêu cầu nâng cấp WebSocket (không chỉ HTTP).
- Không có đường dẫn xác thực riêng cho kết nối WebSocket.
Di chuyển từ xác thực token
Nếu bạn đang chuyển từ xác thực token sang trusted-proxy:Liên quan
- Cấu hình — tham chiếu cấu hình
- Truy cập từ xa — các mẫu truy cập từ xa khác
- Bảo mật — hướng dẫn bảo mật đầy đủ
- Tailscale — lựa chọn thay thế đơn giản hơn cho truy cập chỉ trong tailnet