Образ містить не лише ваш код, а й базову ОС, системні бібліотеки, PHP і розширення, Composer- і npm-залежності. У кожному шарі можуть бути відомі вразливості (CVE).
Інструменти сканування:
docker scout cves myapp:1.4 # Docker Scout (вбудований у Docker CLI)
docker scout quickview myapp:1.4 # коротке зведення з порадами
trivy image myapp:1.4 # Trivy від Aqua Security - відкритий і популярний у CI
grype myapp:1.4 # Grype від Anchore
Сканер визначає пакети в образі (за базами пакетного менеджера ОС і файлами залежностей мов) і зіставляє їх з базами вразливостей.
Як вбудувати в процес:
- у CI на кожне збирання: падати на вразливостях рівня
CRITICAL/HIGH, для яких є виправлення (trivy image --severity HIGH,CRITICAL --ignore-unfixed --exit-code 1); - регулярне сканування вже зібраних образів - нові CVE з'являються щодня, а образ, чистий тиждень тому, сьогодні може бути вразливим;
- SBOM (перелік компонентів образу) -
docker scout sbomчиsyft: швидко зрозуміти, де використовується вразлива бібліотека, коли виходить нове повідомлення.
Що робити з результатами - не намагатися виправити все:
- оновити базовий образ - найчастіше прибирає більшість знахідок. Закріплюйте мінорну версію (
php:8.5-fpm-alpine) і регулярно перезбирайте; - менший образ - менше вразливостей: Alpine,
-slim, distroless, multi-stage без інструментів збирання у фінальному образі; - оцінювати досяжність: вразливість у бібліотеці, яку застосунок не викликає, чи в пакеті, що потрапив в образ випадково, - менш пріоритетна, ніж у вебсервері;
- документувати свідомі винятки (VEX, файл ігнорування з причиною й датою перегляду), щоб звіт лишався корисним, а не з сотнею проігнорованих рядків.
Пастки:
- «нуль CVE» - не мета: багато знахідок у базових ОС не мають виправлень або не стосуються вашого використання;
- сканер бачить лише відомі пакети: бінарні файли, скопійовані вручну (
curl ... | tar), часто невидимі для нього; - автоматичні оновлення (Dependabot, Renovate) для базових образів і залежностей роблять процес постійним, а не авральним.