Docker-образ — це набір шарів з операційною системою, бібліотеками та вашим застосунком, і в кожному з них можуть опинитися пакети з відомими вразливостями. Trivy зіставляє вміст образу з базою вразливостей і показує, які пакети зачеплено та в якій версії проблему виправлено. Нижче — встановлення, запуск, читання звіту та вбудовування перевірки у збірку.
Що перевіряє Trivy
Trivy вміє аналізувати образи контейнерів, каталоги з проєктом, файли конфігурації та репозиторії. Він визначає пакети операційної системи й залежності застосунку: npm, Composer, pip та інші. Важливо розуміти межу: сканер знаходить лише вже опубліковані вразливості, вразливості власного коду й невідомі діри він не покаже.
| Режим | Команда | Що перевіряється |
|---|---|---|
| Образ | trivy image | Пакети ОС і залежності всередині образу |
| Файлова система | trivy fs | Каталог проєкту, lock-файли, секрети |
| Конфігурація | trivy config | Dockerfile, 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-NNNNNdocker 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 вимкне застарілі шари. Потім повторіть сканування й перезапустіть контейнери з нового образу. Оновлення пакетів усередині вже запущеного контейнера не зберігається й не замінює перезбирання.