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

> متطلبات الأمان لخدمات LMSP، وتشمل الارتباط بعنوان loopback والاقتران ورموز Bearer والنطاقات وفحوص Origin وHost ضد صفحات الويب الخبيثة ووضع LAN وقواعد التسجيل.

Source: https://madeforagent.com/ar/lmsp/1.0/security/
Language: ar
Specification: LMSP 1.0 (draft)
Updated: 2026-11-08

## 10.1 الأساس {#baseline}

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

- **يجب** على الخدمة أن ترتبط افتراضيًا بعناوين loopback. و**لا يجوز** لها أن تستمع إلى `0.0.0.0` أو أي عنوان آخر غير loopback ما لم يكن وضع LAN مفعّلًا ([القسم 10.5](https://madeforagent.com/ar/lmsp/1.0/security.md#lan)).
- عند أول تشغيل، **ينبغي** للخدمة أن تولّد سرًّا عشوائيًا للخدمة عالي الإنتروبيا، وأن تستخدمه، بدلًا من أي قيمة افتراضية مضمَّنة، لإصدار الرموز والتحقق منها.
- **يجب** أن يحمل كل طلب إلى الواجهة الأساسية رمز Bearer صالحًا، باستثناء نقاط نهاية التهيئة المذكورة في [القسم 4.2](https://madeforagent.com/ar/lmsp/1.0/endpoints.md#conventions). فالقدوم من loopback لا يكفي وحده أبدًا.

## 10.2 الاقتران والرموز {#pairing}

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

```http
POST /lmsp/v1/pair
Content-Type: application/json
```

```json
{
  "client_name": "example-client",
  "pairing_code": "K7QD-4M2X",
  "scopes": ["inference"]
}
```

| حقل الطلب | المعنى |
| --- | --- |
| `client_name` | اسم العرض للعميل، ويظهر للمستخدم. |
| `pairing_code` | الرمز الذي حصل عليه المستخدم من الخدمة. |
| `scopes` | قائمة اختيارية بالنطاقات المطلوبة. والافتراضي `["inference"]`. |

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

```json
{
  "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 النطاقات {#scopes}

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

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

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

## 10.4 حماية المتصفح والشبكة {#browser}

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

## 10.5 وضع LAN {#lan}

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

- **لا يجوز** للخدمة أن تفعّل وضع LAN ما لم يشغّله المستخدم صراحةً.
- في وضع LAN **يجب** على الخدمة أن تشترط المصادقة، و**ينبغي** لها أن تفعّل TLS أيضًا. و**لا ينبغي** للعميل أن يرسل رمزًا عبر HTTP العادي إلى عنوان غير loopback ما لم يسمح المستخدم بذلك صراحةً.
- إعلان mDNS مسموح في وضع LAN فقط، عندما يكون المستخدم قد شغّل أيضًا اكتشاف الشبكة المحلية ([القسم 3.2](https://madeforagent.com/ar/lmsp/1.0/discovery.md#mdns)).

## 10.6 التسجيل والخصوصية {#logging}

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