Представьте: вы скачали готовый образ с 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).
А вы проверяете свои образы? Если да, то каким инструментом пользуетесь? Делитесь в комментах! :-)
Комментарии (5)

SignFinder
18.10.2025 12:39# Было (опасно!)FROM python:3.9# Стало (безопаснее)FROM python:3.9.18-bookworm # или alpine:3.19"Это как? Почему стало безопаснее, если в теге 3.9 всегда будет последняя версия из 3.9, на текущий момент 3.9.24 на базе Debian 13.Да, минус то, что можно нарваться на атаку цепочки поставок и получить свежий скомпроментированный образ, но с другой стороны - всегда свежий с текущими исправлениями безопасности.
GamePad64
18.10.2025 12:39При переборке если не сделать pull, то подтянется старая закешированная версия образа
avmcoder
А есть сканеры, ищущие уязвимости в контейнерах, сертифицированные ФСТЭК?
Shaman_RSHU
Code Scoring покрывает все потребности. Бесплатного для ФСТЭК естественно не будет :)
А trivy, как и grype очень сильно фолзят - нужно много времени на ручной разбор.
SignFinder
Не уверен насчет ФСТЭК, но у Касперского есть продукт container security.