Сканирование образов Docker: инструкция по docker scan

Быстрые ссылки
How Scans Work
Scanning an Image
More Advanced Scans
Customizing Scan Output
Limitations
Summary
Docker теперь поставляется с поддержкой встроенного сканирования безопасности. Вы можете локально просканировать свои контейнерные образы, чтобы выявить возможные уязвимости. Это ускоряет цикл разработки, давая более оперативную обратную связь по сравнению с CI-пайплайнами и облачными сервисами.
Команда
scanдоступна по умолчанию начиная с Docker версии 20.10. Docker сотрудничает с Snyk для интеграции сканирования в CLI. При первом запуске команды появится одноразовый запрос на согласие. Введите “y” и нажмите Enter, чтобы подтвердить интеграцию с Snyk.
Помимо согласия с Snyk, для сканирования контейнеров требуется вход в Docker Hub. Выполните
docker loginи укажите своё имя пользователя и пароль перед началом сканирования.

Попробуйте выполнить
docker scan --versionчтобы проверить установку. Вы увидите номер версии плагина
scanи провайдера сканирования (в настоящее время Snyk). В будущем могут появиться дополнительные провайдеры.
Как работают сканы
docker scan принимает имя образа как параметр. Команда просканирует образ по базе данных уязвимостей Snyk. Покрывается широкий спектр проблем: от устаревших базовых образов до эксплойтов в open-source библиотеках, которые вы используете.
Snyk может указать строку Dockerfile, которая ввела уязвимость. Это даёт вам конкретную точку входа для исправления. Результаты отображаются прямо в терминале после завершения сканирования.
База данных Snyk постоянно обновляется. Не полагайтесь на единственный успешный результат — внешний мир и новые CVE меняют картину со временем. Регулярные сканы помогают поддерживать безопасность рабочих нагрузок.
Сканирование образа
Самый простой способ — передать тег образа в docker scan:
docker scan hello-world:latestСканирование может занять несколько секунд; большие образы потребуют больше времени. Результат появится в терминале. Пример успешного сканирования показан выше.

Когда проблем нет, вывод может выглядеть успокаивающе. Однако реальная ценность команды проявляется при обнаружении уязвимостей: каждая запись содержит краткое описание, уровень серьёзности и ссылку на подробную информацию на сайте Snyk.
Более продвинутые сканы
docker scan обладает дополнительной функциональностью, доступной через флаги.
Самый полезный флаг — --file, который принимает путь к Dockerfile образа. Если вы передаёте Dockerfile, Snyk может выполнить более детальный анализ, используя инструкции внутри. Некоторые возможности сканирования, например обнаружение устаревшей базовой версии образа, доступны только при указании Dockerfile.
docker scan hello-world:latest --file DockerfileЭто выдаст что-то вроде:
Tested 100 dependencies for known issues, found 50 issues.Последняя строка укажет, является ли базовый образ — инструкция FROM в вашем Dockerfile — безопасным. Если базовый образ устарел или содержит решённые уязвимости, Snyk предложит альтернативные теги.
Иногда удобно игнорировать уязвимости в базовом образе, например если базовый образ содержит множество низкосерьёзных проблем и нет пути обновления. Для этого используйте флаг --exclude-base. Он исключит слой базового образа и поможет сосредоточиться на проблемах внутри ваших слоёв.
Важно: исключение базового образа снижает объём «шума», но может скрыть реальные риски. Применяйте
--exclude-baseтолько осознанно.
Настройка вывода сканирования
docker scan поддерживает несколько вариантов формата вывода. По умолчанию вывод ориентирован на людей и показывает список проблем в терминале.
Флаг --json заставляет команду вывести «сырые» JSON-данные, которые удобно обрабатывать в CI или внешних инструментах. Это полезно, если вы хотите автоматически парсить результаты и принимать решения на основе структурированных данных.

Опция --dependency-tree выведет древовидное представление зависимостей образа над списком уязвимостей. Это помогает визуализировать, как пакеты попадают в образ, и найти корневые причины проблем.
Флаг --severity фильтрует уязвимости по уровню серьёзности: low, medium, high. Команда покажет только уязвимости с указанным уровнем или выше.
docker scan my-app:1.2.3 --severity high --json --file DockerfileЭтот пример покажет только серьёзные проблемы в формате JSON с учётом Dockerfile.
Ограничения
На текущий момент docker scan не поддерживает дистрибутивы Alpine Linux. Кроме того, в плагине версии 0.7 есть серьёзная ошибка, из-за которой локальные сканы завершаются ошибкой «image not found». Версия v0.7 может сканировать только образы, доступные в Docker Hub или других публичных реестрах. Проблема исправлена в v0.8, но на Linux распостраняется v0.7.
Помимо технических ограничений, сервис Snyk накладывает жёсткие лимиты на использование docker scan. Без входа через Snyk вы получаете 10 бесплатных сканов в месяц; при входе через Snyk лимит увеличивается до 200 сканов в месяц.

Выполните docker scan --login, чтобы получить уникальный URL для входа. Скопируйте его в браузер и выполните шаги аутентификации. Можно войти через Docker Hub или несколько сторонних провайдеров. После входа в UI появится кнопка “Authenticate”; нажмите её, вернитесь в терминал и убедитесь, что появилось сообщение “Snyk is now ready to be used”.
Шпаргалка флагов (чек-лист команд)
--file— путь к Dockerfile для более детального анализа.--exclude-base— исключает слои базового образа из проверки.--json— выводит результат в JSON для автоматизированной обработки.--dependency-tree— показывает древовидную структуру зависимостей.--severity— фильтрует по уровню серьёзности.--login— инициирует аутентификацию в Snyk через браузер.--version— показывает версию плагинаscan.
Чек-лист перед сканированием (роль-ориентированный)
Разработчик:
- Убедиться, что локальный
Dockerfileактуален. - Выполнить
docker loginв Docker Hub. - Запустить
docker scanс--fileдля более точного результата.
DevOps инженер:
- Проверить версию плагина:
docker scan --version. - Планировать регулярные сканирования в CI для крон-проверок.
- Автоматизировать оповещения при появлении high/critical уязвимостей.
Команда безопасности:
- Настроить политики приёмки для допустимых уровней риска.
- Поддерживать список исключений и документировать причины.
- Контролировать использование
--exclude-base.
Критерии приёмки
- Сканы выполняются для всех сборок в CI не реже одного раза в сутки.
- Уязвимости уровня
highиcriticalсоздают тикет в системе отслеживания задач. - Для production-образов уровень
severityне должен быть нижеmediumбез исключения, задокументированного в репозитории. - Документы с предложениями по обновлению базовых образов или зависимостей доступны команде разработки.
Когда сканирование дает ограниченную информацию (когда метод не работает)
- Если образ построен на основе Alpine —
docker scanможет не поддерживать этот дистрибутив. - Если плагин
scanстарой версии (v0.7) и образ локальный — может возникнуть ошибка «image not found». - Если отсутствует
Dockerfile, некоторые проверки, такие как устаревшая базовая версия, могут быть недоступны. - Если вы исчерпали лимиты Snyk, новые сканы могут быть заблокированы или ограничены.
Риски и меры смягчения
Риск: Пропуск уязвимостей в базовом образе при использовании --exclude-base.
- Мера: Проводить независимые проверки базовых образов и план обновлений.
Риск: Ограничение по количеству сканов в Snyk.
- Мера: Планировать сканирование критичных образов, использовать CI для контролируемого количества проверок, рассмотреть платный план Snyk для команды.
Риск: Неполный охват Alpine и некоторых пользовательских пакетов.
- Мера: Использовать дополнительные инструменты сканирования, ориентированные на конкретные дистрибутивы, или применять системные обновления и hardening.
Мини-методология для интеграции в процесс разработки
- Локальная проверка: разработчик запускает
docker scan --file Dockerfileперед PR. - Проверка в CI: при каждом PR запускать
docker scan --jsonи парсить результат для автоматического создания комментариев/тикетов. - Принятие решений: для
high/criticalблокировать слияние до устранения, дляmedium— фиксировать план исправления. - Мониторинг: повторять полные сканы еженедельно для образов в продакшене.
Краткое руководство по устранению уязвимостей
- Проверить, какая строка
Dockerfileуказана Snyk как источник уязвимости. - Обновить зависимость или базовый образ до рекомендованного тега.
- Пересобрать образ локально и повторно просканировать.
- Если обновление невозможно, задокументировать причину и смягчить риск (ограничения привилегий, runtime hardening).
Короткий глоссарий
- Dockerfile — файл с инструкциями для сборки образа Docker.
- Base image — базовый образ, указанный в
FROM. - Dependency tree — древовидная модель зависимостей пакетов в образе.
- Snyk — провайдер базы данных уязвимостей, интегрированный с
docker scan.
Примеры использования и шаблоны
Скрипт для CI (bash) — пример автоматического парсинга JSON и создания ошибки при серьёзных уязвимостях:
#!/bin/bash
set -e
OUTPUT=$(docker scan my-app:ci --file Dockerfile --json)
# Пример парсинга: если в JSON есть issues с severity="high" — завершить с ошибкой
if echo "$OUTPUT" | jq '.vulnerabilities[] | select(.severity=="high")' | grep -q .; then
echo "Found high severity vulnerabilities. Failing build."
exit 1
fi(Сохраните этот шаблон как часть CI-конфигурации и адаптируйте под ваш пайплайн.)
Сводка
Встроенная команда docker scan упрощает обнаружение уязвимостей в контейнерных образах и даёт разработчикам быстрый feedback. Для максимально точных результатов указывайте Dockerfile, используйте --dependency-tree для понимания причин и --json для автоматизации. Не забывайте про ограничения: Alpine поддерживается частично, а старые версии плагина могут давать ошибки. Планируйте регулярные сканы и интегрируйте их в CI, чтобы поддерживать надёжную безопасность контейнеров.
Похожие материалы
Как навсегда удалить канал YouTube
Оптимизация Diablo Immortal на мобильных
Переместить резервную копию iPhone на внешний диск
Шифрование резервных копий iPhone и iPad
Символическая ссылка: что это и как создать