الانتقال إلى المحتوى الرئيسي
وكيل تعرّض لحقن مطالبة، أو أُسيء إعداده، أو مُنح خطأً صلاحيات واسعة يمكنه استدعاء أدوات لم يُعدَّ للوصول إليها أبداً — أو استدعاء أداة شرعية بوسائط خطرة: shell.exec مع rm -rf /، أو واجهة برمجية للمدفوعات بمبلغ تحويل ضخم، أو أداة قاعدة بيانات تستهدف النسخة الإنتاجية. هذه إساءة استخدام أدوات الوكيل، وهي من أكثر المخاطر تأثيراً في الأنظمة الوكيلة لأن استدعاءات الأدوات لها آثار جانبية في العالم الحقيقي غالباً ما تكون لا رجعة فيها. يمتلك جدار الحماية للوكيل ثلاثة دفاعات متعددة الطبقات. يمكنك نشرها بشكل مستقل أو مجتمعة.

1. قائمة السماح: احجب كل ما لم تسمح به صراحةً

أقوى ضبط هو قائمة السماح. بدلاً من محاولة تعداد كل أداة خطرة، تُعدِّد الأدوات التي يحتاجها هذا الوكيل فعلاً — وتحجب كل شيء آخر. هذا هو أساس الثقة الصفرية. تُحقق ذلك سياسة بـ default_verdict: deny وقواعد allow صريحة لكل أداة مُعتمَدة. مثال: وكيل يجب أن يقرأ فقط من نظام CRM:
[
  {
    "priority": 10,
    "label": "allow crm reads",
    "tool_name_glob": "crm.get*",
    "verdict": "allow"
  },
  {
    "priority": 20,
    "label": "allow crm search",
    "tool_name_glob": "crm.search",
    "verdict": "allow"
  },
  {
    "priority": 9999,
    "label": "deny everything else",
    "tool_name_glob": "*",
    "verdict": "deny"
  }
]
أي استدعاء لـ shell.exec أو db.delete أو payment.transfer — سواء صدر عن قصد أو أطلقته تعليمة محقونة — يصطدم بقاعدة المسايرة الشاملة * ويُعيد خطأ HTTP 400 firewall_blocked. يرى الوكيل خطأ أداة منظَّمة ولا يستطيع إعادة المحاولة (يُعلَّم الحجب بـ skip-retry)، لذا لا يستطيع التحايل على الرفض بالتكرار.
اضبط default_verdict لسياستك على deny لإنفاذ قائمة السماح بالكامل. مع الحكم الافتراضي audit، تُسمح الاستدعاءات غير المطابقة وتُسجَّل لكنها لا تُحجب — مفيد أثناء الطرح لكنه ليس ضبطاً أمنياً في حد ذاته.
تتيح لك أنماط Glob السماح بعائلات أدوات بأكملها بقاعدة واحدة. الأنماط الشائعة:
النمطما يغطيه
crm.*جميع الأدوات في نطاق أسماء crm
*.readأي أداة قراءة عبر جميع الخوادم
db.queryهذه الأداة بالتحديد
*كل شيء (استخدمها لقاعدة الرفض الشاملة)
تطابق الأدوات يعمل بمبدأ أول مطابقة تفوز بترتيب الأولوية تصاعدياً. ضع قواعد allow المحددة بأرقام أولوية منخفضة وقاعدة deny الشاملة بأولوية عالية.

2. التحقق من الوسائط: اسمح بالأداة وأوقف الاستدعاء الخطر

قائمة السماح على أسماء الأدوات خشنة — إذ تحجب shell.exec بالكامل. أحياناً تريد السماح بأداة ما مع تقييد كيفية استدعائها. تتيح لك عبارات الوسائط المطابقة على حقول محددة داخل وسائط استدعاء الأداة، باستخدام JSONPath ومجموعة من العوامل. مثال: اسمح بـ shell.exec لكن أوقف rm -rf
{
  "priority": 10,
  "label": "block destructive rm",
  "tool_name_glob": "shell.exec",
  "args_match": {
    "clauses": [
      {
        "path": "$.command",
        "op": "regex",
        "value": "rm\\s+-[^\\s]*r[^\\s]*f|mkfs|dd\\s+if=|:\\(\\)\\{.*\\}"
      }
    ]
  },
  "verdict": "deny"
}
تُطلَق هذه القاعدة فقط عندما يُستدعى shell.exec ويطابق وسيط $.command نمط الأوامر المدمّرة. يستدعاء shell.exec العادي بأمر آمن يمر إلى القاعدة التالية (أو الحكم الافتراضي). ضع هذه القاعدة بأولوية أدنى من أي قاعدة عامة allow shell.exec حتى تُطلَق أولاً. المجموعة الكاملة من عوامل الوسائط:
العاملاستخدمه عندما
eqتطابق تام على قيمة عددية (نص أو رقم)
containsتطابق سلسلة جزئية — مثل $.query contains DROP TABLE
regexتطابق نمط RE2 — آمن على المسار الساخن، بدون تراجع
inيجب أن تكون القيمة في مصفوفة معطاة — مثل السماح فقط ببيئات محددة
cidr_matchعنوان IP في كتلة CIDR — مفيد لفحوصات وجهة egress
gt / ltمقارنة رقمية — مثل $.amount gt 10000 لسقوف المدفوعات
جميع العبارات في كتلة args_match تخضع لـ AND. إذا لم يكن المسار موجوداً في وسائط الاستدعاء، تتقيَّم العبارة بـ false ولا تُطلَق القاعدة — يمر الاستدعاء للقاعدة التالية أو الافتراضي. مثال حارس المدفوعات — ارفض أي استدعاء لأداة دفع بمبلغ يتجاوز حداً:
{
  "priority": 5,
  "label": "cap payment amount",
  "tool_name_glob": "payment.*",
  "args_match": {
    "clauses": [
      { "path": "$.amount_cents", "op": "gt", "value": 100000 }
    ]
  },
  "verdict": "deny"
}

3. الإنسان في الحلقة: أوقف الاستدعاءات عالية المخاطر للموافقة

بالنسبة للأدوات الضرورية فعلاً لكنها عالية المخاطر — تشغيل نشر، أو اعتماد استرداد، أو إرسال بريد إلكتروني جماعي — يمكنك اشتراط توقيع بشري قبل متابعة الاستدعاء. يُعلَّق حكم pending_approval الاستدعاء ويُعيد استجابة firewall_approval_pending للوكيل:
{
  "priority": 20,
  "label": "hold deployment calls for review",
  "tool_name_glob": "deploy.*",
  "verdict": "pending_approval"
}
يستطلع الوكيل (أو إطار العمل) معرّف الموافقة. يوافق مراجِع أو يرفض من وحدة التحكم أو عبر استدعاء webhook. في حالة الموافقة، يُعيد الوكيل تقديم الاستدعاء الأصلي برمز موافقة أحادي الاستخدام وتمرّره البوابة مرة واحدة. يتوافق pending_approval مع عبارات الوسائط — يمكنك تعليق الاستدعاءات التي تطابق حداً فقط، والسماح بالروتينية منها مباشرةً:
[
  {
    "priority": 10,
    "label": "hold large deploys",
    "tool_name_glob": "deploy.release",
    "args_match": {
      "clauses": [
        { "path": "$.environment", "op": "eq", "value": "production" }
      ]
    },
    "verdict": "pending_approval"
  },
  {
    "priority": 20,
    "label": "allow staging deploys",
    "tool_name_glob": "deploy.*",
    "verdict": "allow"
  }
]

4. كيف يبدو الاستدعاء المحجوب

استدعاء مرفوض على سطح inbound (أداة مُعلَن عنها في الطلب) يُعيد HTTP 400 برمز خطأ firewall_blocked. تحمل الاستجابة metadata منظَّمة — تسمية القاعدة المطابقة، ورمز السبب، وعوامل المخاطرة — ومُعلَّمة skip-retry حتى لا تستطيع حلقة طرق نفس الاستدعاء المرفوض. استدعاء محجوب على سطح response (أصدر النموذج بالفعل tool_calls) يُعيد خطأ أداة مرئياً للنموذج، مما يمنحه فرصة للتفاعل — اختيار أداة أخرى، أو سؤال المستخدم، أو التوقف — بدلاً من الانهيار.

5. ترتيب أول مطابقة تفوز

ترتيب الأولوية مهم. يجتاز المحرك القواعد بترتيب الأولوية تصاعدياً ويتوقف عند أول مطابقة. نمط شائع:
الأولويةالقاعدةالحكم
5shell.exec + نمط المدمّرdeny
10shell.* (عام)allow
20crm.*allow
9999* (شاملة)deny
الأولوية 5 تُطلَق قبل الأولوية 10 — لذا يُرفض shell.exec بأمر مدمّر حتى لو كانت هناك قاعدة allow عامة لـ shell.*. بدون رفض ذي أولوية منخفضة، ستفوز قاعدة allow shell.* أولاً.

6. الطرح الآمن بوضع الظل

قبل تحويل سياسة جديدة إلى وضع التنفيذ، شغّل وضع الظل. تُقيِّم السياسة كل استدعاء أداة وتسجّل الحكم تماماً كما ستفعل في الإنتاج، لكن يُخفَّض كل حكم فارض (deny، pending_approval، sanitize) إلى audit — لا شيء يُحجب. السبب في سجل الأحداث مسبوق بـ [shadow] would deny حتى تتمكن من قياس الأثر في عرضَي Events وRuns. بمجرد تأكّدك أن السياسة تُطلَق على ما تتوقعه — ولا شيء لا تقصده — أطفئ وضع الظل. الاستدعاء التالي يُنفَّذ.
يُطبَّق مستوى الاستقلالية tight الإعداد المسبق block_destructive_shell تلقائياً. إذا احتجت موقفاً سريعاً دون كتابة قواعد، طبّق tight من وحدة التحكم وسيُشحن بسياسة رفض لاستدعاءات shell المدمّرة في خطوة واحدة. يمكنك بعدها تراكم قواعد قائمة سماحك الخاصة فوقه. انظر مستويات الاستقلالية.

7. التهديدات ذات الصلة

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

مرجع قواعد جدار الحماية

لغة المطابقة الكاملة — Glob الأدوات، وعبارات الوسائط، وجميع العوامل، والأحكام، والواجهة البرمجية.

نظرة عامة على جدار الحماية

السياسات، والأسطح، ومستويات الاستقلالية، وموافقة HITL، والقابلية للملاحظة.