الهندسة

تصميم أدلة تشغيل SOAR: تدفق بيانات تفاعلي، وتفرّع شرطي، وحجّة التشغيل التجريبي

معظم أدلة تشغيل SOAR سكربتات هشّة في غلاف جميل. أما التي تصمد أمام الإنتاج فتشترك في أربع سمات: مصمم بصري بتدفق بيانات تفاعلي، وعقد عُقَد مُنمّط، وتفرّع شرطي حقيقي، ووضع تشغيل تجريبي ينفّذ المنطق دون إطلاق الآثار الجانبية. إليك كيف تعمل كل واحدة وما الذي يتغيّر حين تمتلكها.

بقلم Krasper Engineering 10 يونيو 2026 قراءة في 9 دقيقة
SOAR Playbook Design — hero

الخلاصة. يُفترض بدليل تشغيل SOAR أن يكون تقنينًا لما يفعله أفضل محلليك الساعة الثالثة فجرًا. وعمليًا، تنزلق معظم الأدلة إلى أحد نمطَي فشل: إما أن تكون أشد جمودًا من أن تستوعب التباين الذي تنتجه الحوادث الحقيقية، أو أن تكون عامة إلى حد لا تؤتمت معه شيئًا ذا قيمة. وأربعة قرارات تصميمية، هي تدفق البيانات التفاعلي، وعقد العُقَد المُنمّط، والتفرّع الشرطي كعنصر من الدرجة الأولى، ووضع تشغيل تجريبي غير مدمّر، تفصل الأدلة التي تُستخدم عن الأدلة التي يُعاد كتابتها كل ربع.

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

ودليل التشغيل الذي لا يستوعب ذلك التباين ليس إلا سكربتًا، والسكربت الذي لا يمكن تعديله بأمان يصبح مسؤولية في اللحظة التي يبدأ فيها بلمس أنظمة الإنتاج. ولهذا تفقد كثير من مشاريع SOAR ثقة الفريق بهدوء بعد السنة الأولى.

يستعرض هذا المقال القرارات التصميمية الأربعة التي تحدد ما إذا كان دليل التشغيل سيصمد أمام حركة حقيقية أم سينتهي متجاوَزًا. وهي مستخلصة من بناء مصمم أدلة التشغيل في Krasper Suite. والمعالجة تقنية والأمثلة ملموسة عمدًا.

المحتويات

  1. لماذا تتحلل معظم أدلة التشغيل
  2. تدفق البيانات التفاعلي: لماذا يهم المحرر
  3. عقد العُقدة: منافذ مُنمّطة وأنماط فشل صريحة
  4. التفرّع الشرطي كعنصر من الدرجة الأولى
  5. مثال مُنفَّذ: الاستجابة للتصيّد من الطرف إلى الطرف
  6. آليات التشغيل التجريبي: اختبار بلا نطاق ضرر
  7. ما الذي يتغيّر حين تمتلك الأربعة كلها

1. لماذا تتحلل معظم أدلة التشغيل

نمط التحلل متسق عبر المؤسسات. فيُؤلَّف دليل التشغيل مقابل نموذج ذهني نظيف للحادث. ويعمل جيدًا في العرض التوضيحي، وجيدًا في الأسبوع الأول، وجيدًا على الحوادث التي تشبه ما كان في ذهن المؤلف.

ثم تبدأ التباينات بالوصول.

محلل ترويسات البريد كُتب لبوابة البريد السحابية فينكسر على الجهاز داخل المقر. وإثراء تحويل عنوان IP إلى أصل يعيد unknown للأحمال السحابية. وخطوة الاحتواء تفترض أن عزل نقطة النهاية يعمل، وهو كذلك، إلى أن يكون الجهاز غير متصل. وخطوة الإخطار تفترض أن المستجيب في القناة تحت الطلب، وهو ليس كذلك الساعة الثالثة فجر السبت.

وكل تباين ينتج استثناء. وتتراكم الاستثناءات كمنطق شرطي ملحق، عميق التداخل، متزايد الاستعصاء على المراجعة. وبعد ستة أشهر يصبح دليل التشغيل ملف YAML بطول ألفي سطر يفهمه مهندس واحد ويتردد في تعديله. ويبدأ الفريق بالالتفاف عليه.

والسبب الجذري نادرًا ما يكون المنطق نفسه، بل التمثيل. فدليل تشغيل مُمثَّل كسكربت خطي بشروط متنامية هو تمثيل يقاوم تطوره الخاص. أما دليل تشغيل مُمثَّل كرسم بياني موجّه مُنمّط بتدفق بيانات تفاعلي فلا يفعل.

2. تدفق البيانات التفاعلي: لماذا يهم المحرر

كثيرًا ما يُستخف بالمحرر البصري كتحسين شكلي في تجربة المستخدم. وهو ليس كذلك. بل هو أداة تفرض نموذج تدفق بيانات محددًا لا تفرضه السكربتات الخطية.

ففي محرر رسوم بيانية تفاعلي، تعلن كل عقدة مدخلاتها ومخرجاتها كمنافذ مسمّاة ومُنمّطة. والوصلات بين العُقَد صريحة. وتمشي بيئة التشغيل على الرسم البياني، وتقيّم عقدة حين تُستوفى كل مدخلاتها، وتنشر المخرجات إلى العُقَد اللاحقة. فلا حالة خفية؛ الرسم البياني هو البرنامج.

┌──────────────┐       ┌──────────────────┐       ┌──────────────┐
│  Alert       │       │  Enrich asset    │       │  Severity    │
│  ingress     ├──────▶│                  ├──────▶│  classifier  │
│              │       │  in: ip          │       │              │
│  out: alert  │       │  out: asset      │       │  out: level  │
└──────────────┘       └──────────────────┘       └──────┬───────┘
                                                            │
                          ┌─────────────────────────────────┴───┐
                          │                                     │
                          ▼                                     ▼
                   ┌────────────┐                       ┌────────────┐
                   │  Contain   │                       │  Notify    │
                   │  (high)    │                       │  (medium)  │
                   └────────────┘                       └────────────┘
رسم بياني تفاعلي للعُقَد: منافذ مُنمّطة وحواف صريحة

ما يمنحك إياه هذا التمثيل ولا يمنحه السكربت:

  • الرسم البياني هو العقد. يستطيع المراجع قراءته، ويستطيع مهندس مبتدئ تغيير عقدة واحدة دون فهم الكل.
  • الآثار الجانبية تبقى موضعية. فالعقدة التي تلمس الإنتاج شكل واحد قابل للتمييز على اللوحة؛ والعُقَد حولها تحويلات نقية.
  • تصبح المقارنة بنيوية. فالتغيير في الرسم البياني تغيير في مجموعة محددة من العُقَد والحواف، لا اضطراب في مسافات بادئة عبر سكربت من ألف سطر، فتصبح طلبات الدمج على أدلة التشغيل قابلة للمراجعة فعلًا.

والجزء التفاعلي يهم لأن المحرر يستطيع إظهار الحالة الراهنة للبيانات المتدفقة عبر كل منفذ بينما يبني المؤلف الدليل مقابل تنبيه عيّنة. فيرى المؤلف، في الزمن الفعلي، أي شكل سيكون عليه asset حين يصل إلى المصنِّف، لا الشكل الذي تدّعي الوثائق أنه سيكون عليه. ومعظم عيوب أدلة التشغيل تأتي من الانحراف بين أشكال البيانات الموثّقة والفعلية؛ والتغذية الراجعة التفاعلية تُلغي تلك الفجوة.

3. عقد العُقدة: منافذ مُنمّطة وأنماط فشل صريحة

استعارة الرسم البياني لا تشتري لك شيئًا إلا إن اتبعت العُقَد داخله عقدًا محكمًا. وعقد العُقدة لدينا له أربع خصائص مطلوبة.

الأولى، المدخلات والمخرجات مُنمّطة. فلكل منفذ مخطط معلن، وترفض بيئة التشغيل وصل منفذ يُخرج IpAddress بمنفذ يتوقع EmailMessage. يبدو ذلك بديهيًا، لكن نصف إخفاقات أدلة التشغيل التي رأيناها في التدقيقات يعود إلى عدم تطابق أنماط وقت التشغيل كان بإمكان المحرر التقاطه وقت التصميم.

الثانية، مخرجات الفشل صريحة. فكل عقدة تلمس نظامًا خارجيًا لها منفذ success ومنفذ error، ومنفذ الخطأ إلزامي: اتركه غير موصول ويَسِم المحرر العقدة بأنها ناقصة. ومن بين كل الخيارات هنا، هذا الخيار منع أكبر عدد من حوادث الإنتاج، لأنه يجبر المؤلف على مواجهة المسار غير السعيد وقت التصميم لا بعد أول استدعاء في الثانية فجرًا.

الثالثة، العُقَد لا تكرارية افتراضيًا. فعُقَد الأثر الجانبي تحمل مفتاح عدم تكرار مولّدًا تلقائيًا مشتقًا من معرّف تنفيذ الدليل ومعرّف العقدة، فإعادة تشغيل التنفيذ نفسه مقابل العقدة نفسها يزيل التكرار عند مستوى بيئة التشغيل. ولا يحتاج المؤلفون للتفكير في ذلك أبدًا؛ فالمنصة تضمنه.

الرابعة، المهل حتمية. فكل استدعاء خارجي يعلن مهلة، والعقدة التي تتجاوزها تُوجَّه إلى منفذ الخطأ بدل تعليق التنفيذ. فلا توجد حالة «عالق في انتظار واجهة كشف نقاط النهاية إلى الأبد»، لأن بيئة التشغيل تقتل العقدة قبل حدوث ذلك.

والعقدة التي تستوفي الخصائص الأربع تتركّب بنظافة. أما التي لا تستوفي أيًا منها فهي بالضبط كيف تتحلل أدلة التشغيل.

4. التفرّع الشرطي كعنصر من الدرجة الأولى

عاملت معظم منتجات SOAR المبكرة الشروط كفكرة لاحقة: عقدة عليها تعبير «إذا»، ومخرج يُوجَّه إلى عقدة لاحقة واحدة. وهذا يعمل لفرع أو فرعين. وينهار على نطاق أوسع.

أما عنصر التفرّع من الدرجة الأولى فيبدو هكذا:

  • عقدة switch بعدد ن من المخرجات المعلنة، يحرس كلًا منها مسند مُنمّط على المدخلات.
  • تقيّم بيئة التشغيل المسانِد بالترتيب المعلن، وتوجّه إلى أول تطابق، وتوقف الباقي.
  • مخرج default مطلوب يلتقط كل ما لا يطابق أي مسند. ويرفض المحرر حفظ الدليل بدونه.
  • منافذ مخرجات المفتاح تحمل أنماطًا مُضيَّقة: فبعد فرع «التنبيه من بوابة البريد السحابية»، يضيق نمط المنفذ alert إلى CloudMailAlert، ولا ترى العُقَد اللاحقة إلا الحقول التي يمكنها الاعتماد عليها.
┌────────────────────────────┐
 │  switch on alert.source    │
 │                            │
 │  case cloud_mail  ────────┼──▶ cloud-mail subgraph
 │  case onprem_mail ────────┼──▶ onprem subgraph
 │  case api_gateway ────────┼──▶ api subgraph
 │  default          ────────┼──▶ unknown-source handler
 └────────────────────────────┘
عقدة مفتاح بمخرج افتراضي مطلوب ومخرجات مُضيَّقة النمط

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

وفرع default ليس اختياريًا لسبب. فالحالات غير المعالَجة في الإنتاج الساعة الثالثة فجرًا لا تنتج قيمة. فإما أن يقرر الدليل ما يفعله، أو يصعّد صراحة إلى إنسان. وكلاهما مقبول؛ أما السقوط الصامت فلا.

5. مثال مُنفَّذ: الاستجابة للتصيّد من الطرف إلى الطرف

التصيّد هو المثال المعياري لأن كل مركز عمليات أمنية يشغّله ولأن مساحة التباين فيه واسعة. وهيكل دليل تشغيل حقيقي يبدو هكذا:

[Alert ingress: mail-security signal]
        │
        ▼
[Parse headers + extract URLs/attachments]
        │
        ▼
[Enrich: sender reputation, domain age, URL reputation]
        │
        ▼
[switch: phishing_confidence]
   ├── high   → [Quarantine mail across all mailboxes]
   │              │
   │              ▼
   │           [Identify all recipients] ── for each ──▶
   │              ├── [User in privileged group?] ── yes ──▶ [Force password reset]
   │              │                                 └── no  ──▶ [Notify user via approved channel]
   │              ▼
   │           [Endpoint check: any URL clicked?] ── yes ──▶ [Isolate endpoint + open IR ticket]
   │
   ├── medium → [Quarantine for sender, flag for analyst review]
   │
   ├── low    → [Tag for trend analysis, no user impact]
   │
   └── default → [Hold for analyst, no automatic action]
دليل تشغيل الاستجابة للتصيّد: الهيكل

أمور تستحق الملاحظة في هذا الشكل.

خطوة الإثراء عقدة واحدة لا ثلاث؛ فالمنصة تتولى التوزيع المتوازي داخليًا. ولا يكتب المؤلف شيفرة تزامن؛ بل يعلن أن المصنِّف يحتاج إلى sender_reputation وdomain_age وurl_reputation، وتحل بيئة التشغيل الاعتماديات بالتوازي حيثما استطاعت.

وحلقة «لكل مستلم» عقدة مكرِّر واحدة مع رسم فرعي ملحق. والرسم الفرعي بحد ذاته قابل للمراجعة والمقارنة والاختبار منفصلًا. ولا يكتب المؤلف حلقات؛ بل يعلن «هذا الرسم الفرعي يعمل مرة لكل مستلم».

وفحص المستخدم المميّز مفتاح بنتيجتين، وكلتاهما معالَجة صراحة. فلا سقوط ضمني يحصل فيه مستخدم مميّز على مسار الإخطار القياسي بالخطأ.

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

6. آليات التشغيل التجريبي: اختبار بلا نطاق ضرر

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

فالتشغيل التجريبي ينفّذ الرسم البياني كاملًا مقابل تنبيه حقيقي أو معاين، ويمشي على كل عقدة، ويقيّم كل مسند، وينشر كل قيمة، لكنه لا يستدعي واجهات الآثار الجانبية. فالعُقَد التي كانت ستحجر البريد أو تعزل نقاط النهاية أو تفرض إعادة تعيين كلمات المرور أو تفتح تذاكر تُصدر بدلًا من ذلك سجلًا بما كانت ستفعله وتمرّ عبر مخرج نجاح اصطناعي.

ونمط التنفيذ مباشر: كل مهايئ أثر جانبي يفحص راية execution_mode عند الدخول. ففي وضع live يستدعي الواجهة الأعلى. وفي وضع dry_run يعيد استجابة اصطناعية حتمية تطابق مخطط نجاح حقيقي، ويسجّل الاستدعاء المقصود في أثر التنفيذ.

text
┌────────────────────────────────────┐
│ Side-effect adapter                │
│                                    │
│ if mode == "dry_run":              │
│   record_intended_call(args)       │
│   return synthetic_success(args)   │
│                                    │
│ else:                              │
│   call_real_api(args)              │
└────────────────────────────────────┘
مهايئ الأثر الجانبي: نقطة دخول واعية بالوضع

والفوائد تتراكم:

  • يستطيع المؤلفون تشغيل دليل مقابل تنبيه تصيّد حقيقي من الأسبوع الماضي ورؤية أثر التنفيذ الكامل قبل دفع التغيير.
  • يستطيع مسار التكامل المستمر إعادة تشغيل مجموعة تنبيهات تاريخية مقابل الدليل الجديد عند كل تغيير، وإفشال البناء إن انحرف أي تنفيذ عن الإصدار السابق بطرق غير متوقعة.
  • تستطيع مراجعات ما بعد الحادث إعادة تشغيل التنبيه نفسه مقابل الدليل الحالي للتأكد من أن الإصلاح يعمل.

وثمة انضباط تصميمي واحد مطلوب: سلامة التشغيل التجريبي ضمانة على مستوى المنصة لا على مستوى كل عقدة. فكل مهايئ أثر جانبي يُشحن يجب أن يحترم راية الوضع، وتفرض بيئة التشغيل ذلك عند حدود المهايئ لا وفق تقدير المؤلف. فمهايئ واحد يتجاهل التشغيل التجريبي ويستدعي الإنتاج بهدوء يحوّل الوضع كله إلى مسؤولية. وتتحقق مجموعات اختبار المهايئات من كلا الوضعين في كل إصدار.

7. ما الذي يتغيّر حين تمتلك الأربعة كلها

تدفق البيانات التفاعلي، وعقد العُقَد المُنمّط، والتفرّع من الدرجة الأولى، والتشغيل التجريبي، كل منها يساعد وحده، لكنها مجتمعة تغيّر الصورة. ويظهر التحوّل في موضعين يمكن قياسهما فعلًا.

الأول متوسط زمن الاستجابة. فحين يعالج الدليل التباين أصلًا، تختفي ببساطة خطوات التسليم اليدوي التي كانت تعيق التنفيذ. ولدليل تصيّد بالشكل أعلاه، ما نراه عادةً عبر بيئات التشغيل أن الجزء القابل للأتمتة من الفرز يهبط من عشرات الدقائق حين يقوده إنسان إلى ثوانٍ حين يعمل من الطرف إلى الطرف، لأن المحلل لم يعد مضطرًا لاتخاذ قرار التصنيف الأولي يدويًا. أما الوقت البشري المتبقي فيتركز على الحالات الغامضة فعلًا التي يصعّدها الدليل عمدًا، وهي حيث ينبغي أن يكون انتباه المحلل أصلًا.

والثاني متوسط زمن التغيير، وهو المقياس الذي تنسى معظم الفرق قياسه أصلًا. فدليل يستغرق تعديله بأمان أسبوعًا هو دليل يتجنب الفريق تعديله بهدوء. ومع التشغيل التجريبي والمقارنات البنيوية، تتقلص تلك الحلقة عادةً من أيام إلى أقل من ساعة: عدّل الرسم، وشغّله تجريبيًا مقابل مجموعة تنبيهات، وراجع المقارنة البنيوية، واشحن. والنتيجة أن الدليل يجاري كيفية تطور الهجمات فعلًا بدل أن يتخلف عنها أكثر.

والأرقام تعتمد بشدة على خط الأساس وعلى مدى جودة تكامل المنظومة المحيطة. ومن يقتبس مضاعفًا واحدًا قبل/بعد يبيع شريحة عرض لا يقيس نتيجة. وعبر البيئات التي رصدناها، يبقى الاتجاه ثابتًا وإن لم يبقَ حجم الأثر كذلك.

خاتمة

منتج SOAR يحيا أو يموت بـركيزة التأليف فيه، لا بأدلة التشغيل التي يُشحن بها: فالمحرر، وعقد العُقَد، وعناصر التفرّع، وضمانة التشغيل التجريبي هي ما يهم فعلًا. وأدلة التشغيل ليست إلا كيفية استخدام تلك الركيزة.

فإن كانت الركيزة سليمة، تطورت الأدلة. وإن لم تكن، تحجّرت الأدلة، والتف الفريق حولها، وتوقف الاستثمار بهدوء عن إعادة القيمة.

ينزل المقال التالي في هذه السلسلة طبقة أعمق، إلى بيئة التشغيل نفسها: كيف تُحفَظ التنفيذات، وكيف تُستعاد حالات الفشل الجزئي، ولماذا يكون سجل التنفيذ أهم مخرج تدقيقي تنتجه المنصة.

قراءات إضافية

  • NIST SP 800-61r3: دليل التعامل مع حوادث أمن الحاسوب
  • MITRE D3FEND: إطار الكشف والمنع والتعطيل
  • Eric Evans: Domain-Driven Design، الفصل الخاص بالواجهات الكاشفة عن النية

هل أنت مستعد لتأمين
بنيتك المؤسسية؟

احجز جلسة إحاطة تقنية. بلا عروض بيع، فقط مهندسون وفريقك.