الأدلة التقنية

OWASP SAMM: كيف تقيس نضج أمن تطبيقاتك وتحسنه

كيف تعرف أين يقف أمن التطبيقات في فريقك بنموذج OWASP SAMM، ثم تحول نتيجة التقييم إلى خطة تحسين على مراحل.

OWASP SAMM: كيف تقيس نضج أمن تطبيقاتك وتحسنه

لنفرض أن مدير الشركة دخل عليك صباحاً وسألك سؤالاً واحداً: «هل نحن آمنون؟»، وأنت تعرف أن الفريق يشغل فحص الأسرار وSAST في خط CI/CD منذ أشهر، وأن هناك اختبار اختراق Penetration Test تم قبل سنة، وأن أحد المطورين يهتم بالأمن أكثر من غيره. فماذا تقول له؟ إذا قلت «نعم» فأنت لا تملك ما يثبتها، وإذا قلت «لا» فهو سوف يسألك «إذن ماذا نشتري؟»، والحقيقة أن السؤال نفسه خطأ، لأن الأمن ليس مفتاحاً يكون مفتوحاً أو مغلقاً، وإنما مجموعة عادات في الفريق بعضها موجود وبعضها ناقص وبعضها نصف موجود، والسؤال الصحيح هو «أين نحن اليوم، وما الخطوة التالية؟».

وهذا هو بالضبط ما تفعله نماذج النضج Maturity Models، ففي مقال ما هي OWASP؟ ذكرنا نموذج SAMM في فقرة واحدة، وفي هذا المقال سوف نشرحه بالتفصيل، ونعبئ ملف التقييم الرسمي فعلاً لشركة تخيلية، ونرى كيف تحسب الدرجات، ثم نحولها إلى خطة. وسوف نناقش في هذا المقال ما يلي:

  • لماذا لا يجيب شراء الأدوات عن سؤال «هل نحن آمنون؟»، وما المشكلة التي يحلها نموذج النضج.
  • ما هو نموذج النضج، والفرق بين SAMM الذي يقيس البرنامج وASVS الذي يقيس التطبيق، والبدائل BSIMM وDSOMM.
  • هيكل OWASP SAMM v2: الوظائف الخمس والممارسات الخمس عشرة والمسارات الثلاثون والمستويات الثلاثة، وكل ممارسة في جملة مع مثال لكل مستوى.
  • كيف تحسب الدرجة بالضبط من معادلات ملف التقييم الرسمي SAMM Toolbox.
  • كيف تجري التقييم: النطاق، ومن يحضر، والمقابلات، والأدلة، والصدق في الإجابة.
  • مثال عملي حقيقي: نعبئ ملف SAMM v2.2.0 الرسمي لشركة SaaS تخيلية من 15 شخصاً، ونقرأ الدرجات التي حسبها الملف نفسه.
  • من الدرجة إلى خطة تحسين على مراحل، مربوطة بمقالات الموقع وبضوابط دليل ضوابط أمن التطبيقات، مع قالب جاهز للنسخ.

لماذا لا يجيب شراء الأدوات عن سؤال «هل نحن آمنون؟»

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

على اليمين لوحة حمراء عنوانها الحل البسيط: نشتري أداة أخرى، فيها ست بطاقات متفرقة لأدوات SAST وDAST وSCA وWAF وSecrets Scan وPentest لا يربطها شيء، وشخص يسأل هل نحن آمنون؟ Are we secure? وبجانبه علامة استفهام حمراء، وتحتها أربع نتائج: مئات النتائج ولا أحد يملك القرار، ولا توجد متطلبات ولا نمذجة تهديدات، ولا أحد يعرف ماذا نفعل بعد الحادثة، والميزانية القادمة تذهب إلى أداة سابعة. وعلى اليسار لوحة خضراء عنوانها الطريقة الصحيحة: نموذج نضج Maturity Model، فيها أربعة أعمدة متصاعدة للمستويات 0 و1 و2 و3، ودبوس أحمر عند المستوى 0 تقريباً مكتوب تحته أين نحن اليوم، وسهم منقط إلى هدف أخضر عند المستوى 2 مكتوب فوقه الهدف بحسب المخاطر والخطوة التالية Next Step، وفي الأسفل جملة الأداة تصبح نشاطاً Activity داخل خطة، وليست الخطة نفسها.
الأدوات تجد المشكلات، أما ترتيب ما ينقص فيحتاج خريطة

في الصورة أعلاه لاحظ التالي:

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

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

ما هو نموذج النضج Maturity Model؟

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

وأشهر نماذج النضج في عالم البرمجيات هو CMMI، وفيه خمسة مستويات نضج Maturity Levels من المستوى 1 «Initial» إلى المستوى 5 «Optimizing»، ويعطي المؤسسة كلها رقماً واحداً. أما SAMM فيعمل بطريقة مختلفة: لا يوجد فيه رقم واحد للمؤسسة يحكم عليها، وإنما درجة لكل ممارسة من خمس عشرة ممارسة بين 0 و3، فقد تكون في المستوى 2 في البناء الآمن وفي المستوى 0 في نمذجة التهديدات في الوقت نفسه، وهذا أقرب للواقع، لأن الفرق الحقيقية لا تنضج في كل شيء بالسرعة نفسها.

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

SAMM يقيس المصنع، وASVS يقيس المنتج

في مقال متطلبات الأمان ومراجعة الكود مع OWASP ASVS رأينا أن ASVS يسأل عن تطبيق محدد: «هل هذا التطبيق يحقق المتطلب v5.0.0-8.2.2؟»، أما SAMM فيسأل عن الفريق أو المؤسسة: «هل لديكم عادة ثابتة لكتابة متطلبات أمان لكل تطبيق، وهل تختبرونها؟». والجدول التالي يلخص الفرق:

السؤالOWASP ASVSOWASP SAMM
ماذا يقيس؟تطبيقاً واحداً (المنتج)برنامج الأمن في فريق أو مؤسسة (المصنع)
شكل الإجابةكل متطلب ينجح أو يفشل Pass/Failدرجة بين 0 و3 لكل ممارسة، مع إجابات جزئية
من يستخدمه؟المطور والمختبر ومراجع الكودقائد الفريق ومسؤول الأمن والإدارة
متى؟في كل ميزة وكل طلب دمج Pull Requestمرة كل 6 إلى 12 شهراً، ثم خطة
المخرجقائمة متطلبات واختبارات للتطبيقخريطة نضج وخطة تحسين Roadmap

ولاحظ أن الاثنين يعملان معاً، فممارسة «متطلبات الأمان Security Requirements» في SAMM تسألك هل تكتب الفرق متطلبات أمان، وASVS هو أحد أفضل المصادر لكتابتها، فإذا رفعت درجتك في هذه الممارسة فغالب الظن أنك فعلت ذلك باستخدام ASVS.

البدائل: BSIMM يصف ما تفعله الشركات، وDSOMM يركز على DevSecOps

هناك نموذجان آخران سوف تقابلهما، والفرق الأهم بينهما وبين SAMM هو الفرق بين النموذج التوجيهي Prescriptive والنموذج الوصفي Descriptive:

  • OWASP SAMM (توجيهي): كتبه مختصون ويقول لك ما الذي يجب أن تفعله في كل مستوى، وهو مفتوح بترخيص CC BY-SA 4.0 كما تقول الصفحة الرئيسية للمشروع ومستودعه على GitHub، وأصله نموذج OpenSAMM 1.0 الذي كتبه Pravir Chandra في 2009 بحسب ملاحظات إصدار SAMM v2.
  • BSIMM (وصفي): نموذج تنشره شركة Black Duck، ويصف ما تفعله الشركات المشاركة فعلاً بدلاً من أن يقول لك ما يجب، والإصدار الحالي BSIMM16 نشر في يناير 2026 وبني على تحليل 111 مؤسسة، وفيه 128 نشاطاً في 12 ممارسة وأربعة مجالات Domains هي Governance وIntelligence وSSDL Touchpoints وDeployment، بحسب صفحة التقرير. ونقطة قوته المقارنة مع شركات حقيقية، ولكن «ما تفعله الشركات الكبيرة» ليس بالضرورة ما يناسب فريقاً من خمسة عشر شخصاً، والتقرير يحمل من موقع الشركة بعد تعبئة نموذج تسجيل، ولم نجد في الصفحة ترخيصاً مفتوحاً مثل ترخيص SAMM.
  • OWASP DSOMM (توجيهي، لخط DevOps): نموذج نضج DevSecOps Maturity Model، وهو مشروع OWASP بتصنيف Lab بحسب صفحة المشروع، ويقسم الأنشطة إلى أبعاد Dimensions مثل البناء والنشر Build and Deployment والثقافة والتنظيم Culture and Organization والاختبار والتحقق Test and Verification، وفي خمسة مستويات، ولكل نشاط ربط بممارسات SAMM، وتطبيقه في dsomm.owasp.org، وآخر إصدار لبيانات النموذج v5.1.0 في مستودع البيانات. وهو مفيد عندما تريد تفاصيل أدق داخل خط CI/CD، ولكنه لا يغطي الحوكمة والتشغيل بعمق SAMM.

والخلاصة العملية أن تبدأ بـ SAMM لأنه مفتوح ومجاني ويغطي البرنامج كله من الحوكمة إلى التشغيل، ثم تستخدم DSOMM إذا أردت تفاصيل أكثر في جزء DevSecOps، وتقرأ تقرير BSIMM إذا أردت أن تعرف ما تفعله الشركات الأخرى، وكل ما يلي في هذا المقال عن SAMM.

هيكل النموذج: الوظائف Business Functions والممارسات Practices والمسارات Streams

الإصدار الحالي من النموذج هو SAMM v2، وقد صدر في 31 يناير 2020 بحسب الأسئلة الشائعة، وهو يحدث على دفعات صغيرة، فآخر إصدار في المستودع هو v2.2.0 المنشور في 6 يوليو 2026، وقبله v2.1.0 في سبتمبر 2024، والتغييرات في v2.2.0 صغيرة: تحسين صياغة النصوص، وتعديل بعض مجموعات الإجابات، وإضافة العلاقات بين الأنشطة، أما الهيكل فهو نفسه. والصورة التالية تبين الهيكل كما في ملفات YAML للنموذج:

خمسة أعمدة ملونة من اليمين إلى اليسار: الحوكمة Governance بالأزرق الداكن، والتصميم Design بالبرتقالي، والتنفيذ Implementation بالأخضر، والتحقق Verification بالعنابي، والتشغيل Operations بالرمادي. في كل عمود ثلاث بطاقات ممارسات، وفي كل بطاقة مساران A وB. الحوكمة: Strategy and Metrics بمساري Create and Promote وMeasure and Improve، وPolicy and Compliance بمساري Policy and Standards وCompliance Management، وEducation and Guidance بمساري Training and Awareness وOrganization and Culture. التصميم: Threat Assessment بمساري Application Risk Profile وThreat Modeling، وSecurity Requirements بمساري Software Requirements وSupplier Security، وSecure Architecture بمساري Architecture Design وTechnology Management. التنفيذ: Secure Build بمساري Build Process وSoftware Dependencies، وSecure Deployment بمساري Deployment Process وSecret Management، وDefect Management بمساري Defect Tracking وMetrics and Feedback. التحقق: Architecture Assessment بمساري Architecture Validation وArchitecture Mitigation، وRequirements-driven Testing بمساري Control Verification وMisuse/Abuse Testing، وSecurity Testing بمساري Scalable Baseline وDeep Understanding. التشغيل: Incident Management بمساري Incident Detection وIncident Response، وEnvironment Management بمساري Configuration Hardening وPatching and Updating، وOperational Management بمساري Data Protection وDecommissioning / Legacy. وفي الأسفل: في كل مسار Stream ثلاثة أنشطة Activities للمستويات 1 و2 و3، أي 90 نشاطاً و90 سؤالاً.
5 وظائف × 3 ممارسات × 2 مسار × 3 مستويات = 90 نشاطاً، ولكل نشاط سؤال واحد في التقييم

في الهيكل أعلاه لاحظ التالي:

  • الوظيفة Business Function: مجموعة كبيرة من عمل تطوير البرمجيات، وهي خمس: الحوكمة Governance (كيف تدير المؤسسة برنامج الأمن)، والتصميم Design (المتطلبات والمعمارية قبل الكود)، والتنفيذ Implementation (البناء والنشر وإدارة العيوب)، والتحقق Verification (الاختبار والمراجعة)، والتشغيل Operations (ما بعد الإطلاق).
  • الممارسة الأمنية Security Practice: ثلاث في كل وظيفة، أي خمس عشرة ممارسة، وهي الوحدة التي تأخذ درجة.
  • المسار Stream: في كل ممارسة مساران A وB، وكل مسار هدف واحد يكبر مع المستوى، فممارسة تقييم التهديدات Threat Assessment فيها مسار «ملف مخاطر التطبيق Application Risk Profile» ومسار «نمذجة التهديدات Threat Modeling».
  • النشاط Activity: في كل مسار نشاط لكل مستوى من الثلاثة، فيصبح المجموع 90 نشاطاً، ويقابل كل نشاط سؤال واحد في ملف التقييم، ويرمز للنشاط في ملفات النموذج برمز مثل D-TA-1-B، أي الوظيفة Design والممارسة Threat Assessment والمستوى 1 والمسار B.

الممارسات الخمس عشرة Security Practices في جملة واحدة لكل منها

الجدول التالي يشرح كل ممارسة في جملة، ومثالاً من أنشطتها في المستويات الثلاثة (من المسار A غالباً، وأسماء الأنشطة الأصلية في صفحة النموذج)، والمقال الذي يشرح الجانب العملي منها في الموقع:

الممارسةماذا تعني؟المستوى 1المستوى 2المستوى 3في الموقع
Strategy and Metrics الاستراتيجية والمقاييسخطة أمن مكتوبة تعرف شهية المؤسسة للمخاطر Risk Appetite وتقاس بالأرقامتحديد شهية المخاطراستراتيجية أمن مع ميزانية ومحطاتمراجعة الاستراتيجية مع استراتيجية العملالمخاطر Risk
Policy and Compliance السياسات والامتثالسياسات ومعايير داخلية، ومعرفة الالتزامات الخارجية مثل ضوابط الهيئةكتابة السياسات والمعاييرتحويلها إلى إجراءات اختبار يفهمها المطورقياس الالتزام بها وتقريرهNCA ECC
Education and Guidance التعليم والإرشادتدريب كل من يلمس الكود، وثقافة أمن داخل الفرقتوعية للجميع، وسفير أمن لكل فريقتدريب بحسب الدور، ومركز خبرةنظام لتتبع التدريب، ومجتمع داخليسفير الأمن
Threat Assessment تقييم التهديداتمعرفة أي التطبيقات أخطر، وما الذي قد يسوء في تصميمهاتصنيف التطبيقات بحسب المخاطر، ونمذجة بسيطة بـ STRIDEملفات مخاطر مركزية، وطريقة نمذجة موحدةمراجعة دورية وتحسين الطريقةنمذجة التهديدات
Security Requirements متطلبات الأمانمتطلبات أمان مكتوبة للبرنامج، ومتطلبات للموردين Suppliersالفرق تكتب متطلبات أمانمتطلبات موحدة ومرتبة بالأولويةإطار متطلبات تستخدمه كل الفرقASVS
Secure Architecture المعمارية الآمنةمبادئ تصميم آمن، وتقنيات معتمدة يعرف الجميع مخاطرهاقائمة مبادئ أمن في التصميمخدمات أمن مشتركة مثل مزود الهويةمعماريات مرجعية Reference Architecturesالنطاق 02
Secure Build البناء الآمنبناء متكرر ومؤتمت، ومعرفة الاعتماديات Dependencies التي تبني عليهاتوثيق البناء، وقائمة الاعتماديات BOMبناء مؤتمت بالكامل، ومراجعة الاعتمادياتالبناء يفشل عند تجاوز خط الأمانسلسلة التوريد
Secure Deployment النشر الآمننشر متكرر بصلاحيات محددة، وأسرار لا يراها المطوروننشر موثق، وأسرار الإنتاج محميةنشر مؤتمت بفحوص أمنية، وحقن الأسرار عند النشرالتحقق من توقيع ما ينشر، ودورة حياة للأسرارفحص الأسرار
Defect Management إدارة العيوب الأمنيةكل ثغرة مسجلة في مكان واحد ولها خطورة وموعد إصلاحتتبع مركزي للعيوب الأمنيةمقياس خطورة واحد ومواعيد SLAفرض المواعيد آلياً وربطها بإدارة المخاطرفرز النتائج
Architecture Assessment تقييم المعماريةمراجعة المعمارية نفسها ضد الأهداف الأمنية والتهديدات المعروفةمراجعة عند الحاجةمراجعة منهجية لكل واجهةقياس فعالية الضوابط الأمنيةالمراجعة Validation
Requirements-driven Testing الاختبار من المتطلباتاختبارات إيجابية تثبت الضوابط، واختبارات إساءة Abuse Cases وفحص بالعشوائية Fuzzingاختبار ضوابط المصادقة والصلاحياتاختبارات مكتوبة من المتطلباتاختبارات انحدار Regression أمنية آليةأنواع الاختبارات
Security Testing الاختبار الأمنيفحص آلي على كل تطبيق، واختبار يدوي للأجزاء عالية المخاطرأدوات فحص آليةضبط الأدوات لتطبيقاتك، واختبار اختراق دوريالفحص داخل خط التسليم ولوحة واحدةSAST وDAST
Incident Management إدارة الحوادثاكتشاف الحادثة من السجلات، والاستجابة لها بخطةتحليل السجلات دورياً، وشخص مسؤول عن الحوادثعملية موثقة للاكتشاف والاستجابةفريق استجابة وتحليل السبب الأساسي Root CauseDFIR وسجل التدقيق
Environment Management إدارة البيئةتحصين Hardening الإعدادات، وتحديث المكونات في وقتهاتحصين المكونات الأساسية، وتحديث بأفضل جهدخطوط أساس Baselines لكل مكون، وعملية تحديثمراقبة مستمرة للالتزام، وتحديث بمواعيدتأمين VPS
Operational Management الإدارة التشغيليةحماية البيانات بحسب حساسيتها، وإيقاف الأنظمة القديمة بشكل منظممعرفة البيانات في كل تطبيق، وإزالة ما لا يستخدمفهرس للبيانات Data Catalog، وعملية إيقاف رسميةمراجعة دورية لحالة كل نظام وبياناتهالنطاق 06

مستويات النضج الثلاثة Maturity Levels: من البداية إلى التحسين المستمر

يصف النموذج في ملفات maturity_levels المستويات الثلاثة كما يلي: المستوى 1 تطبيق مؤقت بأفضل جهد ad-hoc، والمستوى 2 عملية ثابتة قابلة للتكرار يمكن الاعتماد عليها، والمستوى 3 تعظيم الفعالية بالتحسين المستمر بناء على تغذية راجعة فعالة وفي وقتها، والمستوى 0 يعني أن النشاط غير موجود. والصورة التالية تبين المستويات على مسار نمذجة التهديدات:

درج من أربع درجات برتقالية تصعد من اليمين إلى اليسار تحت شريط Design › Threat Assessment › Stream B · Threat Modeling. الدرجة 0 رمادية: النشاط غير موجود، رسم عابر لا يحفظ. الدرجة 1: بداية بأفضل جهد ad-hoc, best effort، والنشاط Perform basic threat modeling: نمذجة للتطبيقات عالية المخاطر فقط بقائمة بسيطة مثل STRIDE ونحفظ النتيجة للرجوع إليها. الدرجة 2: عملية ثابتة تتكرر consistent, repeatable، والنشاط Standardize and scale threat modeling: طريقة موحدة بحسب مستوى المخاطر، وتدريب المعماريين وسفراء الأمن، وأي تغيير في التطبيق يعيد النموذج. الدرجة 3: تحسين مستمر continuous improvement، والنشاط Optimize threat modeling: مراجعة الطريقة نفسها من التغذية الراجعة، ومراجعة النماذج القائمة سنوياً، وأتمتة أجزاء منها بالأدوات.
المستوى ليس شهادة، وإنما وصف لمدى ثبات العادة في الفريق

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

كيف تحسب الدرجة Score بالضبط؟

الإجابة في SAMM v2 ليست «نعم» أو «لا»، فلكل سؤال أربع إجابات لها قيم 0 و0.25 و0.5 و1، ونص الإجابة يختلف بحسب السؤال، فأغلب الأسئلة إجاباتها «No» و«Yes, for some applications» و«Yes, for at least half of the applications» و«Yes, for most or all of the applications»، وبعضها يسأل عن المكونات أو الحوادث أو الوقت أو المؤسسة. وتحت كل سؤال معايير جودة Quality Criteria، وتقول صفحة التقييم إن المعايير إذا لم تتحقق بالكامل فالإجابة «No»، وإذا تحققت تختار من الإجابات الأخرى بحسب التغطية. وقد قرأنا معادلات ملف التقييم الرسمي نفسه، والصورة التالية تبين الخطوات:

أربع خطوات من اليمين إلى اليسار. الخطوة 1 كل إجابة لها قيمة: No تساوي 0، وYes, for some تساوي 0.25، وYes, at least half تساوي 0.5، وYes, most or all تساوي 1. الخطوة 2 متوسط المسارين في كل مستوى لممارسة Secure Build بإجابات تخيلية: المستوى 1 المسار A يساوي 1 والمسار B يساوي 0.5 والمتوسط 0.75، والمستوى 2 المسار A يساوي 1 والمسار B يساوي 0.25 والمتوسط 0.625، والمستوى 3 صفر. الخطوة 3 نجمع المستويات: 0.75 + 0.625 + 0 = 1.375. الخطوة 4 المتوسطات: Secure Build 1.375 وSecure Deployment 1.25 وDefect Management 0.25 تعطي Implementation 0.96، والدرجة الكلية متوسط الوظائف الخمس. وفي الأسفل: الدرجة بين 0 و3 لكل ممارسة، ومستوى أعلى يدخل في المجموع حتى لو لم يكتمل المستوى الذي قبله.
متوسط المسارين لكل مستوى، ثم مجموع المستويات، ثم متوسط الممارسات للوظيفة

في الحساب أعلاه لاحظ التالي:

  • درجة المستوى متوسط المسارين: في ورقة Interview تحسب الخلية لكل مستوى بالمعادلة AVERAGE لإجابة المسار A وإجابة المسار B في المستوى نفسه.
  • درجة الممارسة مجموع المستويات: عمود التقييم Rating هو SUM للمستويات الثلاثة، فتكون الدرجة بين 0 و3، ولهذا يمكن أن تأخذ درجة من المستوى 2 دون أن تكمل المستوى 1.
  • درجة الوظيفة والدرجة الكلية متوسطات: في ورقة Scorecard درجة الوظيفة AVERAGE لممارساتها الثلاث، والدرجة الكلية Overall متوسط الوظائف الخمس.

وقد يتساءل البعض: هل الدرجة 1.375 تعني «المستوى 1»؟ والإجابة لا بالضبط، فهي تعني أن ثلاثة أرباع أنشطة المستوى 1 موجودة وأكثر من نصف المستوى 2، لذلك اقرأ الأعمدة L1 وL2 وL3 مع الدرجة دائماً ولا تكتف بالرقم وحده، والسبب أن الرقم 1.0 قد يأتي من مستوى 1 كامل، وقد يأتي من نصف المستوى 1 ونصف المستوى 2، والخطة في الحالتين مختلفة.

ملف التقييم الرسمي SAMM Toolbox والأدوات الأخرى

تقول صفحة التقييم إن هناك نسختين من ملف التقييم SAMM Toolbox: نسخة Microsoft Excel ونسخة Google Spreadsheet، وإن هناك أداتين على الويب: SAMMwise وهي أداة تستضيفها بنفسك (مستودعها owaspsamm/sammwise بترخيص Apache-2.0، وآخر تحديث لكودها في مارس 2023)، وSAMMY وهي أداة تجارية من طرف ثالث هو شركة Codific أحد رعاة المشروع. ونسخة Excel تنشر مع كل إصدار في المستودع، فملف SAMM_spreadsheet.xlsx مرفق بإصدار v2.2.0، وقد قمنا بتنزيله وفتحه داخل Container من python:3.12-slim مع openpyxl 3.1.5 لنرى أوراقه:

curl -sLO https://github.com/owaspsamm/core/releases/download/v2.2.0/SAMM_spreadsheet.xlsx
docker run -d --name lab-samm-lo -v "$PWD:/w" python:3.12-slim sleep infinity
docker exec lab-samm-lo sh -c "apt-get update -qq && apt-get install -y -qq --no-install-recommends libreoffice-calc-nogui fonts-dejavu-core poppler-utils && pip install -q openpyxl==3.1.5"
docker exec lab-samm-lo sh -c "cd /w && python sheets.py 2>/dev/null"

والملف sheets.py يطبع رقم الإصدار والترخيص من الورقة الأولى، ثم أسماء الأوراق وحالتها:

import openpyxl
wb = openpyxl.load_workbook('/w/SAMM_spreadsheet.xlsx')
print(wb['Attribution and License']['B3'].value, '|', wb['Attribution and License']['B7'].value)
for ws in wb.worksheets:
    print(f'{ws.title:24} {ws.sheet_state}')

والمخرج سوف يكون كما يلي:

'v2.2.0 | Creative Commons Attribution-ShareAlike 4.0 License
Attribution and License  visible
Getting Started          visible
Benchmark                visible
Interview                visible
Scorecard                visible
Roadmap                  visible
Roadmap Chart            hidden
Lookups                  hidden
imp-questions            hidden
DV-Lists                 hidden
imp-answers              hidden
Background Images        hidden

في المخرج أعلاه لاحظ التالي:

  • Getting Started: ست خطوات: افهم النموذج، وحدد النطاق، وأجر المقابلة، وراجع النتيجة، وخطط، وشارك بياناتك في المقارنة Benchmark إذا أردت.
  • Interview: الورقة التي تعبئها، وفيها الأسئلة التسعون مرتبة بالوظائف والممارسات، وتحت كل سؤال معايير الجودة، وعمود الإجابة من قائمة منسدلة، وعمود ملاحظات المقابلة Interview Notes، ومربع التقييم Rating لكل ممارسة.
  • Scorecard: ورقة للقراءة فقط تحسب درجات الممارسات والوظائف تلقائياً، وفيها رسم بياني Radar.
  • Roadmap: تكتب فيها الإجابات المستهدفة في أربع مراحل Phase 1 إلى Phase 4، فيحسب الملف درجة كل مرحلة.
  • الأوراق المخفية: فيها الأسئلة ومجموعات الإجابات وقيمها، ولا تقم بتعديلها، لأن المعادلات تبحث فيها بالنص.
  • الترخيص: حقل الترخيص يقول CC BY-SA 4.0 مثل الموقع والمستودع، ولاحظ أن في الورقة نفسها سطراً قديماً متبقياً يذكر نص ترخيص 3.0، والمرجع هو حقل الترخيص وموقع المشروع. ولأن الترخيص يسمح بالمشاركة مع ذكر المصدر، فالصور التالية من الملف منشورة مع نسبتها إلى OWASP SAMM.
⚠️
ملف Toolbox أداة لحساب الدرجة، وتقول ورقة Getting Started فيه إنه لا يغني عن النموذج ولا يلخصه، فاقرأ وصف كل نشاط في صفحة النموذج قبل أن تجيب عن سؤاله، وإلا سوف تجيب عن الجملة وليس عن النشاط.

كيف تجري التقييم Assessment خطوة بخطوة؟

الصورة التالية تبين دورة التقييم كما يصفها دليل البداية السريعة Quick Start Guide ودليل التقييم Assessment Guide:

ست محطات من اليمين إلى اليسار بأسهم بينها. 1 Scope النطاق: فريق واحد، أو خط منتج، أو المؤسسة كلها، وابدأ صغيراً. 2 Interviews المقابلات: 3 إلى 5 جلسات، كل جلسة لوظيفة، ساعة ونصف إلى ساعتين. 3 Answers + Evidence الإجابات والأدلة: 90 سؤالاً، ومعيار جودة تحت كل سؤال، وملاحظة ورابط الدليل. 4 Scores الدرجات: ورقة Scorecard تحسب درجة كل ممارسة ووظيفة تلقائياً. 5 Targets الأهداف: بحسب المخاطر، وليس المستوى 3 في كل مكان. 6 Roadmap خطة على مراحل: 3 إلى 4 مراحل، لكل نشاط مسؤول وتاريخ. وسهم منقط برتقالي يعود من الخطة إلى النطاق مع جملة: نفذ الخطة، ثم أعد التقييم كل 6 إلى 12 شهراً، بالنطاق نفسه والأسئلة نفسها ومن يجري المقابلات نفسه إن أمكن، حتى تقارن الرقم بالرقم.
التقييم دورة تتكرر، والقيمة الحقيقية في المقارنة بين دورتين

الخطوة الأولى: حدد النطاق Scope

النطاق قد يكون تطبيقاً واحداً أو فريقاً أو خط منتج أو المؤسسة كلها، وصفحة تحديد النطاق واضحة في نصيحتها للتقييم الأول: ابدأ صغيراً بفريق متعاون يمثل بقية الفرق، والسبب أن البدء بالمؤسسة كلها منحنى تعلم صعب على الجميع. والقاعدة المهمة هنا أن كل من في النطاق يجب أن يعمل بالطريقة نفسها والإجراءات نفسها، فإذا كان لديك فريق يستخدم CI/CD كاملاً وفريق ينشر يدوياً، فهذان تقييمان وليسا تقييماً واحداً، لأن الإجابة «Yes, for some applications» سوف تخفي الفرق بينهما. واكتب النطاق والافتراضات والأشخاص في رأس الملف، لأنك سوف تعيد التقييم بعد أشهر وتحتاج أن تقيس الشيء نفسه.

الخطوة الثانية: من يحضر المقابلات من أصحاب العلاقة Stakeholders؟

تذكر الخطوة الأولى في الدليل الأطراف التالية: الراعي التنفيذي Executive Sponsor، وفريق الأمن، والمطورين، والمعماريين، وأصحاب العمل Business Owners، والمختبرين QA، والمديرين. وفي الفريق الصغير هذا يعني عملياً قائد التطوير Dev Lead، ومن يدير السيرفرات والنشر Ops، ومن يهتم بالأمن أو سفير الأمن، وصاحب المنتج Product Owner لأنه يعرف الالتزامات تجاه العملاء. ولا تقم بتوزيع الأسئلة التسعين على الجميع، فدليل إجراء المقابلات يقترح من 3 إلى 5 مقابلات، كل منها ساعة ونصف إلى ساعتين، وكل مقابلة لوظيفة أو موضوع، مع مجموعة صغيرة من الناس، لأن الناس يتحدثون بصراحة أكثر في المجموعات الصغيرة.

الخطوة الثالثة: المقابلة Interview وليس الاستبيان

يفرق دليل التقييم بين التقييم الذاتي Self-assessment والتقييم بخبير مستقل Expert Assessment، وبين الاستبيان Questionnaire والمقابلة، ويقول إن الاستبيان بتسعين سؤالاً قد يكون مرهقاً وتفسيره يختلف من فريق لآخر، وإن المقابلة أفضل في المرة الأولى، والاستبيان مناسب لتحديث الدرجات بعد ذلك. وأهم نصائح المقابلة في الدليل:

  • اسأل عما حدث وليس عما يجب: «متى حدثت وثيقة السياسات آخر مرة؟» بدلاً من «هل تحدث السياسات باستمرار؟».
  • لا تقرأ سؤال SAMM كما هو: بدلاً من «هل تستخدمون قوائم تحقق في نمذجة التهديدات؟» قل «صف لي كيف تتم نمذجة التهديدات عندكم» واستمع هل تذكر القائمة أم لا.
  • اطلب الأدلة Artifacts مبكراً: عندما يرى الناس أنك سوف تتحقق، تصبح الإجابات أدق.
  • ليست امتحاناً: التقييم تعاون وليس تحقيقاً، والهدف أن تعرف الواقع لتحسنه.
  • شخصان أفضل من شخص: واحد يسأل وواحد يكتب، ثم اعرض النتيجة الأولية على الفريق ليصححها قبل اعتمادها.

الخطوة الرابعة: الأدلة Evidence والصدق في الإجابة

هناك إغراء كبير في أن ترفع الإجابة قليلاً، فـ «نمذجنا التهديدات مرة لتطبيق واحد قبل سنة» تصبح «Yes, for some applications»، و«لدينا وثيقة سياسات لم يقرأها أحد» تصبح «Yes». لا تقم بذلك، والسبب أن الدرجة لا تمنحك أماناً، وإنما تقرر أين تضع وقت الفريق في الأشهر القادمة، فإذا ضخمت درجة ممارسة فسوف تتركها في الخطة وهي تحتاج عملاً. والطريقة الصحيحة أن تقرأ معايير الجودة تحت السؤال، فإذا لم تتحقق كلها فالإجابة «No» كما تقول صفحة التقييم، وأن تضع في عمود الملاحظات رابطاً للدليل نفسه (تقرير فحص، أو إعداد حماية الفرع، أو محضر جلسة نمذجة)، كما شرحنا في الأدلة Evidence: ما لم يوثق فهو لم يحدث. وتنصح خطوة التقييم في الدليل بأن تقرر مسبقاً كيف تعطي الإجابات الجزئية وتكتب قراراتك، وأن تسأل أكثر من شخص السؤال نفسه، وأن تحدد الأنشطة التي لا تنطبق عليك.

مثال عملي: نعبئ ملف SAMM لشركة SaaS تخيلية

لنفرض أن لدينا شركة تخيلية (ليست شركة حقيقية) فيها 15 شخصاً، تبيع خدمة فواتير SaaS للشركات الصغيرة، ولديها ثلاثة تطبيقات: تطبيق الويب للعملاء، وواجهة API عامة، ولوحة إدارة داخلية. والفريق يستخدم Git وخط CI/CD، ويشغل فحص الأسرار وSAST وفحص الاعتماديات منذ أشهر بعد قراءة DevSecOps للمبتدئين، والنشر مؤتمت، ولكن لا توجد استراتيجية أمن مكتوبة، ولا تصنيف للتطبيقات، والثغرات تتابع في رسائل المحادثة. والنطاق هو الشركة كلها، لأن الفرق تعمل بالطريقة نفسها.

كيف أجبنا عن بعض الأسئلة Questions؟

لن نعرض الأسئلة التسعين كلها، وإنما ستة منها مع سبب الإجابة، والأسئلة منقولة كما هي من ملف v2.2.0:

النشاطالسؤال في الملفما وجدناه في المقابلةالإجابة (القيمة)
G-SM-1-ADo you understand the enterprise-wide risk appetite for your applications?المؤسسون يعرفون أن تسريب بيانات الفواتير أخطر ما قد يحدث، ولكن لا توجد وثيقة معتمدةYes, it covers general risks (0.25)
D-TA-1-ADo you classify applications according to business risk based on a simple and predefined set of questions?لا يوجد تصنيف، والجميع يعامل التطبيقات الثلاثة بالطريقة نفسهاNo (0)
D-TA-1-BDo you identify and manage architectural design flaws with threat modeling?جلسة نمذجة واحدة لميزة الدفع قبل سنة، ونتيجتها في ملفYes, some of them (0.25)
I-SB-1-AIs your full build process formally described?البناء كله في ملفات الخط داخل المستودع، والأدوات محدثة، والهاش يحسب للمخرجاتYes, for most or all of the applications (1)
I-DM-1-ADo you track all known security defects in accessible locations?نتائج الأدوات في تقارير CI، والثغرات اليدوية في المحادثة، ولا يوجد مكان واحدYes, for at least half of the applications (0.5)
O-IM-1-BDo you respond to detected incidents?مدير التقنية هو المسؤول عملياً، ونصف الحوادث تقريباً لها توثيقYes, for at least half of the incidents (0.5)

ولاحظ في السؤال الأول أن الإجابة ليست «Yes, for some applications»، لأن هذا السؤال يستخدم مجموعة إجابات خاصة تقيس عمق فهم المخاطر، من «Yes, it covers general risks» إلى «Yes, it covers risks and opportunities»، لذلك اقرأ خيارات الإجابة لكل سؤال قبل أن تختار.

تعبئة الملف الرسمي وحساب الدرجات Scores

بدلاً من أن نحسب الدرجات بأيدينا، قمنا بتعبئة الإجابات التسعين في ورقة Interview من الملف الرسمي نفسه، ثم تركنا LibreOffice يعيد حساب المعادلات، ثم قرأنا ورقة Scorecard. والملف fill.py كما يلي، وفي القاموس V إجابات كل ممارسة بالترتيب A1 وB1 وA2 وB2 وA3 وB3:

# Fill the official SAMM v2.2.0 toolbox with the answers of a fictional 15-person SaaS company
import openpyxl
V = {  # practice: [A1, B1, A2, B2, A3, B3] as answer values 0 / 0.25 / 0.5 / 1
 'G-SM':[0.25,0,0,0,0,0], 'G-PC':[0.25,0.5,0,0,0,0], 'G-EG':[0.25,0.5,0,0,0,0],
 'D-TA':[0,0.25,0,0,0,0], 'D-SR':[0.25,0.25,0,0,0,0], 'D-SA':[0.5,0.5,0.25,0.25,0,0],
 'I-SB':[1,0.5,1,0.25,0,0], 'I-SD':[1,0.5,0.5,0.5,0,0], 'I-DM':[0.5,0,0,0,0,0],
 'V-AA':[0.25,0.25,0,0,0,0], 'V-RT':[0.5,0,0,0,0,0], 'V-ST':[1,0.25,0.25,0,0,0],
 'O-IM':[0.25,0.5,0,0,0,0], 'O-EM':[1,0.5,0.25,0,0,0], 'O-OM':[0.25,0.25,0,0,0,0],
}
wb = openpyxl.load_workbook('/w/SAMM_spreadsheet.xlsx')
q = {r[0].value: r[7].value for r in wb['imp-questions'].iter_rows(min_row=2) if r[0].value}
ans = {r[0].value: [c.value for c in r[1:5]] for r in wb['imp-answers'].iter_rows(min_row=2) if r[0].value is not None}
order = {0:0, 0.25:1, 0.5:2, 1:3}
iv = wb['Interview']
iv['D10'] = 'Fictional SaaS (15 people)'; iv['D11'] = 'Whole company: 3 applications'; iv['D12'] = '2026-10-07'
n = 0
for row in iv.iter_rows(min_row=18):
    code = row[0].value
    if not code or code not in q: continue
    bf, pr, st, lvl, _ = code.split('-')
    val = V[f'{bf}-{pr}'][(int(lvl)-1)*2 + (0 if st == 'A' else 1)]
    text = ans[q[code]][order[val]]
    iv.cell(row=row[0].row, column=6, value=text); n += 1
print('answered', n)
wb.save('/w/out/SAMM_filled.xlsx')

في الكود أعلاه لاحظ التالي:

  • رمز السؤال في الملف: العمود A في ورقة Interview يحمل رموزاً مثل D-TA-B-1-1، أي الوظيفة والممارسة والمسار ثم المستوى، وهو ترتيب يختلف قليلاً عن أسماء ملفات النموذج D-TA-1-B، والمعنى واحد.
  • نص الإجابة وليس الرقم: الملف يبحث عن نص الإجابة في جدول مجموعات الإجابات ليحولها إلى قيمة، لذلك نأخذ النص من الورقة المخفية imp-answers بحسب رقم مجموعة الإجابات لكل سؤال في imp-questions.
  • openpyxl لا يحسب المعادلات: هو يكتب الإجابات فقط، لذلك نفتح الملف في LibreOffice ونحفظه ليعيد حساب كل المعادلات.

والملف score.py يقرأ القيم التي حسبتها معادلات ورقة Scorecard:

# Read the scores that the toolbox formulas calculated (after LibreOffice recalculated the file)
import openpyxl
wb = openpyxl.load_workbook('/w/out/calc/SAMM_filled.xlsx', data_only=True)
s = wb['Scorecard']
for r in range(14, 29):                      # 15 practices: function, practice, score, L1, L2, L3
    a, b, c, d, e, f = (s.cell(r, k).value for k in range(1, 7))
    print(f'{a:15} {b:24} {c:<6} L1={d:<6} L2={e:<6} L3={f}')
print('---')
for r in range(14, 20):                      # 5 business functions and the overall score
    print(f'{s.cell(r, 9).value:15} {s.cell(r, 10).value:.3f}')

الآن سوف نقوم بتشغيل الثلاثة معاً في ال Container نفسه:

mkdir -p out
docker exec lab-samm-lo sh -c "cd /w && python fill.py && soffice --headless --convert-to xlsx --outdir /w/out/calc /w/out/SAMM_filled.xlsx >/dev/null 2>&1 && python score.py 2>/dev/null"

والمخرج سوف يكون كما يلي:

answered 90
Governance      Strategy & Metrics       0.125  L1=0.125  L2=0      L3=0
Governance      Policy & Compliance      0.375  L1=0.375  L2=0      L3=0
Governance      Education & Guidance     0.375  L1=0.375  L2=0      L3=0
Design          Threat Assessment        0.125  L1=0.125  L2=0      L3=0
Design          Security Requirements    0.25   L1=0.25   L2=0      L3=0
Design          Secure Architecture      0.75   L1=0.5    L2=0.25   L3=0
Implementation  Secure Build             1.375  L1=0.75   L2=0.625  L3=0
Implementation  Secure Deployment        1.25   L1=0.75   L2=0.5    L3=0
Implementation  Defect Management        0.25   L1=0.25   L2=0      L3=0
Verification    Architecture Assessment  0.25   L1=0.25   L2=0      L3=0
Verification    Requirements Testing     0.25   L1=0.25   L2=0      L3=0
Verification    Security Testing         0.75   L1=0.625  L2=0.125  L3=0
Operations      Incident Management      0.375  L1=0.375  L2=0      L3=0
Operations      Environment Management   0.875  L1=0.75   L2=0.125  L3=0
Operations      Operational Management   0.25   L1=0.25   L2=0      L3=0
---
Governance      0.292
Design          0.375
Implementation  0.958
Verification    0.417
Operations      0.500
Overall         0.508

ولاحظ أننا أخفينا رسائل 2>/dev/null لأن openpyxl يطبع تنبيهات بأنه لا يدعم بعض امتدادات Excel مثل التنسيق الشرطي Conditional Formatting، وهي لا تؤثر على القيم. والصورة التالية جزء من ورقة Interview بعد التعبئة، صدرناها من الملف نفسه بـ LibreOffice إلى PDF ثم إلى صورة:

لقطة من ورقة Interview في ملف SAMM Toolbox v2.2.0 بعد التعبئة: العنوان SAMM Assessment Interview: Whole company: 3 applications For Fictional SaaS (15 people)، ثم مربع التعليمات، ثم حقول Organization وTeam/Application وInterview Date، ثم شريط Governance ثم جدول ممارسة Strategy & Metrics بأعمدة Stream وLevel والسؤال وAnswer وInterview Notes وRating. المسار Create and Promote فيه ثلاثة أسئلة للمستويات 1 و2 و3: الأول Do you understand the enterprise-wide risk appetite for your applications? وإجابته Yes, it covers general risks، والثاني والثالث إجابتهما No، وتحت كل سؤال معايير الجودة. والمسار Measure and Improve فيه ثلاثة أسئلة عن المقاييس وKPIs كلها No. ومربع Rating يظهر 0.13.
ورقة Interview من ملف OWASP SAMM Toolbox v2.2.0 (CC BY-SA 4.0) بإجابات الشركة التخيلية، ومعايير الجودة تحت كل سؤال

وهذه ورقة Scorecard كما حسبها الملف:

لقطة من ورقة Scorecard في ملف SAMM Toolbox بعنوان Current Maturity Score. جدول على اليسار بأعمدة Business Functions وSecurity Practices وScore والمستويات 1 و2 و3 للممارسات الخمس عشرة: Strategy & Metrics 0.13، وPolicy & Compliance 0.38، وEducation & Guidance 0.38، وThreat Assessment 0.13، وSecurity Requirements 0.25، وSecure Architecture 0.75، وSecure Build 1.38، وSecure Deployment 1.25، وDefect Management 0.25، وArchitecture Assessment 0.25، وRequirements Testing 0.25، وSecurity Testing 0.75، وIncident Management 0.38، وEnvironment Management 0.88، وOperational Management 0.25. وجدول على اليمين للوظائف: Governance 0.29، وDesign 0.38، وImplementation 0.96، وVerification 0.42، وOperations 0.50، وOverall 0.51.
ورقة Scorecard تعرض الدرجة مقربة لرقمين، فالدرجة 0.125 تظهر 0.13

ماذا يحدث إذا كتبت الإجابة بيدك بدلاً من القائمة المنسدلة Drop-down؟

عمود الإجابة قائمة منسدلة، ولكن لا شيء يمنع شخصاً من لصق نص من مكان آخر أو كتابة «Yes» فقط. لنجرب ذلك على السؤال D-TA-B-1-1 الذي كانت إجابته «Yes, some of them»، والملف break.py كما يلي:

# Type a free-text answer that is not in the drop-down list, then recalculate
import openpyxl
wb = openpyxl.load_workbook('/w/out/SAMM_filled.xlsx')
iv = wb['Interview']
for row in iv.iter_rows(min_row=18):
    if row[0].value == 'D-TA-B-1-1':
        print(row[0].value, 'was:', row[5].value)
        row[5].value = 'Yes'
wb.save('/w/out/SAMM_broken.xlsx')

والملف score_ta.py يقرأ صف ممارسة Threat Assessment ودرجة وظيفة Design بعد إعادة الحساب:

import openpyxl
s = openpyxl.load_workbook('/w/out/calc/SAMM_broken.xlsx', data_only=True)['Scorecard']
print(s.cell(17, 2).value, s.cell(17, 3).value, '| Design', round(s.cell(15, 10).value, 3))

ثم نشغل الاثنين:

docker exec lab-samm-lo sh -c "cd /w && python break.py && soffice --headless --convert-to xlsx --outdir /w/out/calc /w/out/SAMM_broken.xlsx >/dev/null 2>&1 && python score_ta.py 2>/dev/null"

والمخرج سوف يكون كما يلي:

D-TA-B-1-1 was: Yes, some of them
Threat Assessment 0 | Design 0.333

وعند تشغيل الأمر سوف تجد أن الملف لم يعط أي خطأ، وإنما نزلت درجة الممارسة من 0.125 إلى 0، ودرجة Design من 0.375 إلى 0.333، والسبب أن معادلة الإجابة تحاط بـ IFERROR(…, 0)، فأي نص لا تجده في جدول الإجابات يصبح صفراً بصمت. لذلك اختر الإجابات من القائمة دائماً، وإذا جمعت إجابات من عدة أشخاص في ملف واحد فراجع أن كل خلية فيها نص من القائمة قبل أن تقرأ الدرجات.

كيف تقرأ النتيجة Result؟

الصورة التالية ترسم الدرجات الخمس عشرة التي حسبها الملف، ومعها الهدف بعد سنة من الخطة التي سوف نبنيها في القسم التالي:

رسم أعمدة أفقية تنمو من اليمين إلى اليسار على محور من 0 إلى 3، مع شارة حمراء مثال تخيلي Fictional، وليس شركة حقيقية. الحوكمة متوسطها 0.29 والهدف 0.83: Strategy and Metrics من 0.13 إلى 0.75، وPolicy and Compliance من 0.38 إلى 1.00، وEducation and Guidance من 0.38 إلى 0.75. التصميم 0.38 إلى 0.71: Threat Assessment من 0.13 إلى 0.75، وSecurity Requirements من 0.25 إلى 0.63، وSecure Architecture 0.75 دون تغيير. التنفيذ 0.96 إلى 1.21: Secure Build 1.38 وSecure Deployment 1.25 دون تغيير، وDefect Management من 0.25 إلى 1.00. التحقق 0.42 إلى 0.54: Architecture Assessment 0.25، وRequirements-driven Testing من 0.25 إلى 0.50، وSecurity Testing من 0.75 إلى 0.88. التشغيل 0.50 إلى 0.83: Incident Management من 0.38 إلى 0.75، وEnvironment Management من 0.88 إلى 1.13، وOperational Management من 0.25 إلى 0.63. وفي اليسار الدرجة الكلية Overall من 0.51 إلى 0.83 من 3.
الأعمدة الممتلئة من ملف Toolbox، والإطار المنقط الهدف بعد أربع مراحل، والمثال كله تخيلي

في النتيجة أعلاه لاحظ التالي:

  • البناء والنشر في الأعلى: لأن الفريق بدأ بالأدوات، وهذا هو الشكل المعتاد لفريق قرأ عن DevSecOps، فالأتمتة سهلة القياس وتعطي نتيجة سريعة.
  • الحوكمة وتقييم التهديدات وإدارة العيوب في القاع: لا يوجد تصنيف للتطبيقات، ولا مكان واحد للثغرات، وهذه الثلاثة تحديداً هي ما يجعل نتائج الأدوات مفيدة، فالأداة التي تجد ثغرة لا تنفع إذا ضاعت النتيجة في المحادثة.
  • الدرجة الكلية 0.51 من 3: هذا الرقم يقول إن معظم الممارسات في بداية المستوى 1، وهذه نقطة بداية طبيعية لشركة بهذا الحجم، والمهم هو الرقم في التقييم القادم.

من الدرجة إلى خطة تحسين Roadmap

الخطأ الأشهر بعد التقييم أن يقول أحدهم «هدفنا المستوى 3 في كل الممارسات»، وهذا الهدف غير مناسب إطلاقاً لشركة من خمسة عشر شخصاً، لأن المستوى 3 يعني مثلاً فريق استجابة مخصصاً، ونظاماً لإدارة التدريب، ومعماريات مرجعية محدثة باستمرار، وكل هذا تكلفة لا تبررها مخاطرها اليوم. وتقول خطوة تحديد الهدف في الدليل إن الهدف يحدد بحسب ملف المخاطر Risk Profile، وإنه يحتوي عادة أنشطة من المستويات الأدنى أكثر من الأعلى، وإن تكلفة برنامج ضمان البرمجيات تقدر تقريباً بين 5% و10% من تكلفة التطوير الكلية، وهذا رقم مفيد عندما تتحدث مع الإدارة عن الميزانية.

كيف تختار الهدف Target لكل ممارسة؟

اسأل لكل ممارسة سؤالين: ما أسوأ ما يحدث إذا بقيت كما هي؟ وهل تعتمد عليها ممارسات أخرى؟ ففي مثالنا قررنا ما يلي:

  • ارفع ما يجعل الأدوات مفيدة أولاً: إدارة العيوب من 0.25 إلى 1.0، وتقييم التهديدات من 0.13 إلى 0.75، لأن الشركة تحمل بيانات فواتير عملاء، وثغرة في عزل المستأجرين Tenant Isolation هي أخطر ما قد يحدث.
  • ابدأ الحوكمة بخطوة صغيرة: صفحة واحدة لشهية المخاطر وبضعة مقاييس، وليس برنامج حوكمة كاملاً.
  • اترك ما هو جيد بما يكفي: البناء والنشر 1.38 و1.25 يكفيان الآن، فلا تضع فيهما وقتاً هذه السنة.
  • احترم الاعتماديات بين الأنشطة: لا تقم بمقاييس متقدمة للعيوب قبل أن توجد العيوب في مكان واحد، ولا تقم بنمذجة تهديدات لكل التطبيقات قبل أن تعرف أيها أخطر.

الخطة على أربع مراحل Phases

تقول خطوة الخطة في الدليل إن الخطة المعتادة من 4 إلى 6 مراحل، مدة كل مرحلة بين 3 و12 شهراً، وإن تبدأ بما ينجز بسرعة وبالتوعية والتدريب، وإن توزع الجهد بالتساوي وتحترم الاعتماديات. ولشركة صغيرة اخترنا أربع مراحل كل منها ربع سنة، والصورة التالية تبين الخطة:

أربعة أعمدة من اليمين إلى اليسار. المرحلة 1 الربع الأول، الأساس والمكاسب السريعة Quick Wins: G-SM-1-A صفحة واحدة لشهية المخاطر Risk Appetite، وD-TA-1-A تصنيف التطبيقات الثلاثة ARC-ASC-01-01، وI-DM-1-A كل النتائج في متتبع واحد ARC-ASC-11-08، وG-EG-1-B سفير أمن لكل فريق ARC-ASC-01-05، وO-IM-1-B مسؤول وخطة استجابة ARC-ASC-13-07. المرحلة 2 الربع الثاني، المتطلبات والتصميم: D-SR-1-A متطلبات ASVS في التذاكر ARC-ASC-01-03/04، وD-TA-1-B نمذجة التهديدات للميزات الخطرة ARC-ASC-02-01، وI-DM-1-B أرقام بسيطة عن العيوب ARC-ASC-11-08، وG-PC-1-B قائمة الالتزامات الخارجية NCA ECC. المرحلة 3 الربع الثالث، الاختبار والتشغيل: V-RT-1-A اختبارات الصلاحيات والمصادقة ARC-ASC-11-04، وV-ST-2-A ضبط SAST وDAST على التطبيقات ARC-ASC-11-02/03، وO-EM-2-B عملية تحديث بمواعيد ARC-ASC-12-07، وO-OM-1-A جرد البيانات الحساسة ARC-ASC-06-01، وO-IM-1-A مراجعة السجلات دورياً ARC-ASC-13-02. المرحلة 4 الربع الرابع، القياس وإعادة التقييم: G-SM-1-B مقاييس البرنامج الأمني Metrics، وG-PC-2-B ربط الالتزامات بمتطلبات ARC-ASC-01-03، وI-DM-2-A مقياس خطورة واحد ومواعيد SLA ARC-ASC-11-08، وRe-assess إعادة التقييم بالنطاق نفسه SAMM v2.2.0.
كل بند نشاط من SAMM يرفع ممارسة، ومعه الضابط الذي يحوله إلى متطلب يمكن التحقق منه

في الخطة أعلاه لاحظ التالي:

  • المرحلة الأولى كلها مكاسب سريعة Quick Wins: لا يحتاج أي بند فيها أداة جديدة، وإنما قراراً وشخصاً وصفحة، ومع ذلك ترفع خمس ممارسات.
  • كل بند له رمز نشاط: فعندما تعيد التقييم تعرف أي سؤال يجب أن تتغير إجابته، وإذا لم تتغير فالبند لم ينجز فعلاً.
  • إعادة التقييم جزء من الخطة: وليست حدثاً منفصلاً، ونقترح أن تكون كل 6 إلى 12 شهراً بالنطاق نفسه والأسئلة نفسها، حتى تقارن الرقم بالرقم.

كيف يرتب SAMM أولوية ضوابط ARC-ASC؟

في دليل ضوابط أمن التطبيقات يقترح الدليل تسعين ضابطاً مرقماً في ثلاثة عشر نطاقاً، ولكل ضابط درجة Tier تحدد أقل أهمية للتطبيق يلزمه عندها، وفي مسار التبني يذكر الدليل أن SAMM يقيس العملية والدليل يقيس النتيجة. وعملياً فإن الدليل يقول لك «ما الذي يجب أن يكون صحيحاً في هذا التطبيق»، ولكن عندما يكون أمامك 56 ضابطاً للدرجة 1 وحدها فأنت تحتاج ترتيباً، وهنا يأتي SAMM: الممارسات الأضعف في التقييم تشير إلى النطاقات التي تبدأ بها. والجدول التالي يربط الممارسة بالمقال الذي يشرحها والضوابط التي تنفذها:

الممارسة الضعيفة في التقييماقرأضوابط ARC-ASC التي تبدأ بها
Threat Assessmentنمذجة التهديدات01-01 تصنيف التطبيق، و02-01 نمذجة التهديدات قبل البناء
Security RequirementsASVS ومراجعة الكود01-02 مستوى ASVS، و01-03 وثيقة المتطلبات، و01-04 متطلبات قابلة للاختبار في التذاكر
Education and Guidanceسفير الأمن01-05 الأدوار والتدريب وسفراء الأمن
Defect Managementفرز النتائج Triage، ومقال إدارة الثغرات مع DefectDojo قادم في خارطة الطريق11-08 إدارة الثغرات المكتشفة والإفصاح عنها
Security TestingSAST وDAST11-02 SAST، و11-03 DAST، و11-07 اختبار الاختراق
Requirements-driven Testingأنواع الاختبارات11-04 اختبار التطبيق مقابل متطلباته، و02-06 حالات الإساءة
Secure Buildسلسلة التوريد09-02 SBOM، و09-03 فحص الاعتماديات، و10-03 حماية خط CI/CD
Secure Deploymentفحص الأسرار10-04 فحص الأسرار، و06-05 إدارة المفاتيح والأسرار، و10-07 فصل البيئات
Environment Managementتأمين خادم VPS، ومقال فحص ال Docker Images مع Trivy قادم12-07 التحديثات، و09-05 Docker Images مفحوصة، و11-05 مراجعة التحصين قبل الإطلاق
Incident ManagementDFIR للمبتدئين وسجل التدقيق13-02 تسجيل الأحداث الأمنية، و13-06 سجل التدقيق، و13-07 الجاهزية للحوادث
Policy and ComplianceNCA ECC بلغة بسيطة01-03 وثيقة المتطلبات المعتمدة، و01-07 المراجعة الدورية
Operational Managementنطاق حماية البيانات06-01 جرد البيانات الحساسة، و06-06 بيانات الإنتاج خارج الإنتاج

ولاحظ أن الربط في الاتجاهين: SAMM يقول لك أي النطاقات تبدأ بها، والدليل يعطيك جملة «يجب» قابلة للتحقق ودليلاً للمدقق، فعندما تجيب في التقييم القادم عن سؤال I-DM-1-A تستطيع أن تضع في الملاحظات رابط تقييم الضابط 11-08 في ملف Excel الخاص بالدليل، فيصبح الدليل واحداً للاثنين.

ماذا تقيس بين تقييمين؟ المقاييس Metrics

الدرجة نفسها تقاس مرة أو مرتين في السنة، وبينهما تحتاج أرقاماً قليلة تعرف منها أن الخطة تمشي، والممارسة Strategy and Metrics نفسها تطلب في المستوى 1 مقاييس سهلة الجمع ويعبر عنها بعدد أو نسبة. ومن الأمثلة المناسبة لمثالنا:

  • نسبة بنود الخطة المنجزة في كل مرحلة، مع رمز النشاط لكل بند.
  • عدد الثغرات المفتوحة من مستوى Critical وHigh، ومتوسط الزمن من الاكتشاف إلى الإصلاح، كما في خطة إدخال الفحوص على مراحل.
  • نسبة الميزات الكبيرة التي مرت بجلسة نمذجة تهديدات.
  • نسبة التطبيقات المصنفة ولها مستوى ASVS مكتوب.

ولا تقم بقياس عدد النتائج التي وجدتها الأدوات، والسبب أن هذا الرقم يرتفع كلما أضفت أداة أو قاعدة ولا يقول شيئاً عن نضج البرنامج.

قالب Template جاهز للنسخ

الجدول التالي يكفي لتبدأ قبل أن تفتح ملف Toolbox، فاكتب فيه الممارسات الضعيفة فقط، ولكل منها خطوة واحدة ومسؤول وتاريخ:

الممارسةالحاليالهدفالخطوة التالية (رمز النشاط)المسؤولالموعد
Threat Assessment0.130.75تصنيف التطبيقات الثلاثة بخمسة أسئلة (D-TA-1-A)قائد التطويرنهاية الربع الأول
Defect Management0.251.0كل النتائج في متتبع واحد بخطورة (I-DM-1-A)سفير الأمننهاية الربع الأول
Incident Management0.380.75مسؤول مسمى وخطة استجابة في صفحة (O-IM-1-B)مدير التقنيةنهاية الربع الأول
Security Requirements0.250.63متطلبات ASVS في تذاكر الميزات الحساسة (D-SR-1-A)صاحب المنتجنهاية الربع الثاني

وهذه النسخة نفسها بصيغة CSV لتنسخها إلى أي جدول:

practice,current,target,next_action,samm_activity,owner,due
Threat Assessment,0.13,0.75,Classify the 3 applications with 5 questions,D-TA-1-A,Dev lead,Q1
Defect Management,0.25,1.0,All findings in one tracker with severity,I-DM-1-A,Security champion,Q1
Incident Management,0.38,0.75,Named owner and one-page response plan,O-IM-1-B,CTO,Q1
Security Requirements,0.25,0.63,ASVS requirements in tickets of sensitive features,D-SR-1-A,Product owner,Q2

أخطاء شائعة Common Mistakes

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

الخلاصة

وصلنا لنهاية الموضوع، وأهم ما فيه:

  • سؤال «هل نحن آمنون؟» لا إجابة له بنعم أو لا، والأدوات وحدها لا تصنع برنامجاً، ونموذج النضج يحول السؤال إلى «أين نحن، وما الخطوة التالية؟».
  • OWASP SAMM v2 (آخر إصدار v2.2.0 في يوليو 2026، بترخيص CC BY-SA 4.0) فيه 5 وظائف و15 ممارسة و30 مساراً و90 نشاطاً، وكل نشاط سؤال في التقييم.
  • SAMM يقيس البرنامج (المصنع) وASVS يقيس التطبيق (المنتج)، وBSIMM يصف ما تفعله الشركات، وDSOMM يفصل جزء DevSecOps.
  • الإجابات 0 و0.25 و0.5 و1، ودرجة الممارسة مجموع متوسطات المسارين في المستويات الثلاثة (من 0 إلى 3)، ودرجة الوظيفة متوسط ممارساتها.
  • التقييم الجيد نطاق صغير ثابت، ومقابلات قصيرة بالوظائف، وإجابات صادقة عليها أدلة، ثم أهداف بحسب المخاطر وخطة على مراحل، ثم إعادة التقييم بالطريقة نفسها.
  • في مثالنا التخيلي حسب الملف الرسمي درجة كلية 0.51، والخطة لسنة ترفعها إلى 0.83 دون أي هدف قريب من المستوى 3.
  • الممارسات الأضعف في SAMM تخبرك بأي نطاقات دليل ضوابط أمن التطبيقات تبدأ، والضوابط تعطيك المتطلب والدليل الذي يثبت أن النشاط حدث.
دليلما هي OWASP؟ مشاريعها ووثائقها ومتى تستخدم كلاً منهامن يدير OWASP ولماذا كل ما تنشره مجاني، وأي مورد من مواردها تفتح في كل مرحلة من بناء تطبيقك.دليلOWASP ASVS ومراجعة الكود الأمنية لكل Pull Requestكيف تكتب متطلبات أمان يمكن اختبارها مع OWASP ASVS، وتراجع كل طلب دمج أمنياً في عشرين دقيقة بقائمة جاهزة.دليلDevSecOps للمبتدئين: الأمن داخل خط CI/CD ومتى يعمل كل فحصما الذي يجده كل فحص أمني في خط CI/CD وما الذي يفوته، وكيف ترتب نتائجه حتى تصل إلى قرار بدل قائمة طويلة.دليلضوابط أمن التطبيقات: دليل مقترح بنطاقات وضوابط مرقمة، مربوط بضوابط NCA وOWASP ASVSمقترح مستقل من عرب رووت بتسعين ضابطاً مرقماً لأمن تطبيقات الويب وواجهات API وخط CI/CD، لكل ضابط متطلب ودليل للمدقق، مربوط بالبنود التي يدعمها في ECC-2:2024 وCSCC وبأرقام OWASP ASVS 5.0، مع ملف Excel للتقييم الذاتي.دليلنمذجة التهديدات Threat Modeling للمبتدئينكيف تسأل ما الذي قد يسوء في تصميم تطبيقك قبل أن تكتب الكود، وتقرر لكل تهديد هل تصلحه أو تقبله، مع قالب جاهز للنسخ.دليلمصطلحات GRC للمبتدئين بمثال من شركة صغيرةما الذي يعنيه GRC فعلاً، وما الكلمات التي يستخدمها المدقق، وكيف تثبت له أن ضوابطك تعمل كما تقول.

سجل التحديثات

  • أكتوبر 2026: كتابة المقال، ومراجعة OWASP SAMM v2.2.0 من موقعه ومستودع owaspsamm/core وملفات YAML للنموذج، وتعبئة ملف SAMM_spreadsheet.xlsx الرسمي بإجابات شركة تخيلية وحساب الدرجات بمعادلاته داخل Container من python:3.12-slim (Python 3.12.15 وopenpyxl 3.1.5 وLibreOffice 25.2.3)، ومراجعة صفحات BSIMM16 وOWASP DSOMM وCMMI.
Could not load content
نشرة عرب رووت | ArabRoot

معرفة تستحق مكاناً في بريدك.

مقالات مختارة وأدوات مفيدة وأفكار لمشروعك القادم، في رسالة واحدة كل أسبوع.

يمكنك إلغاء الاشتراك متى شئت. الخصوصية

تم استلام طلبك. افتح بريدك واضغط رابط التأكيد لإتمام الاشتراك.