Представьте: вы скачали готовый образ с Docker Hub, запустили контейнер, и вдруг ваш сервер становится частью ботнета. Как этого избежать?
Рассказываем 3 простых способа сканирования образов
1.Trivy - сканер для ленивых (но эффективный)

Почему его любят:
Работает из коробки (не надо ничего настраивать)
Проверяет не только пакеты, но и конфиги (например, утечки паролей)
Можно запустить одной командой
Как использовать:
# Установка (Linux/macOS)curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin
# Сканирование образа
trivy image ваш-образ:тегПример вывода:
python:3.9 (debian 11.6)
========================
Total: 42 (CRITICAL: 5, HIGH: 12)
libssl1.1 — уязвимость (CVE-2022-4304)
Нужно обновить базовый образ!2.Docker Scout - встроенный сканер от Docker
Плюсы:
Интегрирован прямо в Docker Desktop (не нужны отдельные инструменты)
Показывает «уровень здоровья» образа
Как включить:
Обновите Docker Desktop
В CLI выполните:
docker scout quickview ваш-образ:тегЧто увидите:
Список уязвимостей с критичностью.
Советы по исправлению (например, «используй образ с alpine вместо debian»)
3. GitHub Dependabot - автоматический мониторинг
Для тех, кто хранит Dockerfile в GitHub:
Добавьте файл .github/dependabot.yml:
yaml
version: 2
updates:
- package-ecosystem: "docker"
directory: "/"
schedule:
interval: "daily"Теперь GitHub будет:
Автоматически проверять образы в ваших репозиториях
Присылать PR с обновлениями, если найдёт уязвимости
Рассказываем о 3 правилах безопасности:
Не используйте latest теги, а фиксируйте версии (python: 3:9:18)
Удаляйте ненужные пакеты: чем меньше софта в образе, тем меньше дыр
Регулярно обновляйте базовые образы, старый alpine: 3.12 сегодня опасен!
Теперь вы знаете, как сканировать образы на уязвимости, но что делать с результатами? Как миними��ировать риски? Сейчас разберём продвинутые лайфхаки для параноиков (в хорошем смысле)!
Что делать, если сканер нашёл уязвимости?
Вариант для ленивых: просто обновите базовый образ
Проблема: 90% уязвимостей - это старые пакеты в базовом образе (debian:old, alpine:3.12)
Решение:
dockerfile
# Было (опасно!)
FROM python:3.9
# Стало (безопаснее)
FROM python:3.9.18-bookworm # или alpine:3.19Почему работает:
Новые версии образов содержат исправления для известных CVE.
Вариант для перфекционистов: «собери свой» минимальный образ
Проблема: Официальные образы часто содержат лишние пакеты (например, curl в продакшн-образе, зачем?).
Решение:
dockerfile
# Многослойный билд + только нужные пакеты
FROM python:3.9-slim as builder
# Устанавливаем только необходимые зависимости
RUN pip install --no-cache-dir Flask gunicorn
# Финальный образ (минимум софта)
FROM gcr.io/distroless/python3-debian11
COPY --from=builder /usr/local/lib/python3.9 /usr/local/lib/python3.9
CMD ["app.py"]Плюсы:
Distroless или scratch - образы без shell и лишних пакетов
Даже если уязвимость есть, эксплуатировать её сложнее
Вариант для параноиков: подпись образов (cosign + Sigstore)

Проблема: В Docker Hub можно выложить образ с малварью под видом легального.
Решение:
Генерируем ключ:
cosign generate-key-pairПодписываем образ:
cosign sign --key cosign.key ваш-образ:тегПроверяем перед запуском:
cosign verify --key cosign.pub ваш-образ:тегЗачем это нужно:
Гарантия, что образ не подменили при загрузке.
Используется в Kubernetes для admission control.
Продвинутые инструменты: что еще попробовать?
Инструмент | Для чего | Команда/Пример |
Grype | Сканирование локальных образов | grip ваш-образ |
Clair | Мониторинг уязвимостей в CI/CD | Интеграция с GitLab |
Anchore | Политики безопасности (например, запрет образов с критичными CVE) | anchor-cli evaluate check ваш-образ |
Главное правило безопасности - «Лучше потратить 10 минут на сканирование, чем 10 часов на восстановление после взлома».
Что делать прямо сейчас:
Просканируйте свои продакшн-образы:
bash
trivy image --severity CRITICAL ваш-образ:тегНастройте автоматическое сканирование в CI (например, через GitHub Actions).
А вы проверяете свои образы? Если да, то каким инструментом пользуетесь? Делитесь в комментах! :-)
