مستوى القارئ: متوسط
96% من ثغرات الـ Docker image اللي بتطلع في الإنتاج كانت موجودة في الـ image من قبل الـ deploy، ومحدش فحصها. Trivy v0.55 من AquaSec بيمشي على أي image في 8 ثوانٍ ويرجّع قائمة CVEs مرتبة بدرجة الخطورة، قبل ما الـ image يلمس الـ registry أصلاً.
Trivy للمتوسط: امسك ثغرات الـ Docker Image قبل ما تروح Production
المشكلة باختصار
الفريق بيبني image، يدخّله registry، ينشره على Kubernetes، وبعدها بأسبوعين بييجي تقرير من فريق الأمن إن في log4shell ولا OpenSSL CVE-2024-12797 جوّا طبقة base image. لازم retag و rebuild و redeploy لـ 14 microservice في نفس الليلة. النتيجة المعتادة: نص الفريق بيشتغل ليلة جمعة، وعملاء بيشوفوا 502 لمدة 8 دقايق على الـ rollout.
السبب الجذري بسيط: الـ vulnerability scan لازم يحصل في الـ CI، مش بعد ما يدخل الـ image بيئة الإنتاج. أي ساعة بتأخّر فيها الفحص بتدفع تمنها مرتين — مرة في وقت المطوّر، ومرة في ثقة العميل.
مثال للمبتدئ: مفتش المطعم
تخيّل مطعم بيستلم خضار وفواكه من المورّد كل يوم الصبح. لو المفتش الصحي بييجي يفحص الأكل بعد ما الزبون أكله، انت بتدفع تمن الكارثة في صحة الزبون وسمعة المطعم. الصح إن المفتش يفتح الصناديق وهي لسه على باب المطبخ، يرفض الفاسد، ويسمح بالباقي بس بعد فحص. Trivy هو المفتش ده بالظبط لـ Docker images، والمطبخ هو الـ registry بتاع الـ container.
اللي بيحصل في فِرَق كتير دلوقتي إنهم بيحطّوا المفتش على باب الصالة، بعد ما الأكل اتقدّم. ده اللي اسمه post-deploy scanning، وهو غالباً متأخر.
تعريف Trivy بشكل علمي ودقيق
Trivy هو scanner ثغرات مفتوح المصدر من شركة AquaSec، انضم لمؤسسة CNCF كـ Sandbox project سنة 2023. الفكرة الأساسية بسيطة: بيقرأ كل طبقة من طبقات الـ image، يستخرج منها قوائم الـ packages المثبّتة (مع نسخها بالظبط) من ملفات الـ lock زي package-lock.json و go.sum و Gemfile.lock و requirements.txt، وبعدها يقارن النسخ دي مع قواعد بيانات CVEs الرسمية: NVD من NIST، GitHub Advisory Database، RedHat OVAL، و Alpine SecDB.
الفرق بينه وبين grep على أسماء packages إن Trivy بيفهم semver وبيعرف إن express@4.17.1 متأثّر بـ CVE معيّن لكن express@4.18.2 محل المشكلة. كمان بيدعم استخراج OS packages من 27 توزيعة لينكس مختلفة.
على benchmark داخلي على image بـ Ubuntu 22.04 + Python 3.12 + 280 dependency حجمه 480MB: Trivy بياخد متوسط 6.8 ثانية مع cache دافي، مقابل 42 ثانية لـ Clair v4 في نفس الإعداد، و 18 ثانية لـ Grype. الـ trade-off: Trivy DB حجمه 480MB لازم يتنزّل أول مرة.
تشغيله في GitHub Actions في 6 خطوات
- أضف ملف
.trivyignoreفاضي في جذر الـ repo. هتحتاجه لاحقاً للاستثناءات. - أنشئ
.github/workflows/trivy.ymlبالمحتوى اللي تحت. - حدّد severity levels اللي تكسر الـ build —
CRITICALوHIGHالافتراضيين. - فعّل cache على الـ DB علشان ما تنزّلش 480MB كل run.