Как проверить безопасность Docker контейнеров без лишней головной боли
Недавно исследователи безопасности нашли на Docker Hub более четырех миллионов пустых контейнеров-пустышек и сотни тысяч образов со скрытыми криптомайнерами. Мы привыкли тянуть базовые образы или сторонние зависимости одной командой docker pull, редко задумываясь, что внутри слоев может скрываться не просто уязвимый пакет, а зашитый токен доступа к чужой инфраструктуре или скрипт побега из песочницы.
Для проверки образов обычно берут Trivy, Grype или Clair. Они неплохо ищут известные CVE в системных пакетах, но часто пропускают тонкие вещи вроде плохих настроек рантайма, утекших API-ключей и свежих векторов атак на цепочки поставок.
Проект dockerscan от испанского исследователя Даниэля Гарсии (cr0hn) решает эту проблему комплексным аудитом. Первая версия утилиты была написана на Python еще в 2017 году и работала неспешно, но во второй версии автор полностью переписал движок на Go, увеличил скорость в 10 раз и объединил в одном бинарнике сканирование уязвимостей, поиск секретов и аудит конфигураций.
Что внутри нового DockerScan
Вместо того чтобы запускать по очереди три разные утилиты для проверки образов, dockerscan запускает комплексную диагностику сразу по нескольким направлениям.
Инструмент совмещает пять модулей анализа:
- Бенчмарк CIS Docker v1.7.0. Проверяет более 80 параметров безопасности, включая запуск от пользователя root, лишние открытые порты, отсутствие директивы HEALTHCHECK и корректность системных прав на файлы.
- Детектор атак на цепочку поставок. Ищет следы популярных кампаний последних лет: скрытые майнеры (вроде xmrig), бэкдоры в системных библиотеках (по следам инцидента с xz-utils), фишинговые тексты и контейнеры без реальных слоев.
- Поиск зашитых секретов. Распознает более 40 форматов ключей и токенов (AWS, GCP, OpenAI, Stripe, приватные SSH-ключи, строки подключения к базам данных). Неизвестные токены отлавливаются через расчет энтропии Шеннона с порогом выше 4.5.
- База уязвимостей CVE. Отслеживает опасные уязвимости побега из контейнеров (CVE-2024-21626 в runc), проблемы BuildKit и устаревшие базовые образы. База собирается из официального снапшота MITRE cvelistV5, так что утилита не упирается в лимиты API NVD.
- Аудит безопасности рантайма. Проверяет опасные Linux capabilities (например, CAP_SYS_ADMIN), профили Seccomp и AppArmor, а также флаги изоляции пространств имен.
В версии 2.1.0 автор исправил важный баг предыдущих сборок v2.0.x, из-за которого поиск уязвимостей пакетов молча выдавал ноль находок. Теперь сопоставление версий пакетов идет по правилам dpkg с учетом дистрибутивных бэкпортов.
Быстрый старт и запуск проверок
Утилита распространяется в виде готового бинарника под Linux, macOS и Windows. Никаких зависимостей тянуть не нужно.
Установка на Linux amd64 выполняется в три строчки:
curl -L https://github.com/cr0hn/dockerscan/releases/latest/download/dockerscan-linux-amd64 -o dockerscan
chmod +x dockerscan
sudo mv dockerscan /usr/local/bin/
Перед первым запуском скачиваем локальную базу CVE:
dockerscan update-db
База обновляется ежедневно через GitHub Actions и весит в сжатом виде около 30 МБ. После этого можно натравить сканер на любой локальный или удаленный образ:
dockerscan nginx:latest
Если вас интересуют только конкретные проверки, например поиск секретов и соответствие CIS Benchmark, модули можно ограничить флагом --scanners:
dockerscan --scanners cis,secrets ubuntu:22.04
Для скриптов автоматизации пригодится тихий режим -q и фильтрация по уровню опасности:
dockerscan -q --only-critical my-app:prod
Работа с приватными реестрами
Частая беда многих сканеров заключается в неудобной авторизации в закрытых репозиториях. В dockerscan поддержали все популярные сценарии: Docker Hub, GHCR, AWS ECR, Google Artifact Registry, Azure ACR и GitLab.
Если вы уже авторизованы через docker login, утилита автоматически подтянет токены из ~/.docker/config.json. При этом поддерживаются системные хелперы учетных данных (osxkeychain на macOS, wincred на Windows и pass на Linux).
Для CI/CD пайплайнов удобнее передавать учетные данные через переменные окружения:
export DOCKER_USERNAME=ci-bot
export DOCKER_PASSWORD=ghp_secret_token_here
dockerscan ghcr.io/my-org/private-service:v1.2.0
Утилита выставляет понятные exit-коды: 0 при чистом отчете, 1 при наличии проблем уровня High и 2 при обнаружении критических уязвимостей. Это позволяет останавливать сборку пайплайна сразу при нахождении опасного бага.
Встраивание в CI/CD и отчетность
Результаты проверки dockerscan сохраняет в форматах JSON и SARIF. Формат SARIF нативно понимают GitHub Security, GitLab и Azure DevOps, поэтому найденные проблемы сразу отображаются в интерфейсе пулл-реквестов.
Пример шага для GitHub Actions:
name: Security Scan
run: |
./dockerscan update-db
./dockerscan -q myapp:${{ github.sha }}
name: Upload SARIF report
uses: github/codeql-action/upload-sarif@v2
if: always()
with:
sarif_file: dockerscan-report.sarif
Лицензия и ограничения
На лицензию проекта стоит обратить отдельное внимание. Автор выбрал модель Source-Available. Исходный код полностью открыт, утилиту можно бесплатно использовать для внутренних нужд компании, встраивать в личные CI/CD пайплайны, применять на аудитах и пентестах. Запрещено только одно: упаковывать dockerscan в коммерческий SaaS и продавать как платную облачную услугу сканирования без согласования с автором.
Стоит ли переходить на DockerScan
Если вам нужен быстрый статический анализ образов в связке с проверкой прав контейнера и поиском утекших токенов, dockerscan закрывает эти задачи одной командой. Утилита потребляет около 50-100 МБ оперативной памяти и работает заметно быстрее старых Python-решений.
Инструмент отлично подойдет DevOps-инженерам и специалистам по безопасности для регулярного аудита продакшен-образов и добавления жестких проверок в пайплайны развертывания. Начать знакомство лучше с запуска на паре своих рабочих контейнеров, чтобы оценить реальное количество скрытых предупреждений CIS Benchmark.
