Skip to main content
ميزة حساسة أمنيًا. يفوّض هذا الوضع المصادقة بالكامل إلى الوكيل العكسي لديك. قد يؤدي سوء الإعداد إلى تعريض Gateway لوصول غير مصرّح به. اقرأ هذه الصفحة بعناية قبل التفعيل.

متى يُستخدم

  • تشغّل OpenClaw خلف وكيل مدرك للهوية (Pomerium، أو Caddy + OAuth، أو nginx + oauth2-proxy، أو Traefik + مصادقة مُمرّرة).
  • يتولى وكيلك جميع عمليات المصادقة ويمرر هوية المستخدم عبر الترويسات.
  • تعمل في بيئة 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 وكان عنوان local 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، وليس ترويسات هوية الوكيل الموثوق. ولا تزال عمليات نشر واجهة التحكم على عناوين غير تابعة لـ 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، أو ترويسة إثبات موقّعة إذا كان وكيلك يدعمها.

سلوك إقران واجهة التحكم

عندما يكون gateway.auth.mode = "trusted-proxy" نشطًا ويجتاز الطلب عمليات تحقق الوكيل الموثوق، يمكن لجلسات WebSocket الخاصة بواجهة التحكم الاتصال دون هوية إقران الجهاز. الآثار المتعلقة بالنطاق:
  • تتصل جلسات WebSocket الخاصة بواجهة التحكم التي لا ترتبط بجهاز، لكنها لا تتلقى افتراضيًا أي نطاقات للمشغّل. يمسح OpenClaw قائمة النطاقات المطلوبة إلى [] لكي لا تتمكن جلسة غير مرتبطة بجهاز أو رمز مميز مقترن ومعتمد من التصريح بأذوناتها ذاتيًا.
  • إذا فشلت الأساليب برسالة missing scope بعد نجاح اتصال WebSocket، فاستخدم HTTPS لكي يتمكن المتصفح من إنشاء هوية الجهاز وإكمال الإقران. راجع استخدام HTTP غير الآمن لواجهة التحكم.
  • للاستخدام الطارئ فقط: يحافظ gateway.controlUi.dangerouslyDisableDeviceAuth=true على النطاقات المطلوبة حتى دون هوية جهاز. يمثل هذا خفضًا أمنيًا شديدًا؛ تراجع عنه بسرعة. راجع استخدام HTTP غير الآمن لواجهة التحكم.
تقييد النطاقات عبر الوكيل العكسي: إذا أرسل وكيلك x-openclaw-scopes في طلب ترقية WebSocket الخاص بواجهة التحكم، يقيّد OpenClaw نطاقات الجلسة إلى تقاطع النطاقات المطلوبة مع النطاقات المعلنة. لا تمنح هذه الترويسة نطاقات؛ بل تضيّق فقط ما يمكن للجلسة الاحتفاظ به. الآثار:
  • لم يعد الإقران هو البوابة الأساسية للوصول إلى واجهة التحكم في هذا الوضع.
  • تصبح سياسة المصادقة في وكيلك العكسي وallowUsers آلية التحكم الفعلية في الوصول.
  • أبقِ حركة المرور الواردة إلى Gateway مقصورة على عناوين IP للوكلاء الموثوقين فقط (gateway.trustedProxies + جدار الحماية).
عملاء WebSocket المخصصون ليسوا جلسات لواجهة التحكم. لا يمنح gateway.controlUi.dangerouslyDisableDeviceAuth نطاقات لعملاء عشوائيين يستخدمون client.mode: "backend" أو يتخذون شكل عملاء CLI. يجب أن تستخدم الأتمتة المخصصة هوية الجهاز والإقران، أو مسار مساعد الواجهة الخلفية المحلي المباشر المحجوز client.id: "gateway-client"، أو Plugin استدعاء HTTP RPC الإداري عندما تكون واجهة طلب/استجابة HTTP أنسب.

ترويسة نطاقات المشغّل

مصادقة الوكيل الموثوق هي وضع HTTP يحمل الهوية، لذلك يمكن للمتصلين اختياريًا إعلان نطاقات المشغّل باستخدام x-openclaw-scopes في طلبات HTTP API. ملاحظة: تحدد مصافحة بروتوكول Gateway وربط هوية الجهاز نطاقات WebSocket. في طلبات ترقية WebSocket الخاصة بواجهة التحكم، لا تمثل x-openclaw-scopes سوى حد أقصى لنطاقات الجلسة المتفاوض عليها، وليست منحة. راجع سلوك إقران واجهة التحكم. أمثلة:
  • 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 محددة صراحةً: تستخدم واجهة التحكم غير المتصلة عبر 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 لمصادر الوكيل الموجودة على المضيف نفسه.
تنطبق أيضًا نتائج منفصلة غير خاصة بالوكيل الموثوق كلما كانت واجهة التحكم مكشوفة: استخدام حرف بدل أو غياب 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 لمصدر الطلب مع أحد عناوين واجهات الشبكة غير التابعة لـ local loopback في مضيف Gateway نفسه (وليس الوكيل)، وذلك للحماية من حركة المرور المنتحلة من المضيف نفسه على شبكات tailnet أو شبكات جسر Docker. وتعني ..._check_failed أن اكتشاف الواجهات نفسه واجه خطأ، لذا يفشل OpenClaw بشكل مغلق.تحقق مما يلي:
  • هل ترسل عملية على مضيف Gateway نفسه ترويسات الهوية مباشرةً متجاوزةً الوكيل؟
  • هل يعمل الوكيل في مساحة أسماء الشبكة نفسها التي يعمل فيها Gateway، بعنوان IP يظهر أيضًا كواجهة محلية؟
الإصلاح: وجّه حركة مرور الوكيل عبر عنوان غير مرتبط محليًا أيضًا بمضيف Gateway، أو استخدم allowLoopback فقط لإعداد وكيل حقيقي على المضيف نفسه.
كانت ترويسة المستخدم فارغة أو مفقودة. تحقق مما يلي:
  • هل وكيلك مُعد لتمرير ترويسات الهوية؟
  • هل اسم الترويسة صحيح؟ (غير حساس لحالة الأحرف، لكن التهجئة مهمة)
  • هل تمت مصادقة المستخدم فعليًا لدى الوكيل؟
لم تكن إحدى الترويسات المطلوبة موجودة. تحقق مما يلي:
  • إعداد وكيلك لتلك الترويسات المحددة.
  • ما إذا كانت الترويسات تُزال في مكان ما ضمن السلسلة.
تمت مصادقة المستخدم لكنه غير موجود في allowUsers. إما أن تضفه أو تزيل قائمة السماح.
قيمة gateway.auth.mode هي "trusted-proxy" لكن gateway.trustedProxies فارغة، أو أن gateway.auth.trustedProxy نفسها مفقودة. يُرفض كل طلب حتى يتم ضبطهما معًا.
نجحت مصادقة الوكيل الموثوق، لكن ترويسة المتصفح Origin لم تجتز عمليات تحقق واجهة التحكم من الأصل.تحقق مما يلي:
  • تتضمن gateway.controlUi.allowedOrigins أصل المتصفح المطابق تمامًا.
  • لا تعتمد على أصول حرف البدل إلا إذا كنت تريد عمدًا سلوك السماح للجميع.
  • إذا كنت تستخدم عمدًا وضع الرجوع إلى ترويسة Host، فاضبط gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true عن قصد.
يتصل WebSocket، لكن chat.history أو sessions.list أو models.list يفشل مع missing scope: operator.read.الأسباب الشائعة:
  • جلسة واجهة تحكم بلا جهاز: يمكن لمصادقة الوكيل الموثوق السماح باتصال WebSocket من دون هوية جهاز، لكن OpenClaw يمسح النطاقات في الجلسات التي بلا جهاز حسب التصميم.
  • عميل خلفي مخصص: يقتصر gateway.controlUi.dangerouslyDisableDeviceAuth على واجهة التحكم، ولا يمنح نطاقات لعملاء WebSocket عشوائيين للواجهة الخلفية أو المشابهين لـ CLI.
  • قيمة x-openclaw-scopes ضيقة أكثر من اللازم: إذا حقن وكيلك هذه الترويسة في طلب ترقية WebSocket الخاص بواجهة التحكم، فتُحدَّد نطاقات الجلسة بتلك المجموعة. وتؤدي قيمة الترويسة الفارغة إلى عدم وجود نطاقات.
الإصلاح:
  • بالنسبة إلى واجهة التحكم، استخدم HTTPS كي يتمكن المتصفح من إنشاء هوية الجهاز وإكمال الاقتران.
  • بالنسبة إلى الأتمتة المخصصة، استخدم هوية الجهاز/الاقتران، أو مسار مساعد الواجهة الخلفية المباشر المحلي المحجوز gateway-client، أو استدعاء RPC الإداري عبر HTTP.
  • استخدم gateway.controlUi.dangerouslyDisableDeviceAuth: true فقط كمسار طوارئ مؤقت لواجهة التحكم.
تأكد من أن وكيلك:
  • يدعم ترقيات WebSocket (Upgrade: websocket، وConnection: upgrade).
  • يمرر ترويسات الهوية في طلبات ترقية WebSocket (وليس HTTP فقط).
  • لا يملك مسار مصادقة منفصلًا لاتصالات WebSocket.

الترحيل من مصادقة الرمز المميّز

1

إعداد الوكيل

أعد وكيلك لمصادقة المستخدمين وتمرير الترويسات.
2

اختبار الوكيل بشكل مستقل

اختبر إعداد الوكيل بشكل مستقل (استخدم curl مع الترويسات).
3

تحديث إعداد OpenClaw

حدّث إعداد OpenClaw باستخدام مصادقة الوكيل الموثوق.
4

إعادة تشغيل Gateway

أعد تشغيل Gateway.
5

اختبار WebSocket

اختبر اتصالات WebSocket من واجهة التحكم.
6

التدقيق

شغّل openclaw security audit وراجع النتائج.

ذات صلة