До основного вмісту

Trivy: перевірка Docker-образів на вразливості

Безпека · 31.10.2026 · 5 хв читання
Ілюстрація до статті «Trivy: перевірка Docker-образів на вразливості»

Docker-образ — це набір шарів з операційною системою, бібліотеками та вашим застосунком, і в кожному з них можуть опинитися пакети з відомими вразливостями. Trivy зіставляє вміст образу з базою вразливостей і показує, які пакети зачеплено та в якій версії проблему виправлено. Нижче — встановлення, запуск, читання звіту та вбудовування перевірки у збірку.

Що перевіряє Trivy

Trivy вміє аналізувати образи контейнерів, каталоги з проєктом, файли конфігурації та репозиторії. Він визначає пакети операційної системи й залежності застосунку: npm, Composer, pip та інші. Важливо розуміти межу: сканер знаходить лише вже опубліковані вразливості, вразливості власного коду й невідомі діри він не покаже.

РежимКомандаЩо перевіряється
Образtrivy imageПакети ОС і залежності всередині образу
Файлова системаtrivy fsКаталог проєкту, lock-файли, секрети
Конфігураціяtrivy configDockerfile, Compose, маніфести

Встановлення

Trivy можна встановити пакетом із репозиторію проєкту (інструкції для вашого дистрибутива є в документації Trivy) або запустити просто з контейнера, нічого не встановлюючи на сервер. У другому разі сокет Docker передається всередину, щоб сканер бачив локальні образи. Під час першого запуску він завантажує базу вразливостей і зберігає її в кеші, тому перший запуск триваліший за наступні.

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock aquasec/trivy image nginx:latest
trivy --version

Сканування образу та файлової системи

Для образу досить указати його ім'я. Без фільтрів звіт виходить довгим, тому на практиці обмежують рівень серйозності й ховають вразливості, для яких виправлення ще не випущено: з ними ви однаково нічого не зробите. Результат можна зберегти в JSON для подальшої обробки.

trivy image myapp:1
trivy image --severity HIGH,CRITICAL myapp:1
trivy image --severity HIGH,CRITICAL --ignore-unfixed myapp:1
trivy image --format json -o result.json myapp:1

Для проєкту на диску використовуйте режим fs: він читає файли залежностей і знаходить проблемні версії бібліотек ще до збирання образу. Режим config перевіряє самі Dockerfile і маніфести на небезпечні налаштування.

trivy fs .
trivy fs --scanners vuln,secret,misconfig .
trivy config .

Як читати звіт

У таблиці звіту вказано пакет, ідентифікатор CVE, встановлену версію, версію з виправленням і серйозність. Рівні серйозності: UNKNOWN, LOW, MEDIUM, HIGH і CRITICAL. Порожнє поле з виправленням означає, що постачальник пакета його ще не випустив. Не кожна знайдена вразливість досяжна у вашій конфігурації: пакет може бути в образі, але не запускатися. Рішення про терміновість ухвалюйте, оцінивши реальну доступність із мережі.

  • Спершу розбирайте CRITICAL і HIGH з доступним виправленням.
  • Якщо виправлення немає, перевірте, чи використовується пакет, і за можливості приберіть його з образу.
  • Заведіть файл .trivyignore для свідомих винятків і записуйте причину в коментарі.
  • Переглядайте винятки регулярно: ситуація та база вразливостей змінюються.

Ігнор-лист і вбудовування у збірку

Файл .trivyignore містить по одному ідентифікатору на рядок, рядки з решіткою — коментарі. Ідентифікатори в прикладі умовні, підставте реальні зі свого звіту. Для автоматичної перевірки використовуйте код повернення: параметр --exit-code 1 змушує Trivy завершитися помилкою, якщо знайдено вразливості обраної серйозності, і збірка в CI зупиниться.

# .trivyignore
# CVE-YYYY-NNNNN  not reachable from the network, review later
CVE-YYYY-NNNNN
docker build --pull --no-cache -t myapp:2 .
trivy image --exit-code 1 --severity CRITICAL myapp:2
echo $?

Вразливість у базовому образі та перезбирання

Більшість знайдених проблем лежить не у вашому коді, а в базовому образі з рядка FROM: у пакетах ОС і системних бібліотеках. Ви не можете виправити їх усередині працюючого контейнера, бо образ незмінний. Лікування одне: отримати оновлений базовий образ і перезібрати свій. Параметр --pull змушує Docker завантажити свіжу версію базового образу, а --no-cache не дає використовувати старі шари. Конкретний приклад перезбирання розібрано в статті PHP у Docker: як закрити PHP2Shell перезбиранням образу.

Проскановані образи зручно зберігати й повторно перевіряти у власному сховищі: про це написано в матеріалі Приватний Docker Registry на власному сервері. Якщо ви лише знайомитеся з поняттями, почніть зі статті Образ Docker і контейнер: у чому різниця.

Часті питання

Чим Trivy відрізняється від docker scan?

Trivy — самостійний сканер з відкритим кодом, він працює без прив'язки до конкретної версії Docker, вміє перевіряти образи, каталоги та конфігурації й легко вбудовується в CI. Він придатний і для серверів без графічного клієнта: досить командного рядка та доступу до бази вразливостей під час оновлення.

Чому у свіжому образі все одно є вразливості?

База вразливостей поповнюється щодня, а образ фіксує стан пакетів на момент збирання. Новий запис у базі може з'явитися вже наступного дня, навіть якщо ви нічого не змінювали. Тому образи треба перевіряти регулярно, а не один раз перед викладанням.

Чи треба виправляти кожну знайдену вразливість?

Ні, починати треба з критичних і тих, для яких уже є виправлення. Частина записів стосується пакетів, які не запускаються або недоступні з мережі. Такі випадки розумно вносити в .trivyignore з поясненням і переглядати пізніше, не залишаючи без уваги назавжди.

Як виправити вразливість у базовому образі?

Оновіть базовий образ і перезберіть свій: docker build з параметром --pull завантажить свіжу версію, а --no-cache вимкне застарілі шари. Потім повторіть сканування й перезапустіть контейнери з нового образу. Оновлення пакетів усередині вже запущеного контейнера не зберігається й не замінює перезбирання.

Чи була стаття корисною?
← Назад до бази знань Поставити питання підтримці