Khi nào nên sử dụng
- 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 + xác thực chuyển tiếp).
- Proxy của bạn xử lý toàn bộ việc xác thực và truyền danh tính người dùng qua các header.
- Bạn đang ở trong môi trường Kubernetes hoặc container, nơi proxy là đường dẫn duy nhất đến Gateway.
- Bạn gặp lỗi WebSocket
1008 unauthorizedvì trình duyệt không thể truyền token trong payload WS.
Khi KHÔNG nên sử dụng
- Proxy của bạn không xác thực người dùng (chỉ là điểm kết thúc TLS hoặc bộ cân bằng tải).
- Có bất kỳ đường dẫn nào đến Gateway bỏ qua proxy (lỗ hổng tường lửa, quyền truy cập mạng nội bộ).
- 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.
- Bạn chỉ cần quyền truy cập cá nhân cho một người dùng (thay vào đó, hãy cân nhắc Tailscale Serve + loopback).
Cách hoạt động
Proxy xác thực người dùng
Proxy thêm header danh tính
x-forwarded-user: nick@example.com).Gateway xác minh nguồn đáng tin cậy
gateway.trustedProxies) và không phải địa chỉ loopback hoặc địa chỉ giao diện cục bộ của chính Gateway hay không.Gateway trích xuất danh tính
Ủy quyền
allowUsers (khi được thiết lập), yêu cầu sẽ được ủy quyền.Cấu hình
Tham chiếu cấu hình
"trusted-proxy".operator.admin cho phép mọi người dùng đã xác thực qua proxy yêu cầu cấp toàn quyền quản trị tự động cho thiết bị, khiến các yêu cầu không có phạm vi tự động nhận toàn quyền quản trị, đồng thời kích hoạt phát hiện kiểm tra bảo mật NGHIÊM TRỌNG gateway.trusted_proxy_device_auto_approve_admin và cảnh báo khi Gateway khởi động.Phê duyệt thiết bị tự động
Xác thực proxy đáng tin cậy có thể tùy chọn sử dụng danh tính proxy làm ranh giới phê duyệt cho các thiết bị trình duyệt mới:enabled: false. Khi được bật, tất cả các quy tắc sau sẽ áp dụng:
- WebSocket phải được xác thực thông qua phương thức
trusted-proxyvới danh tính người dùng không trống đã vượt quaallowUserskhi danh sách cho phép được cấu hình. Các kết nối bằng token, mật khẩu, Tailscale và chưa xác thực không bao giờ sử dụng chính sách này. - Chỉ thiết bị trình duyệt Control UI hoặc WebChat mới có thể được phê duyệt tự động. Mọi yêu cầu cho thiết bị hiện có, bao gồm nâng cấp phạm vi, vẫn ở trạng thái chờ phê duyệt thủ công bằng
openclaw devices approve <requestId>. - Thiết bị được phê duyệt với vai trò
operator. Nếu yêu cầu kết nối bao gồm các phạm vi, quyền cấp là giao chính xác giữa các phạm vi được yêu cầu vàdeviceAutoApprove.scopes. Nếu yêu cầu bỏ qua các phạm vi, danh sách đã cấu hình sẽ được cấp; khi danh sách đó bị bỏ qua, giá trị mặc định làoperator.read,operator.writevàoperator.approvals. Quyền cấp thu được sau đó còn bị giới hạn bởi header proxyx-openclaw-scopescủa kết nối khi header này tồn tại, vì vậy proxy thu hẹp phạm vi của người dùng cũng giới hạn quyền cấp thiết bị lâu dài, không chỉ phiên — header tồn tại nhưng trống sẽ không cấp phạm vi nào. Giới hạn này áp dụng ngay cả khi máy khách bỏ qua danh sách phạm vi riêng. operator.adminchỉ được phép khi được liệt kê rõ ràng trongdeviceAutoApprove.scopes. Khi được liệt kê, mọi người dùng đã xác thực qua proxy đều có thể yêu cầu và tự động nhận toàn quyền quản trị trên thiết bị trình duyệt mới; các yêu cầu không có phạm vi tự động nhận toàn quyền quản trị.openclaw security auditbáo cáo phát hiện NGHIÊM TRỌNGgateway.trusted_proxy_device_auto_approve_admin, và Gateway ghi cảnh báo một lần khi khởi động. Ưu tiên phê duyệt quản trị thủ công bằngopenclaw devices approvehoặcopenclaw devices rotatecho đến khi có vai trò theo từng danh tính.
Hành vi ghép cặp Control UI
Khigateway.auth.mode = "trusted-proxy" đang hoạt động và yêu cầu vượt qua các kiểm tra proxy đáng tin cậy, 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 cặp thiết bị.
Ảnh hưởng đến phạm vi:
- Các phiên WebSocket Control UI không có thiết bị vẫn kết nối nhưng mặc định không nhận phạm vi vận hành nào. OpenClaw xóa danh sách phạm vi được yêu cầu thành
[]để một phiên không được liên kết với thiết bị/token đã ghép cặp và 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 sử dụng HTTPS để trình duyệt có thể tạo danh tính thiết bị và hoàn tất ghép cặp. 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ữ nguyên 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ột sự suy giảm bảo mật nghiêm trọng; hãy hoàn nguyên nhanh chóng. Xem HTTP không an toàn của Control UI.
x-openclaw-scopes trong yêu cầu nâng cấp WebSocket của Control UI, OpenClaw giới hạn các phạm vi phiên ở 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 những phạm vi mà phiên có thể giữ. Khi deviceAutoApprove.enabled là true, giới hạn tương tự cũng áp dụng cho quyền cấp thiết bị lâu dài được ghi bởi phê duyệt thiết bị tự động, vì vậy thiết bị được tự động phê duyệt không bao giờ giữ nhiều phạm vi hơn mức proxy đã khai báo.
Hệ quả:
- Ghép cặp không còn là cổng kiểm soát chính đối với quyền truy cập Control UI không có thiết bị. Khi
deviceAutoApprove.enabledlà true, danh tính proxy cũng trở thành cổng phê duyệt cho việc đăng ký thiết bị trình duyệt mới. - Chính sách xác thực proxy và
allowUserscủa bạn trở thành cơ chế kiểm soát truy cập thực tế. - Chỉ cho phép các IP proxy đáng tin cậy truy cập Gateway (
gateway.trustedProxies+ tường lửa).
gateway.controlUi.dangerouslyDisableDeviceAuth không cấp phạm vi cho các máy khách client.mode: "backend" tùy ý hoặc có dạng CLI. Tự động hóa tùy chỉnh nên sử dụng danh tính thiết bị/ghép cặp, đường dẫn trình trợ giúp backend client.id: "gateway-client" dành riêng cho truy cập trực tiếp cục bộ, hoặc Plugin RPC HTTP quản trị khi giao diện yêu cầu/phản hồi HTTP phù hợp hơn.
Header phạm vi người vận hành
Xác thực qua proxy tin cậy là một chế độ HTTP mang danh tính, vì vậy bên gọi có thể tùy chọn khai báo các phạm vi của toán tử bằngx-openclaw-scopes trên các yêu cầu API HTTP.
Lưu ý: Phạm vi WebSocket được xác định bởi quá trình bắt tay giao thức Gateway và liên kết danh tính thiết bị. Trên các yêu cầu nâng cấp WebSocket của Giao diện điều khiển, x-openclaw-scopes chỉ là giới hạn trên đối với các phạm vi phiên được thương lượng, không phải quyền cấp. Xem hành vi ghép nối của Giao diện điều khiển.
Ví dụ:
x-openclaw-scopes: operator.readx-openclaw-scopes: operator.read,operator.writex-openclaw-scopes: operator.admin,operator.write
- Khi tiêu đề hiện diện, OpenClaw tuân theo tập hợp phạm vi đã khai báo.
- Khi tiêu đề hiện diện nhưng trống, yêu cầu khai báo không có phạm vi toán tử nào.
- Khi tiêu đề không hiện diện, các API HTTP mang danh tính thông thường sẽ dự phòng về tập hợp phạm vi mặc định tiêu chuẩn của toán tử (
operator.admin,operator.read,operator.write,operator.approvals,operator.pairing,operator.talk.secrets). - Các tuyến HTTP của plugin dùng xác thực Gateway mặc định có phạm vi hẹp hơn: khi không có
x-openclaw-scopes, phạm vi thời gian chạy của chúng chỉ dự phòng vềoperator.write. - Các yêu cầu HTTP có nguồn gốc từ trình duyệt vẫn phải vượt qua
gateway.controlUi.allowedOrigins(hoặc chế độ dự phòng có chủ đích bằng tiêu đề Host), ngay cả sau khi xác thực qua proxy tin cậy thành công.
x-openclaw-scopes một cách rõ ràng khi bạn muốn yêu cầu qua proxy tin cậy có phạm vi hẹp hơn mặc định, hoặc khi một tuyến plugin dùng xác thực Gateway cần quyền mạnh hơn phạm vi ghi.
Kết thúc TLS và HSTS
Sử dụng một điểm kết thúc TLS và áp dụng HSTS tại đó.- Kết thúc TLS tại proxy (khuyến nghị)
- Kết thúc TLS tại Gateway
https://control.example.com, hãy đặt Strict-Transport-Security tại proxy cho miền đó.- Phù hợp với các triển khai hướng ra internet.
- Giữ chứng chỉ và chính sách tăng cường bảo mật HTTP ở cùng một nơi.
- OpenClaw có thể tiếp tục dùng HTTP trên địa chỉ loopback phía sau proxy.
Hướng dẫn triển khai
- Trước tiên, hãy bắt đầu với thời gian tối đa ngắn (ví dụ
max-age=300) trong khi xác thực lưu lượng. - Chỉ tăng lên các giá trị dài hạn (ví dụ
max-age=31536000) sau khi đã đủ tin cậy. - Chỉ thêm
includeSubDomainsnếu mọi miền con đều sẵn sàng cho HTTPS. - Chỉ sử dụng preload nếu bạn chủ ý đáp ứng các yêu cầu preload cho toàn bộ tập hợp miền của mình.
- Phát triển cục bộ chỉ dùng loopback không được hưởng lợi từ HSTS.
Ví dụ thiết lập proxy
Pomerium
Pomerium
x-pomerium-claim-email (hoặc các tiêu đề claim khác) và một JWT trong x-pomerium-jwt-assertion.Caddy với OAuth
Caddy với OAuth
caddy-security có thể xác thực người dùng và truyền các tiêu đề danh tính.nginx + oauth2-proxy
nginx + oauth2-proxy
x-auth-request-email.Traefik với xác thực chuyển tiếp
Traefik với xác thực chuyển tiếp
Cấu hình token hỗn hợp
Quá trình khởi động Gateway từ chối xác thực qua proxy tin cậy nếu đồng thời cấu hình một token dùng chung (gateway.auth.token hoặc OPENCLAW_GATEWAY_TOKEN). Hai cơ chế này loại trừ lẫn nhau vì token dùng chung sẽ cho phép bên gọi trên cùng máy chủ xác thực qua một đường dẫn hoàn toàn khác với danh tính đã được proxy xác minh mà chế độ này nhằm thực thi.
Nếu quá trình khởi động thất bại với lỗi như gateway auth mode is trusted-proxy, but a shared token is also configured:
- Xóa token dùng chung khi sử dụng chế độ proxy tin cậy, hoặc
- Chuyển
gateway.auth.modesang"token"nếu bạn định sử dụng xác thực dựa trên token.
gateway.auth.password / OPENCLAW_GATEWAY_PASSWORD. Cơ chế dự phòng bằng token vẫn chủ ý không được hỗ trợ trong chế độ proxy tin cậy.
Danh sách kiểm tra bảo mật
Trước khi bật xác thực qua proxy tin cậy, hãy xác minh:- Proxy là đường dẫn duy nhất: Cổng Gateway được tường lửa chặn với mọi nguồn ngoại trừ proxy của bạn.
- trustedProxies được giữ ở mức tối thiểu: Chỉ gồm các IP proxy thực tế, không phải toàn bộ mạng con.
- Nguồn proxy loopback là có chủ đích: Xác thực qua proxy tin cậy thất bại theo cơ chế đóng an toàn đối với các yêu cầu có nguồn loopback, trừ khi
gateway.auth.trustedProxy.allowLoopbackđược bật rõ ràng cho proxy trên cùng máy chủ. - Proxy loại bỏ tiêu đề: Proxy của bạn ghi đè (không nối thêm) các tiêu đề
x-forwarded-*từ máy khách. - Kết thúc TLS: Proxy xử lý TLS; người dùng kết nối qua HTTPS.
- allowedOrigins được đặt rõ ràng: Giao diện điều khiển không dùng loopback sử dụng
gateway.controlUi.allowedOriginsrõ ràng. - allowUsers đã được đặt (khuyến nghị): Giới hạn ở những 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 hỗn hợp: Không đặt đồng thời
gateway.auth.tokenvàgateway.auth.mode: "trusted-proxy". - Cơ chế dự phòng bằng mật khẩu cục bộ là riêng tư: Nếu bạn cấu hình
gateway.auth.passwordcho các bên gọi trực tiếp nội bộ, hãy giữ cổng Gateway sau tường lửa để các máy khách từ xa không qua proxy không thể truy cập trực tiếp. - Tự động phê duyệt thiết bị là có chủ đích: Nếu
deviceAutoApprove.enabledlà true, hãy xem bảo mật tài khoản proxy ngược là ranh giới đăng ký thiết bị và giữ danh sách phạm vi được cấp ở mức không phải quản trị viên và tối thiểu.
Kiểm tra bảo mật
openclaw security audit gắn cờ xác thực qua proxy tin cậy với phát hiện có mức độ nghiêm trọng nghiêm trọng. Điều này là có chủ đích; đây 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.
Quá trình kiểm tra xem xét:
- Cảnh báo/nhắc nhở nghiêm trọng cơ sở
gateway.trusted_proxy_auth. - Thiếu cấu hình
trustedProxies. - Thiếu cấu hình
userHeader. allowUserstrống (cho phép bất kỳ người dùng đã xác thực nào).allowLoopbackđược bật cho các nguồn proxy trên cùng máy chủ.- Tự động phê duyệt thiết bị trình duyệt được bật (ủy quyền việc ghép nối thiết bị mới cho danh tính proxy).
gateway.controlUi.allowedOrigins dùng ký tự đại diện hoặc bị thiếu, và cơ chế dự phòng nguồn gốc bằng tiêu đề Host.
Khắc phục sự cố
trusted_proxy_untrusted_source
trusted_proxy_untrusted_source
gateway.trustedProxies. Hãy kiểm tra:- IP proxy có chính xác không? (IP vùng chứa Docker có thể thay đổi.)
- Có bộ cân bằng tải phía trước proxy không?
- Sử dụng
docker inspecthoặckubectl get pods -o wideđể tìm các IP thực tế.
trusted_proxy_loopback_source
trusted_proxy_loopback_source
- Proxy có đang kết nối từ
127.0.0.1/::1không? - Bạn có đang cố sử dụng xác thực qua proxy tin cậy với proxy ngược loopback trên cùng máy chủ không?
- Ưu tiên xác thực bằng token/mật khẩu cho các máy khách nội bộ trên cùng máy chủ không đi qua proxy, hoặc
- Định tuyến qua một địa chỉ proxy tin cậy không phải loopback và giữ IP đó trong
gateway.trustedProxies, hoặc - Đối với proxy ngược có chủ đích trên cùng máy chủ, hãy đặt
gateway.auth.trustedProxy.allowLoopback = true, giữ địa chỉ loopback tronggateway.trustedProxies, đồng thời bảo đảm proxy loại bỏ hoặc ghi đè các tiêu đề danh tính.
trusted_proxy_local_interface_source / trusted_proxy_local_interface_check_failed
trusted_proxy_local_interface_source / trusted_proxy_local_interface_check_failed
..._check_failed có nghĩa là chính quá trình khám phá giao diện đã gặp lỗi, vì vậy OpenClaw thất bại theo cơ chế đóng an toàn.Hãy kiểm tra:- Có tiến trình nào trên chính máy chủ Gateway đang gửi trực tiếp các tiêu đề danh tính và bỏ qua proxy không?
- Proxy có chạy trong cùng không gian tên mạng với Gateway, với một IP cũng xuất hiện dưới dạng giao diện cục bộ không?
allowLoopback cho thiết lập proxy thực sự trên cùng máy chủ.trusted_proxy_user_missing
trusted_proxy_user_missing
- Proxy của bạn có được cấu hình để truyền các tiêu đề danh tính không?
- Tên tiêu đề có chính xác không? (không phân biệt chữ hoa chữ thường, nhưng cách viết phải đú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_*
- Cấu hình proxy của bạn cho các tiêu đề cụ thể đó.
- Liệu các tiêu đề có đang bị loại bỏ ở đâu đó trong chuỗi hay không.
trusted_proxy_user_not_allowed
trusted_proxy_user_not_allowed
allowUsers. Hãy thêm họ vào hoặc xóa danh sách cho phép.trusted_proxy_no_proxies_configured / trusted_proxy_config_missing
trusted_proxy_no_proxies_configured / trusted_proxy_config_missing
gateway.auth.mode là "trusted-proxy" nhưng gateway.trustedProxies trống, hoặc thiếu chính gateway.auth.trustedProxy. Mọi yêu cầu đều bị từ chối cho đến khi cả hai được thiết lập.trusted_proxy_origin_not_allowed
trusted_proxy_origin_not_allowed
Origin của trình duyệt không vượt qua bước kiểm tra nguồn gốc của Control UI.Kiểm tra:gateway.controlUi.allowedOriginsbao gồm chính xác nguồn gốc của trình duyệt.- Bạn không dựa vào nguồn gốc ký tự đại diện, trừ khi cố ý muốn hành vi cho phép tất cả.
- Nếu cố ý sử dụng chế độ dự phòng theo header Host,
gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=trueđược thiết lập có chủ đí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
chat.history, sessions.list hoặc
models.list thất bại với missing scope: operator.read.Nguyên nhân thường gặp:- Phiên Control UI không có thiết bị: xác thực proxy tin cậy có thể cho phép kết nối WebSocket mà không cần danh tính thiết bị, nhưng theo thiết kế, OpenClaw xóa các phạm vi của phiên không có thiết bị.
- Máy khách backend tùy chỉnh:
gateway.controlUi.dangerouslyDisableDeviceAuthchỉ dành cho Control UI và không cấp phạm vi cho các máy khách WebSocket backend tùy ý hoặc có dạng CLI. x-openclaw-scopesquá hạn hẹp: nếu proxy chèn header này vào yêu cầu nâng cấp WebSocket của Control UI, phạm vi phiên bị giới hạn ở tập hợp đó. Giá trị header trống sẽ không cấp phạm vi nào.
- Đối với Control UI, hãy sử 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.
- Đối với quy trình tự động hóa tùy chỉnh, hãy sử dụng danh tính thiết bị/ghép nối, đường dẫn helper backend
gateway-clientdành riêng cho kết nối cục bộ trực tiếp, hoặc RPC HTTP quản trị. - Chỉ sử dụng
gateway.controlUi.dangerouslyDisableDeviceAuth: truenhư một đường khẩn cấp tạm thời cho Control UI.
WebSocket vẫn gặp lỗi
WebSocket vẫn gặp lỗi
- Hỗ trợ nâng cấp WebSocket (
Upgrade: websocket,Connection: upgrade). - Chuyển tiếp các header danh tính trong 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 các kết nối WebSocket.
Di chuyển từ xác thực bằng token
Cấu hình proxy
Kiểm thử proxy độc lập
Cập nhật cấu hình OpenClaw
Khởi động lại Gateway
Kiểm thử WebSocket
Kiểm tra
openclaw security audit và xem xét các phát hiện.Liên quan
- Cấu hình — tài liệu tham chiếu cấu hình
- Phạm vi của người vận hành — vai trò, phạm vi và kiểm tra phê duyệt
- Truy cập từ xa — các mô hình truy cập từ xa khác
- Bảo mật — hướng dẫn bảo mật đầy đủ
- Tailscale — giải pháp thay thế đơn giản hơn cho truy cập chỉ trong tailnet