Gateway
การยืนยันตัวตนผ่านพร็อกซีที่เชื่อถือได้
ควรใช้เมื่อใด
- คุณเรียกใช้ OpenClaw หลัง พร็อกซีที่รับรู้ข้อมูลประจำตัว (Pomerium, Caddy + OAuth, nginx + oauth2-proxy, Traefik + forward auth)
- พร็อกซีของคุณจัดการการยืนยันตัวตนทั้งหมดและส่งข้อมูลประจำตัวผู้ใช้ผ่านส่วนหัว
- คุณอยู่ในสภาพแวดล้อม Kubernetes หรือคอนเทนเนอร์ ซึ่งพร็อกซีเป็นเส้นทางเดียวไปยัง Gateway
- คุณพบข้อผิดพลาด WebSocket
1008 unauthorizedเนื่องจากเบราว์เซอร์ไม่สามารถส่งโทเค็นในเพย์โหลด WS ได้
ไม่ควรใช้เมื่อใด
- พร็อกซีของคุณไม่ได้ยืนยันตัวตนผู้ใช้ (เป็นเพียงจุดสิ้นสุด TLS หรือตัวกระจายภาระ)
- มีเส้นทางใดก็ตามไปยัง Gateway ที่ข้ามพร็อกซีได้ (ช่องโหว่ของไฟร์วอลล์ การเข้าถึงผ่านเครือข่ายภายใน)
- คุณไม่แน่ใจว่าพร็อกซีลบหรือเขียนทับส่วนหัวที่ส่งต่อต่อมาอย่างถูกต้องหรือไม่
- คุณต้องการเพียงการเข้าถึงส่วนบุคคลสำหรับผู้ใช้คนเดียว (ให้พิจารณา Tailscale Serve + loopback แทน)
วิธีการทำงาน
พร็อกซียืนยันตัวตนผู้ใช้
พร็อกซีย้อนกลับของคุณยืนยันตัวตนผู้ใช้ (OAuth, OIDC, SAML เป็นต้น)
พร็อกซีเพิ่มส่วนหัวข้อมูลประจำตัว
พร็อกซีเพิ่มส่วนหัวที่มีข้อมูลประจำตัวผู้ใช้ซึ่งผ่านการยืนยันตัวตนแล้ว (เช่น x-forwarded-user: nick@example.com)
Gateway ตรวจสอบแหล่งที่มาที่เชื่อถือได้
OpenClaw ตรวจสอบว่าคำขอมาจาก IP ของพร็อกซีที่เชื่อถือได้ (gateway.trustedProxies) และไม่ใช่ที่อยู่ loopback หรือที่อยู่อินเทอร์เฟซภายในเครื่องของ Gateway เอง
Gateway แยกข้อมูลประจำตัว
OpenClaw อ่านส่วนหัวที่จำเป็น แล้วอ่านข้อมูลประจำตัวผู้ใช้จากส่วนหัวที่กำหนดค่าไว้
อนุญาต
หากทุกอย่างผ่านการตรวจสอบ และผู้ใช้ผ่าน allowUsers (เมื่อกำหนดไว้) คำขอจะได้รับอนุญาต
การกำหนดค่า
{ gateway: { // การยืนยันตัวตนด้วยพร็อกซีที่เชื่อถือได้คาดว่า IP ต้นทางของพร็อกซีจะไม่ใช่ loopback โดยค่าเริ่มต้น bind: "lan", // สำคัญอย่างยิ่ง: เพิ่มเฉพาะ IP ของพร็อกซีของคุณที่นี่ trustedProxies: ["10.0.0.1", "172.17.0.1"], auth: { mode: "trusted-proxy", trustedProxy: { // ส่วนหัวที่มีข้อมูลประจำตัวผู้ใช้ซึ่งผ่านการยืนยันตัวตนแล้ว (จำเป็น) userHeader: "x-forwarded-user", // ไม่บังคับ: ส่วนหัวที่ต้องมีอยู่ (การตรวจสอบพร็อกซี) requiredHeaders: ["x-forwarded-proto", "x-forwarded-host"], // ไม่บังคับ: จำกัดเฉพาะผู้ใช้ที่ระบุ (ว่าง = อนุญาตทั้งหมด) allowUsers: ["nick@example.com", "admin@company.org"], // ไม่บังคับ: อนุญาตพร็อกซี loopback บนโฮสต์เดียวกันหลังจากเลือกเปิดใช้อย่างชัดเจน allowLoopback: false, }, }, },}ข้อมูลอ้างอิงการกำหนดค่า
gateway.trustedProxiesstring[]requiredอาร์เรย์ของที่อยู่ IP พร็อกซี (หรือ CIDR) ที่ให้ความเชื่อถือ คำขอจาก IP อื่นจะถูกปฏิเสธ
gateway.auth.modestringrequiredต้องเป็น "trusted-proxy"
gateway.auth.trustedProxy.userHeaderstringrequiredชื่อส่วนหัวที่มีข้อมูลประจำตัวผู้ใช้ซึ่งผ่านการยืนยันตัวตนแล้ว
gateway.auth.trustedProxy.requiredHeadersstring[]ส่วนหัวเพิ่มเติมที่ต้องมีเพื่อให้คำขอได้รับความเชื่อถือ
gateway.auth.trustedProxy.allowUsersstring[]รายการอนุญาตของข้อมูลประจำตัวผู้ใช้ ค่าว่างหมายถึงอนุญาตผู้ใช้ที่ผ่านการยืนยันตัวตนทั้งหมด
gateway.auth.trustedProxy.allowLoopbackbooleandefault: falseการรองรับพร็อกซีย้อนกลับแบบ loopback บนโฮสต์เดียวกันที่ต้องเลือกเปิดใช้งาน
พฤติกรรมการจับคู่ของ Control UI
เมื่อ gateway.auth.mode = "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+ ไฟร์วอลล์)
ไคลเอนต์ WebSocket แบบกำหนดเองไม่ใช่เซสชัน Control UI gateway.controlUi.dangerouslyDisableDeviceAuth ไม่ได้มอบขอบเขตสิทธิ์ให้ไคลเอนต์ client.mode: "backend" หรือไคลเอนต์ที่มีรูปแบบแบบ CLI ใด ๆ การทำงานอัตโนมัติแบบกำหนดเองควรใช้ข้อมูลประจำตัวอุปกรณ์/การจับคู่ เส้นทางตัวช่วยแบ็กเอนด์สำหรับการเชื่อมต่อภายในโดยตรงที่สงวนไว้ด้วย client.id: "gateway-client" หรือ Plugin RPC ผู้ดูแลระบบผ่าน HTTP เมื่อพื้นผิวคำขอ/การตอบกลับแบบ HTTP เหมาะสมกว่า
ส่วนหัวขอบเขตสิทธิ์ของผู้ดำเนินการ
การยืนยันตัวตนด้วยพร็อกซีที่เชื่อถือได้เป็นโหมด HTTP ที่ มีข้อมูลประจำตัว ดังนั้นผู้เรียกสามารถประกาศขอบเขตสิทธิ์ของผู้ดำเนินการเพิ่มเติมได้ด้วย x-openclaw-scopes ในคำขอ HTTP API
หมายเหตุ: ขอบเขตสิทธิ์ WebSocket ถูกกำหนดโดยการจับมือของโปรโตคอล Gateway และการผูกข้อมูลประจำตัวอุปกรณ์ ในคำขออัปเกรด WebSocket ของ Control UI x-openclaw-scopes เป็นเพียงการจำกัดขอบเขตสิทธิ์ของเซสชันที่เจรจาแล้ว ไม่ใช่การมอบสิทธิ์ ดู พฤติกรรมการจับคู่ของ Control UI
ตัวอย่าง:
x-openclaw-scopes: operator.readx-openclaw-scopes: operator.read,operator.writex-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 ที่จุดนั้น
สิ้นสุด TLS ที่พร็อกซี (แนะนำ)
เมื่อพร็อกซีย้อนกลับของคุณจัดการ HTTPS สำหรับ https://control.example.com ให้ตั้งค่า Strict-Transport-Security ที่พร็อกซีสำหรับโดเมนนั้น
- เหมาะสำหรับการปรับใช้ที่เปิดให้เข้าถึงจากอินเทอร์เน็ต
- รวมใบรับรองและนโยบายเสริมความแข็งแกร่งของ HTTP ไว้ในที่เดียว
- OpenClaw สามารถใช้ HTTP ผ่าน loopback หลังพร็อกซีต่อไปได้
ตัวอย่างค่าส่วนหัว:
Strict-Transport-Security: max-age=31536000; includeSubDomainsสิ้นสุด TLS ที่ Gateway
หาก OpenClaw ให้บริการ HTTPS โดยตรงด้วยตนเอง (ไม่มีพร็อกซีที่สิ้นสุด TLS) ให้ตั้งค่า:
{ gateway: { tls: { enabled: true }, http: { securityHeaders: { strictTransportSecurity: "max-age=31536000; includeSubDomains", }, }, },}strictTransportSecurity ยอมรับค่าส่วนหัวแบบสตริง หรือ false เพื่อปิดใช้งานอย่างชัดเจน
แนวทางการทยอยเปิดใช้
- เริ่มด้วยอายุสูงสุดที่สั้นก่อน (เช่น
max-age=300) ระหว่างตรวจสอบการรับส่งข้อมูล - เพิ่มเป็นค่าระยะยาว (เช่น
max-age=31536000) เฉพาะเมื่อมีความมั่นใจสูงแล้ว - เพิ่ม
includeSubDomainsเฉพาะเมื่อทุกโดเมนย่อยพร้อมใช้งาน HTTPS - ใช้ preload เฉพาะเมื่อคุณตั้งใจปฏิบัติตามข้อกำหนดของ preload สำหรับชุดโดเมนทั้งหมดของคุณ
- การพัฒนาภายในเครื่องที่ใช้เฉพาะ loopback ไม่ได้รับประโยชน์จาก HSTS
ตัวอย่างการตั้งค่าพร็อกซี
Pomerium
Pomerium ส่งข้อมูลประจำตัวผ่าน x-pomerium-claim-email (หรือส่วนหัวการอ้างสิทธิ์อื่น ๆ) และส่ง JWT ผ่าน x-pomerium-jwt-assertion
{ gateway: { bind: "lan", trustedProxies: ["10.0.0.1"], // IP ของ Pomerium auth: { mode: "trusted-proxy", trustedProxy: { userHeader: "x-pomerium-claim-email", requiredHeaders: ["x-pomerium-jwt-assertion"], }, }, },}ส่วนย่อยการกำหนดค่า Pomerium:
routes: - from: https://openclaw.example.com to: http://openclaw-gateway:18789 policy: - allow: or: - email: is: nick@example.com pass_identity_headers: trueCaddy พร้อม OAuth
Caddy พร้อม Plugin caddy-security สามารถยืนยันตัวตนผู้ใช้และส่งส่วนหัวข้อมูลประจำตัวได้
{ gateway: { bind: "lan", trustedProxies: ["10.0.0.1"], // IP ของพร็อกซี Caddy/sidecar auth: { mode: "trusted-proxy", trustedProxy: { userHeader: "x-forwarded-user", }, }, },}ตัวอย่างย่อ Caddyfile:
openclaw.example.com { authenticate with oauth2_provider authorize with policy1 reverse_proxy openclaw:18789 { header_up X-Forwarded-User {http.auth.user.email} }}nginx + oauth2-proxy
oauth2-proxy ยืนยันตัวตนผู้ใช้และส่งข้อมูลประจำตัวผ่าน x-auth-request-email
{ gateway: { bind: "lan", trustedProxies: ["10.0.0.1"], // IP ของ nginx/oauth2-proxy auth: { mode: "trusted-proxy", trustedProxy: { userHeader: "x-auth-request-email", }, }, },}ตัวอย่างย่อการกำหนดค่า nginx:
location / { auth_request /oauth2/auth; auth_request_set $user $upstream_http_x_auth_request_email; proxy_pass http://openclaw:18789; proxy_set_header X-Auth-Request-Email $user; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade";}Traefik พร้อมการยืนยันตัวตนแบบส่งต่อ
{ gateway: { bind: "lan", trustedProxies: ["172.17.0.1"], // IP คอนเทนเนอร์ Traefik auth: { mode: "trusted-proxy", trustedProxy: { userHeader: "x-forwarded-user", }, }, },}การกำหนดค่าโทเค็นแบบผสม
การเริ่มต้น 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 เป็นทางเลือกสำรองสำหรับต้นทาง
การแก้ไขปัญหา
trusted_proxy_untrusted_source
คำขอไม่ได้มาจาก IP ใน gateway.trustedProxies ตรวจสอบว่า:
- IP ของพร็อกซีถูกต้องหรือไม่ (IP ของคอนเทนเนอร์ Docker อาจเปลี่ยนแปลงได้)
- มีโหลดบาลานเซอร์อยู่หน้าพร็อกซีของคุณหรือไม่
- ใช้
docker inspectหรือkubectl get pods -o wideเพื่อค้นหา IP จริง
trusted_proxy_loopback_source
OpenClaw ปฏิเสธคำขอพร็อกซีที่เชื่อถือซึ่งมาจาก local loopback
ตรวจสอบว่า:
- พร็อกซีกำลังเชื่อมต่อจาก
127.0.0.1/::1หรือไม่ - คุณกำลังพยายามใช้การยืนยันตัวตนแบบพร็อกซีที่เชื่อถือกับรีเวิร์สพร็อกซีผ่าน local loopback บนโฮสต์เดียวกันหรือไม่
วิธีแก้ไข:
- ควรใช้การยืนยันตัวตนด้วยโทเค็น/รหัสผ่านสำหรับไคลเอนต์ภายในบนโฮสต์เดียวกันที่ไม่ได้ผ่านพร็อกซี หรือ
- กำหนดเส้นทางผ่านที่อยู่พร็อกซีที่เชื่อถือซึ่งไม่ใช่ local loopback และเก็บ IP นั้นไว้ใน
gateway.trustedProxiesหรือ - สำหรับรีเวิร์สพร็อกซีบนโฮสต์เดียวกันที่ตั้งใจใช้งาน ให้กำหนด
gateway.auth.trustedProxy.allowLoopback = trueเก็บที่อยู่ local loopback ไว้ในgateway.trustedProxiesและตรวจสอบให้แน่ใจว่าพร็อกซีลบหรือเขียนทับเฮดเดอร์ข้อมูลประจำตัว
trusted_proxy_local_interface_source / trusted_proxy_local_interface_check_failed
IP ต้นทางของคำขอตรงกับหนึ่งในที่อยู่อินเทอร์เฟซเครือข่ายที่ไม่ใช่ local loopback ของโฮสต์ Gateway เอง (ไม่ใช่พร็อกซี) ซึ่งเป็นกลไกป้องกันทราฟฟิกจากโฮสต์เดียวกันที่ปลอมแปลงบน tailnet หรือเครือข่ายบริดจ์ Docker ส่วน ..._check_failed หมายความว่าการค้นหาอินเทอร์เฟซเกิดข้อผิดพลาด ดังนั้น OpenClaw จึงปฏิเสธโดยปริยาย
ตรวจสอบว่า:
- มีกระบวนการบนโฮสต์ Gateway เองที่ส่งเฮดเดอร์ข้อมูลประจำตัวโดยตรงและข้ามพร็อกซีหรือไม่
- พร็อกซีทำงานในเนมสเปซเครือข่ายเดียวกับ Gateway โดยใช้ IP ที่ปรากฏเป็นอินเทอร์เฟซภายในเครื่องด้วยหรือไม่
วิธีแก้ไข: กำหนดเส้นทางทราฟฟิกพร็อกซีผ่านที่อยู่ซึ่งไม่ได้ผูกอยู่ภายในโฮสต์ Gateway ด้วย หรือใช้ allowLoopback เฉพาะกับการตั้งค่าพร็อกซีบนโฮสต์เดียวกันจริง ๆ เท่านั้น
trusted_proxy_user_missing
เฮดเดอร์ผู้ใช้ว่างเปล่าหรือไม่มีอยู่ ตรวจสอบว่า:
- พร็อกซีของคุณได้รับการกำหนดค่าให้ส่งเฮดเดอร์ข้อมูลประจำตัวหรือไม่
- ชื่อเฮดเดอร์ถูกต้องหรือไม่ (ไม่คำนึงถึงตัวพิมพ์เล็ก-ใหญ่ แต่การสะกดต้องถูกต้อง)
- ผู้ใช้ผ่านการยืนยันตัวตนที่พร็อกซีจริงหรือไม่
trusted_proxy_missing_header_*
ไม่มีเฮดเดอร์ที่จำเป็น ตรวจสอบว่า:
- การกำหนดค่าพร็อกซีของคุณระบุเฮดเดอร์เหล่านั้นอย่างถูกต้อง
- เฮดเดอร์ถูกลบออกที่จุดใดจุดหนึ่งในสายการเชื่อมต่อหรือไม่
trusted_proxy_user_not_allowed
ผู้ใช้ผ่านการยืนยันตัวตนแล้ว แต่ไม่อยู่ใน allowUsers ให้เพิ่มผู้ใช้ดังกล่าวหรือนำรายการอนุญาตออก
trusted_proxy_no_proxies_configured / trusted_proxy_config_missing
gateway.auth.mode เป็น "trusted-proxy" แต่ gateway.trustedProxies ว่างเปล่า หรือไม่มี gateway.auth.trustedProxy ทุกคำขอจะถูกปฏิเสธจนกว่าจะกำหนดค่าทั้งสองรายการ
trusted_proxy_origin_not_allowed
การยืนยันตัวตนแบบพร็อกซีที่เชื่อถือสำเร็จแล้ว แต่เฮดเดอร์ 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ที่สงวนไว้สำหรับการเชื่อมต่อโดยตรงภายในเครื่อง หรือ RPC HTTP สำหรับผู้ดูแลระบบ - ใช้
gateway.controlUi.dangerouslyDisableDeviceAuth: trueเป็นเส้นทางฉุกเฉินชั่วคราวสำหรับ Control UI เท่านั้น
WebSocket ยังคงล้มเหลว
ตรวจสอบให้แน่ใจว่าพร็อกซีของคุณ:
- รองรับการอัปเกรด WebSocket (
Upgrade: websocket,Connection: upgrade) - ส่งเฮดเดอร์ข้อมูลประจำตัวในคำขออัปเกรด WebSocket (ไม่ใช่เฉพาะ HTTP)
- ไม่มีเส้นทางการยืนยันตัวตนแยกต่างหากสำหรับการเชื่อมต่อ WebSocket
การย้ายจากการยืนยันตัวตนด้วยโทเค็น
กำหนดค่าพร็อกซี
กำหนดค่าพร็อกซีของคุณให้ยืนยันตัวตนผู้ใช้และส่งเฮดเดอร์
ทดสอบพร็อกซีแยกต่างหาก
ทดสอบการตั้งค่าพร็อกซีแยกต่างหาก (curl พร้อมเฮดเดอร์)
อัปเดตการกำหนดค่า OpenClaw
อัปเดตการกำหนดค่า OpenClaw ให้ใช้การยืนยันตัวตนแบบพร็อกซีที่เชื่อถือ
เริ่ม Gateway ใหม่
เริ่ม Gateway ใหม่
ทดสอบ WebSocket
ทดสอบการเชื่อมต่อ WebSocket จาก Control UI
ตรวจสอบ
เรียกใช้ openclaw security audit และตรวจทานข้อค้นพบ
ที่เกี่ยวข้อง
- การกำหนดค่า — เอกสารอ้างอิงการกำหนดค่า
- ขอบเขตสิทธิ์ของผู้ดำเนินการ — บทบาท ขอบเขตสิทธิ์ และการตรวจสอบการอนุมัติ
- การเข้าถึงจากระยะไกล — รูปแบบการเข้าถึงจากระยะไกลอื่น ๆ
- ความปลอดภัย — คู่มือความปลอดภัยฉบับเต็ม
- Tailscale — ทางเลือกที่ง่ายกว่าสำหรับการเข้าถึงเฉพาะผ่าน tailnet