
ماسح ضوئي للبرمجيات الخبيثة لصور الحاويات: بدون خادم خفي، واعٍ بالطبقات، ClamAV وYARA
meles هو ماسح برمجيات خبيثة لصور الحاويات: أمر واحد على مرجع صورة، دون Docker daemon، ورموز خروج مناسبة لـ CI. في Kubernetes يقوم أيضًا بفحص كل صورة تشغّلها حاوياتك، وإن أردت، يوقف الحاويات الجديدة حتى يتم فحص صورتها.
يفحص meles ما تحتويه الصورة قبل تشغيلها. وهو مكمّل لماسحات الثغرات والكشف أثناء التشغيل مثل Falco؛ ولا يحل محل أيٍّ منهما.
يأتي الاسم من Meles meles، الغرير الأوروبي – فهو يحفر عبر الطبقات.
meles image <ref> خط أنابيب عندما
يجد برمجيات خبيثة. المخرجات كجدول أو JSON أو SARIF، مع
قواعد التجاهل للإيجابيات الكاذبة.MalwareReport بجوار workload، مع تنبيهات Prometheus اختيارية.جرّبه على جهازك (Linux amd64، Docker، bash):
curl -fsSL https://github.com/movray/meles/releases/download/v0.3.3/meles_0.3.3_linux_amd64.tar.gz | tar -xz meles
docker run -d --name clamd -p 127.0.0.1:3310:3310 clamav/clamav:1.4
export MELES_CLAMD=tcp://127.0.0.1:3310
until (exec 3<>/dev/tcp/127.0.0.1/3310 && printf 'zPING\0' >&3 && head -c4 <&3 | grep -q PONG) 2>/dev/null; do sleep 5; done
./meles selftest
./meles image alpine:3.20
أو في عنقود (مسؤول العنقود، وStorageClass افتراضي، وحوالي 2 غيغابايت من الذاكرة الحرة على عقدة):
kubectl create namespace meles
kubectl label namespace meles pod-security.kubernetes.io/enforce=baseline
helm install meles oci://ghcr.io/movray/charts/meles --version 0.3.3 -n meles --set operator.enabled=true
kubectl -n meles rollout status deploy/meles-clamd --timeout=15m
kubectl get malwarereports -A # every image running in your cluster
kubectl -n meles port-forward svc/meles-server 8080:80 # http://localhost:8080/
يقوم المشغّل الآن بسحب وفحص صورة كل pod، وهو ما يُحتسب ضمن حدود السحب (pull limits) الخاصة بسجلاتك (registries)؛ فهو يكتفي بالإبلاغ ولا يمسّ الـ pods الخاصة بك. تظهر التقارير خلال دقائق. قد ينتهي ملف ثنائي كبير جدًا بحالة Incomplete، وهي ليست نظيفة أبدًا: راجع
قراءة النتائج.
إنّ port-forward هو فقط أسرع طريقة لإلقاء نظرة. للاستخدام الدائم،
اعرض واجهة المستخدم عبر server.ingress أو server.httpRoute وضع تسجيل دخول
أمامها عبر server.oauth2Proxy، وكل ذلك ضمن قيم الـ chart:
تسجيل الدخول لواجهة الويب. لا يمتلك meles تسجيل دخول
خاصًا به، لذا لا تعرض واجهة المستخدم دون واحد.
جولة خطوة بخطوة، من ملف مخفي بواسطة طبقة لاحقة إلى بوابة الفحص في Kubernetes: docs/getting-started.md.
clamd الخاص بـ ClamAV عبر بروتوكول socket الخاص به. لا يرتبط meles
بـ libclamav ويبقى مرخّصًا بموجب Apache-2.0.افتراضيًا يكتفي meles بالإبلاغ، ولا يحذف أي شيء أبدًا. وهو ليس بديلًا عن توقيع الصور أو SBOMs أو الكشف أثناء التشغيل (runtime detection).
يأتي كل إصدار مع ملفات ثنائية لـ Linux وmacOS (amd64، arm64)، وصورة متعددة المعماريات، وHelm chart:
VERSION=0.3.3
# Binary
curl -fsSLO https://github.com/movray/meles/releases/download/v$VERSION/meles_${VERSION}_linux_amd64.tar.gz
tar -xzf meles_${VERSION}_linux_amd64.tar.gz meles
# Image (linux/amd64, linux/arm64; no shell, runs as non-root)
docker run --rm ghcr.io/movray/meles:$VERSION version
# Helm chart (see Kubernetes below)
helm install meles oci://ghcr.io/movray/charts/meles --version $VERSION -n meles -f my-values.yaml
# From source
go install github.com/movray/meles/cmd/meles@v$VERSION
تُبنى الملفات الثنائية والصورة والمخطط بواسطة سير عمل الإصدار وتحمل أصل بناء موقّعًا. تُفحص الصورة باستخدام meles وTrivy قبل نشرها. تحقق من الأصل باستخدام GitHub CLI:
gh attestation verify meles_${VERSION}_linux_amd64.tar.gz -R movray/meles
gh attestation verify oci://ghcr.io/movray/meles:$VERSION -R movray/meles
gh attestation verify oci://ghcr.io/movray/charts/meles:$VERSION -R movray/meles
تُوقَّع الصورة والرسم البياني أيضًا باستخدام cosign (بدون مفتاح)، بحيث يمكن لسياسات القبول مثل Kyverno أو Sigstore policy-controller التحقق منها.
التوقيعات عبارة عن حزم Sigstore مخزَّنة كـ OCI referrers: تحقَّق باستخدام
cosign 3 (يحتاج cosign 2 إلى --new-bundle-format):
cosign verify ghcr.io/movray/meles:$VERSION \
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
--certificate-identity-regexp '^https://github.com/movray/meles/\.github/workflows/release\.yml@refs/tags/v'
تحتاج إلى clamd قيد التشغيل. مع apt install clamav-daemon يعثر meles على
مقبسه (/run/clamav/clamd.ctl) من تلقاء نفسه؛ صورة clamav/clamav تعمل
أيضًا (انظر TL;DR؛ يستغرق تحميل التوقيعات دقيقة أو دقيقتين).
meles selftest # checks the whole chain with EICAR test images
# (--yara: also the default YARA rules, if loaded)
meles image alpine:3.20
meles image --format json --platform linux/amd64 ghcr.io/org/app:1.2