ما يمكن أن يفحصه خط أنابيبك بالفعل (أبعد من مجرد فحص الأمان)
عندما تبدأ معظم الفرق في إضافة فحوصات إلى خط أنابيب النشر، أول ما يتبادر إلى الذهن هو فحص أمان كود التطبيق. قم بتشغيل أداة SAST، وابحث عن بعض الثغرات، واعتبر المهمة منتهية. ولكن إذا نظرت إلى ما يتدفق فعليًا عبر خط الأنابيب الخاص بك، ستجد العديد من الأمور الأخرى التي تستحق الفحص - وبعضها سينقذك من مشاكل لا يستطيع فحص الكود وحده اكتشافها.
توصيل البرامج الحديثة ينقل أكثر من مجرد كود المصدر. إنه ينقل قوائم التبعيات، وصور الحاويات، وتعريفات البنية التحتية، وملفات التكوين، وبيانات الاعتماد. كل من هذه القطع الأثرية تحمل مخاطرها الخاصة. خط الأنابيب الذي يفحص كود التطبيق فقط يترك معظم سطح الهجوم دون فحص.
فيما يلي أنواع الفحوصات التي يمكنك تشغيلها في خط الأنابيب الخاص بك، وما تكتشفه، ومتى تكون منطقية.
فحص التبعيات
تقريبًا لا يوجد تطبيق يُكتب من الصفر بعد الآن. مشروعك يسحب مكتبات من npm أو PyPI أو Go modules أو NuGet أو Maven. كل من هذه التبعيات هو كود كتبه شخص آخر، وهذا الكود يمكن أن يحتوي على ثغرات معروفة للعامة.
فحص التبعيات يتحقق من قائمة التبعيات الخاصة بك مقابل قواعد بيانات الثغرات. يخبرك إذا كانت أي من مكتباتك تحتوي على مشاكل أمنية معروفة في الإصدار الذي تستخدمه. هذا ليس عن اكتشاف ثغرات اليوم صفر. إنه عن اكتشاف تلك الموثقة بالفعل والتي غالبًا ما تتوفر لها تصحيحات.
قم بتشغيل هذا الفحص كلما تغير ملف التبعيات الخاص بك - package.json أو go.mod أو requirements.txt أو أيًا كان ما يستخدمه نظامك البيئي. على الأقل، قم بتشغيله مرة واحدة خلال مرحلة البناء. إذا قمت بتشغيله فقط على طلبات السحب، فقد تفوتك ثغرة تم إدخالها عن طريق دمج تحديث تبعية مباشرة إلى الفرع الرئيسي.
فيما يلي مقتطف YAML بسيط لوظيفة GitHub Actions تقوم بتشغيل npm audit وتفشل خط الأنابيب إذا تم العثور على أي ثغرة عالية الخطورة:
name: dependency-scan
on:
pull_request:
paths:
- 'package.json'
- 'package-lock.json'
jobs:
audit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
- run: npm audit --audit-level=high
فحص صور الحاويات
إذا قمت بتغليف تطبيقك كصورة حاوية، فإن تلك الصورة تحتوي على أكثر من مجرد كودك. تحتوي على صورة أساسية، وطبقة نظام تشغيل، ومكتبات نظام، وملفات ثنائية لم تكتبها أنت. ثغرة في الصورة الأساسية تؤثر على تطبيقك تمامًا مثل ثغرة في كودك الخاص.
فحص صور الحاويات يفحص محتويات الصورة بالكامل، بما في ذلك حزم نظام التشغيل والمكتبات المثبتة. يكتشف أشياء مثل إصدار ضعيف من OpenSSL في الصورة الأساسية أو استغلال معروف في أداة نظام لا يستدعيها تطبيقك مباشرة ولكنها لا تزال موجودة في وقت التشغيل.
الوقت المناسب لتشغيل هذا الفحص هو مباشرة بعد بناء الصورة، قبل دفعها إلى السجل أو نشرها في أي مكان. بمجرد أن تكون الصورة في الإنتاج، فإن فحصها لا يزال مفيدًا للرؤية، لكن الضرر قد أصبح ممكنًا بالفعل.
فحص البنية التحتية ككود
عندما تكتب البنية التحتية ككود باستخدام Terraform أو CloudFormation أو Pulumi، فإنك تحدد موارد سحابية في ملفات نصية. يمكن أن تحتوي تلك الملفات على تكوينات خاطئة تفتح ثغرات أمنية: حاويات تخزين متاحة للعامة، قواعد بيانات مكشوفة على الإنترنت، تشفير معطل، أو أدوار IAM متساهلة بشكل مفرط.
فحص IaC يتحقق من تعريفات البنية التحتية الخاصة بك مقابل أفضل ممارسات الأمان قبل تطبيقها. إنه ليس بديلاً عن أدوات إدارة وضع الأمان السحابي التي تفحص البيئات قيد التشغيل. إنه فحص وقائي يكتشف المشاكل قبل أن تصبح موارد منشورة.
قم بتشغيل هذا الفحص عندما يفتح شخص ما طلب سحب يغير كود البنية التحتية. هذه هي النقطة التي لا يزال بإمكانك فيها إصلاح التكوين دون الحاجة إلى تنظيف مورد تم تكوينه بشكل خاطئ وهو قيد التشغيل بالفعل.
فحص الأسرار
يقوم المطورون عن طريق الخطأ بإيداع الأسرار في المستودعات أكثر مما تحب الفرق الاعتراف به. مفاتيح API، كلمات مرور قواعد البيانات، مفاتيح SSH الخاصة، ورموز حسابات الخدمة تنتهي في الكود أو ملفات التكوين أو رسائل الإيداع. بمجرد أن يكون السر في تاريخ المستودع، يصعب إزالته لأنه يعيش في تاريخ git.
فحص الأسرار يكتشف الأنماط التي تشبه بيانات الاعتماد: سلاسل تطابق تنسيق مفاتيح الوصول AWS، رموز GitHub، خطافات الويب Slack، أو كلمات المرور العامة. يقوم بوضع علامة عليها قبل أن يصل الإيداع إلى الفرع الرئيسي.
هذا الفحص يكون أكثر فعالية عند تشغيله على كل إيداع أو على الأقل على كل طلب سحب. كلما اكتشفت سرًا مسربًا في وقت مبكر، قل التعرض. إذا قمت بالفحص فقط بعد دمج الكود، فإن السر يكون بالفعل في المستودع ويمكن لأي شخص لديه وصول سحبه.
فحص التراخيص
كل تبعية تستخدمها تأتي مع ترخيص. بعض التراخيص تتطلب منك تضمين الإسناد. البعض الآخر يقيد الاستخدام التجاري أو يتطلب منك فتح مصدر كودك الخاص إذا استخدمتها. فحص التراخيص يتحقق من تراخيص جميع تبعياتك مقابل السياسة التي حددها فريقك أو مؤسستك.
هذا ليس فحصًا أمنيًا، ولكنه فحص قانوني وامتثالي يمكن أن يمنع الإصدار إذا تم تجاهله. تقوم العديد من الفرق بتشغيل فحص التراخيص جنبًا إلى جنب مع فحص التبعيات حيث أن كلاهما يستخدم نفس مصدر البيانات - قائمة التبعيات الخاصة بك.
السياسة ككود
السياسة ككود ليست نوعًا واحدًا من الفحص. إنها طريقة لتشفير القواعد وتنفيذها برمجيًا في خط الأنابيب الخاص بك. بدلاً من الاعتماد على ماسح ضوئي مبني مسبقًا، يمكنك تعريف الفحوصات الخاصة بك: "كل تغيير في قاعدة البيانات يجب أن يراجعه مسؤول قاعدة البيانات"، "كل صورة حاوية يجب أن تأتي من سجل معتمد"، "كل نشر إلى الإنتاج يجب أن يكون قد اجتاز اختبار تحميل".
هذه القواعد تُكتب ككود وتُنفذ تلقائيًا في خط الأنابيب. تمنحك السياسة ككود المرونة لتنفيذ ما هو مناسب لسياقك دون انتظار البائع لإضافة ميزة.
اختيار ما يجب تشغيله ومتى
ليس كل فحص يحتاج إلى التشغيل في كل مرحلة. بعضها رخيص بما يكفي لتشغيله على كل إيداع. البعض الآخر أبطأ ويكون أكثر منطقية على طلبات السحب أو قبل النشر. المفتاح ليس تشغيل كل شيء في كل مكان، ولكن وضع كل فحص في النقطة التي يمنحك فيها أكبر قيمة بأقل احتكاك.
فيما يلي نقطة بداية عملية:
- كل إيداع: فحص الأسرار، فحص التبعيات (إذا تغير ملف التبعيات)
- طلب السحب: فحص IaC، فحص التراخيص، فحص صور الحاويات (إذا أعيد بناء الصورة)
- قبل النشر: فحص صور الحاويات (إذا لم يتم بالفعل)، فحوصات السياسة ككود
قائمة مراجعة سريعة لخط الأنابيب الخاص بك
- فحص التبعيات يعمل عندما تتغير ملفات التبعيات
- صور الحاويات تُفحص قبل وصولها إلى السجل
- كود البنية التحتية يُفحص قبل تطبيقه
- الأسرار تُكتشف قبل وصولها إلى الفرع الرئيسي
- الامتثال للتراخيص يُفحص لكل تبعية
- السياسات المخصصة تُنفذ ككود، وليس كبوابات يدوية
الخلاصة الملموسة
خط الأنابيب الذي يفحص كود التطبيق فقط يفحص طبقة واحدة من عملية توصيل متعددة الطبقات. تبعياتك، حاوياتك، تعريفات البنية التحتية، وبيانات الاعتماد الخاصة بك كلها تحمل مخاطر. أضف فحوصات لكل نوع من القطع الأثرية في النقطة الصحيحة من خط الأنابيب. الهدف ليس منع كل تغيير، ولكن اكتشاف المشاكل مبكرًا بما يكفي بحيث يكون إصلاحها لا يزال رخيصًا.