مستوى المقال: متوسط. يفترض إنك تعرف تبني صورة Docker وتشغّل GitHub Actions، لكن لسه ما أضفتش فحص ثغرات آلي لخط الـ CI.
في آخر هذا المقال هيبقى عندك بوابة أمان تلقائية توقف الـ build وتمنع أي صورة فيها ثغرة حرجة من الوصول للإنتاج، بأقل من 15 سطر YAML.
افحص صور Docker بـ Trivy قبل ما توصل الإنتاج
الرقم اللي يخليك تقرأ: حسب تقرير Sysdig لسنة 2024، 86% من الأحمال في الإنتاج فيها ثغرة قابلة للترقيع من مستوى عالٍ أو أعلى. يعني الاحتمال الأكبر إن الصورة اللي بتنشرها دلوقتي فيها CVE معروف انت مش شايفه.
المشكلة باختصار
صورتك مش بس الكود اللي كتبته. هي كمان نظام تشغيل أساسي (زي debian أو alpine) وعشرات المكتبات اللي جت مع npm install أو pip install. أي حزمة فيهم ممكن يكون فيها ثغرة متسجّلة بمعرّف CVE.
المثال الأشهر: ثغرة Log4Shell (CVE-2021-44228) في مكتبة Log4j. سطر واحد في سجلّ عادي كان بيسمح بتنفيذ كود عن بُعد على السيرفر. ملايين الصور اللي كانت شغّالة عادي بقت مكشوفة بين ليلة وضحاها، من غير ما يتغيّر سطر واحد في كودهم.
يعني إيه فحص الثغرات؟ الفكرة بمثال
تخيّل بوّاب مطار بيقارن كل حقيبة بقائمة أشياء ممنوعة محدّثة يوميًا. مش بيخمّن، وبيفتّش بالظبط جوّه الشنطة ويطابق محتواها مع القائمة. لو لقى حاجة ممنوعة، بيوقف الراكب عند البوابة، مش بعد ما يركب الطيارة.
الآن بالتفاصيل والدقة: Trivy (من Aqua Security) بيعمل نفس الدور للصورة. بيفكّك طبقاتها، بيطلّع قائمة كل حزمة وإصدارها (اللي بتتسمّى SBOM)، وبيطابقها مع قواعد بيانات ثغرات عامة زي NVD. لو حزمة عندك إصدارها مذكور في CVE معروف، Trivy بيبلّغك بمستوى الخطورة: LOW أو MEDIUM أو HIGH أو CRITICAL.
الحل: بوابة فحص في خط الـ CI
الفكرة إن الفحص يشتغل تلقائيًا على كل push، والأهم: يوقف الـ build لو لقى ثغرة خطيرة. ده اللي بيحوّل الفحص من تقرير بيتجاهله الكل إلى بوابة فعلية.
الأول جرّبه محليًا على جهازك قبل ما تدفع:
# افحص صورة محليًا، ورجّع كود خطأ لو فيه ثغرة حرجة أو عالية
trivy image --severity CRITICAL,HIGH --ignore-unfixed --exit-code 1 myapp:1.5.0
وبعدين حطّه في GitHub Actions كبوابة على كل Pull Request:
name: security-scan
on: [push, pull_request]
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build image
run: docker build -t myapp:${{ github.sha }} .
- name: Scan with Trivy
uses: aquasecurity/trivy-action@0.28.0
with:
image-ref: myapp:${{ github.sha }}
severity: CRITICAL,HIGH
ignore-unfixed: true
vuln-type: os,library
exit-code: '1' # يفشّل الـ build لو لقى ثغرة
الخطوة الأهم هي exit-code: '1'. من غيرها Trivy بيطبع تقرير ويكمّل بنجاح، والكل هيتجاهله. معاها، الـ build بيفشل في حدود 30 إلى 60 ثانية، فالمطوّر مضطر يصلّح قبل الدمج.
سيناريو واقعي
افترض عندك متجر إلكتروني عربي بـ 50 ألف طلب في اليوم، شغّال على صورة node أساسية اتبنت من 4 شهور. الأساس نفسه دلوقتي فيه 3 ثغرات حرجة اتسجّلت بعد ما بنيت الصورة. من غير فحص، انت مش هتعرف غير لما حد يستغلّها. مع البوابة دي، أول Pull Request بيحاول يعيد البناء هيفشل على الـ 3 ثغرات، فتترقّي الأساس بـ docker build --pull وتقفلهم قبل الإنتاج.
الـ trade-offs وما يجب الانتباه له
الفحص مش ببلاش. اللي بتكسبه: منع الثغرات المعروفة من الوصول للإنتاج. اللي بتدفعه:
- وقت CI زيادة: من 30 إلى 90 ثانية لكل build، حسب حجم الصورة وكاش قاعدة الثغرات.
- ضجيج: صورة كبيرة ممكن تطلّع 100+ تحذير. عشان كده استخدمنا
ignore-unfixed: true— تركّز بس على اللي ليه ترقيع متاح فعلًا وتقدر تصلّحه. - إيجابيات كاذبة أو ثغرات غير قابلة للاستغلال: حسب Sysdig، حوالي 15% فقط من الثغرات الحرجة والعالية اللي ليها ترقيع بتكون في حزم محمّلة وقت التشغيل فعلًا. الباقي موجود في الصورة بس مش مستخدَم. لذلك لو ثغرة معيّنة تحت المراجعة، استثنيها بوضوح بدل ما توقف كل الفريق:
# .trivyignore — استثناء مؤقت وموثّق، مش دائم
# قيد المراجعة، تُراجَع 2026-09-01
CVE-2025-12345
الافتراض هنا إن الفريق بيراجع ملف .trivyignore دوريًا. لو الاستثناءات بتتراكم بدون تاريخ انتهاء، البوابة بتفقد قيمتها.
متى لا تستخدم هذه الطريقة
لو انت في تجربة أولية (prototype) عمرها أيام ومش رايحة إنتاج، البوابة الصارمة هتعطّلك بلا مقابل. الأنسب وقتها تشغّل Trivy بـ exit-code: '0' — يبلّغك بس من غير ما يفشّل الـ build. كذلك لو صورتك scratch أو distroless بلا مدير حزم، سطح الهجوم صغير أصلًا والعائد من الفحص أقل، رغم إنه يفضل مفيد للمكتبات.
الخطوة التالية
افتح آخر صورة نشرتها وشغّل عليها أمر واحد الآن: trivy image --severity CRITICAL,HIGH --ignore-unfixed اسم_الصورة:الوسم. لو طلع أي CRITICAL، ده معناه إن الإنتاج بتاعك مكشوف دلوقتي — ابدأ بترقية الصورة الأساسية قبل أي حاجة.
المصادر
- Trivy — التوثيق الرسمي: trivy.dev
- Trivy GitHub Action ومدخلاته (image-ref, severity, exit-code, ignore-unfixed): github.com/aquasecurity/trivy-action
- إحصائية 86–87% من صور/أحمال الحاويات فيها ثغرات عالية أو حرجة، و15% منها فقط محمّلة وقت التشغيل — تقرير Sysdig 2023/2024: sysdig.com
- ثغرة Log4Shell (CVE-2021-44228) — قاعدة بيانات NVD: nvd.nist.gov