
Сканер вредоносного ПО для образов контейнеров: без демона, с учётом слоёв, ClamAV и YARA
meles — это сканер вредоносного ПО для образов контейнеров: одна команда для ссылки на образ, без демона Docker, коды выхода, удобные для CI. В Kubernetes он также сканирует каждый образ, который запускают ваши поды, и, при желании, задерживает новые поды до тех пор, пока их образ не будет просканирован.
meles проверяет, что содержит образ, до его запуска. Он дополняет сканеры уязвимостей и обнаружение во время выполнения, такие как Falco; он не заменяет ни то, ни другое.
Название происходит от Meles meles, европейского барсука — он прокапывается сквозь слои.
meles image <ref> проваливает конвейер, когда
находит вредоносное ПО. Вывод в виде таблицы, JSON или SARIF, с
правилами игнорирования для ложных срабатываний.MalwareReport рядом с рабочей нагрузкой, с опциональными оповещениями 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
Или в кластере (cluster admin, 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/
Оператор теперь извлекает и сканирует образ каждого пода, что расходует
лимиты на извлечение ваших реестров; он только сообщает и не трогает
ваши поды. Отчёты появляются в течение нескольких минут. Очень большой бинарный файл может оказаться в состоянии
Incomplete, что никогда не означает чистоту: см.
Чтение результатов.
Port-forward — лишь самый быстрый способ взглянуть. Для постоянного использования
откройте UI через server.ingress или server.httpRoute и поставьте перед ним логин
с помощью server.oauth2Proxy, всё в values чарта:
Логин для веб-интерфейса. У meles нет собственного
логина, поэтому не открывайте UI без него.
Пошаговый обзор, от файла, скрытого более поздним слоем, до шлюза сканирования в Kubernetes: docs/getting-started.md.
clamd из ClamAV через его сокетный протокол. meles не
линкуется с libclamav и остаётся под лицензией Apache-2.0.По умолчанию meles только сообщает и никогда ничего не удаляет. Он не заменяет подпись образов, SBOM или обнаружение во время выполнения.
Каждый релиз поставляется с бинарными файлами для Linux и macOS (amd64, arm64), мультиархитектурным образом и Helm- чартом:
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 (keyless), поэтому политики допуска, такие как Kyverno или Sigstore policy-controller, могут их проверять. Подписи представляют собой бандлы Sigstore, хранящиеся как OCI referrers: проверяйте с помощью cosign 3 (cosign 2 требует --new-bundle-format):