الأمان المحلي

10.1 الأساس

الاستماع إلى localhost وحده ليس أمانًا مطلقًا، فما زال بوسع صفحة ويب خبيثة أن تحاول الوصول إلى المنافذ المحلية. ولذلك يجمع LMSP بين عدة تدابير.

  • يجب على الخدمة أن ترتبط افتراضيًا بعناوين loopback. ولا يجوز لها أن تستمع إلى 0.0.0.0 أو أي عنوان آخر غير loopback ما لم يكن وضع LAN مفعّلًا (القسم 10.5).
  • عند أول تشغيل، ينبغي للخدمة أن تولّد سرًّا عشوائيًا للخدمة عالي الإنتروبيا، وأن تستخدمه، بدلًا من أي قيمة افتراضية مضمَّنة، لإصدار الرموز والتحقق منها.
  • يجب أن يحمل كل طلب إلى الواجهة الأساسية رمز Bearer صالحًا، باستثناء نقاط نهاية التهيئة المذكورة في القسم 4.2. فالقدوم من loopback لا يكفي وحده أبدًا.

10.2 الاقتران والرموز

يحصل العميل على رمز Bearer خاص به برمز اقتران محلي. يطلب المستخدم من الخدمة عرض رمز اقتران، بالطريقة التي تقدمها الخدمة، ويرسله العميل:

POST /lmsp/v1/pair
Content-Type: application/json
{
  "client_name": "example-client",
  "pairing_code": "K7QD-4M2X",
  "scopes": ["inference"]
}
حقل الطلب المعنى
client_name اسم العرض للعميل، ويظهر للمستخدم.
pairing_code الرمز الذي حصل عليه المستخدم من الخدمة.
scopes قائمة اختيارية بالنطاقات المطلوبة. والافتراضي ["inference"].

ترد الخدمة برمز. وtoken_type هو دائمًا Bearer:

{
  "client_id": "cli_01J8MAT3W6X9B2D5F8H1K4N7QZ",
  "access_token": "lmsp_example_3f9a1c52e7d84b60",
  "token_type": "Bearer",
  "scopes": ["inference"]
}

ثم يرسل العميل Authorization: Bearer <token> مع كل طلب.

  • يجب أن يكون رمز الاقتران للاستخدام مرة واحدة، وينبغي أن تنتهي صلاحيته خلال 5 دقائق. وينبغي أن يحمل 40 بتًا من الإنتروبيا على الأقل. ويجب على الخدمة أن تحدّ من معدل المحاولات الفاشلة. والرمز الخاطئ أو المنتهي يُرد عليه بـ 401 مع unauthorized.
  • الرموز مستقلة لكل عميل، فيستطيع المستخدم سحب رمز عميل دون التأثير في الآخرين. وينبغي للخدمة أن تتيح للمستخدم سرد العملاء المقترنين وسحب رموزهم.
  • ينبغي للعميل أن يحتفظ برمزه في سلسلة مفاتيح نظام التشغيل أو مدير بيانات الاعتماد فيه. وينبغي للخدمة أن تخزّن تجزئة كل رمز فقط.
  • الرمز المفقود أو غير الصالح أو المسحوب يُرد عليه بـ 401 مع unauthorized وترويسة WWW-Authenticate: Bearer. والرمز الصالح الذي يفتقر إلى النطاق الذي تحتاجه نقطة النهاية يُرد عليه بـ 403 مع forbidden.

10.3 النطاقات

الأذونات مقسمة إلى نطاقات منفصلة. فتنزيل النماذج وحذفها وتنفيذ الأدوات لا تركب أبدًا على نطاق الاستدلال.

النطاق يتيح
inference قراءة فهرس النماذج، وإنشاء الاستجابات والمهام، وقراءة مهام العميل نفسه وإلغاءها.
models:manage تحميل النماذج وإلغاء تحميلها.
models:install محجوز. تنزيل النماذج وحذفها.
tools:execute محجوز. تنفيذ الأدوات من جهة الخدمة.

المهام والاستجابات المخزَّنة تخص العميل الذي أنشأها. وينبغي للخدمة أن ترد على طلب عميل آخر كأنها غير موجودة (task_not_found أو response_not_found).

10.4 حماية المتصفح والشبكة

  • يجب على الخدمة أن ترفض طلبات المتصفح العابرة للمصادر افتراضيًا، وأن لا تسمح إلا بقيم Origin المضبوطة صراحةً. والطلب بأي Origin آخر يُرد عليه بـ 403 مع forbidden.
  • عندما يكون المصدر مسموحًا، ترد الخدمة على طلبات CORS التمهيدية (preflight) له وترسل Access-Control-Allow-Origin بذلك المصدر بعينه، وليس بـ * أبدًا.
  • يجب على الخدمة أن تتحقق من ترويسة Host، لمنع DNS rebinding. وهي لا تقبل إلا أسماء المضيف التي تخدمها: أسماء loopback وعناوينها، إضافةً إلى أي أسماء مضبوطة لوضع LAN. وأي قيمة أخرى يُرد عليها بـ 403 مع forbidden.

10.5 وضع LAN

وضع LAN يعني الاستماع خارج عناوين loopback.

  • لا يجوز للخدمة أن تفعّل وضع LAN ما لم يشغّله المستخدم صراحةً.
  • في وضع LAN يجب على الخدمة أن تشترط المصادقة، وينبغي لها أن تفعّل TLS أيضًا. ولا ينبغي للعميل أن يرسل رمزًا عبر HTTP العادي إلى عنوان غير loopback ما لم يسمح المستخدم بذلك صراحةً.
  • إعلان mDNS مسموح في وضع LAN فقط، عندما يكون المستخدم قد شغّل أيضًا اكتشاف الشبكة المحلية (القسم 3.2).

10.6 التسجيل والخصوصية

  • لا يجوز أن تظهر مسارات النماذج أو السجلات أو المطالبات أو المحتوى المولَّد في إعلانات mDNS.
  • افتراضيًا، ينبغي للخدمة أن تسجّل البيانات الوصفية فقط (الأوقات ونقاط النهاية ورموز الحالة والمعرّفات وأعداد الرموز والمدد). ولا ينبغي لها أن تسجّل المطالبات الكاملة أو المحتوى المولَّد.
  • لا يجوز أن تحتوي استجابات الصحة وتفاصيل الأخطاء على مسارات النماذج أو المطالبات أو رموز الوصول أو أي معلومات حساسة أخرى.