Trivy — открытый сканер безопасности от Aqua Security. Он проверяет контейнерные образы, файловые системы, репозитории, конфигурации Kubernetes и Terraform, ищет секреты и формирует SBOM. Сканер не требует агента, работает как один бинарник и встраивается в CI. Разберём установку, команды, пороги для сборки, ложные срабатывания и место сканера в процессе выпуска.
Что ищет Trivy
Сканер сопоставляет пакеты с базами уязвимостей, проверяет конфигурации и ищет оставленные ключи. Находка означает потенциальную проблему, а не доказанную эксплуатацию. Решение о блокировке сборки принимает команда, исходя из критичности и контекста.
- уязвимости ОС и языковых зависимостей в образе;
- секреты в файлах и истории репозитория;
- ошибки конфигурации Dockerfile, Kubernetes и Terraform;
- состав образа в форматах CycloneDX и SPDX.
Установка и обновление баз
Быстрее всего установить официальным скриптом в /usr/local/bin. База уязвимостей скачивается при первом запуске и обновляется автоматически; в закрытых сетях поднимите собственный сервер.
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh \
| sudo sh -s -- -b /usr/local/bin
trivy --version
trivy image --download-db-only
Первое сканирование дольше: загружаются базы и слой образа. Дальше результаты берутся из кеша. Для воспроизводимости в CI фиксируйте версию Trivy.
Сканирование образа
Базовая команда показывает пакет, версию, CVE, критичность и версию с исправлением. Если исправления нет, это видно в статусе. Для оценки риска смотрите не только на CVSS, но и на доступность исправления и сетевую доступность сервиса.
trivy image nginx:1.27
trivy image --severity HIGH,CRITICAL myapp:1.0
trivy image --ignore-unfixed --severity CRITICAL myapp:1.0
trivy image --scanners vuln,secret myapp:1.0
Сканируйте образ, который уходит в production. Тег latest неудобен: результат меняется без изменения кода. Используйте неизменяемые теги или digest, тогда отчёт привязан к конкретной сборке.
Фильтры, код возврата и CI
Для автоматической проверки задайте --exit-code 1: при находках команда завершится с ошибкой и остановит конвейер. Начинайте с CRITICAL, затем добавьте HIGH после устранения основного долга. Не блокируйте все уровни сразу — сборка начнёт падать из-за старых зависимостей.
trivy image --exit-code 1 --severity CRITICAL myapp:1.0
trivy image --exit-code 1 --severity HIGH,CRITICAL --ignore-unfixed myapp:1.0
trivy image --format json --output report.json myapp:1.0
trivy image --format sarif --output trivy.sarif myapp:1.0
Формат SARIF понимают GitHub Code Scanning и другие системы. JSON удобен для обработки, таблица — для чтения. Сохраняйте отчёт как артефакт: по нему можно сравнить сборки.
Файлы, секреты и конфигурации
Сканер работает не только с образами. Проверка каталога ловит секреты в исходниках, а проверка инфраструктурного кода — открытые порты, привилегированные контейнеры и отсутствие лимитов. Это дешевле, чем находить проблемы в работающем кластере.
trivy fs --scanners vuln,secret,misconfig .
trivy config --severity HIGH,CRITICAL .
trivy repo https://github.com/example/project
trivy fs --scanners secret --exit-code 1 .
Секреты в истории Git ищите отдельно, а найденный ключ немедленно отзывайте. Удаление файла из последнего коммита не убирает его из истории. Trivy не заменяет ротацию учётных данных и проверку прав.
SBOM и лицензии
SBOM описывает состав образа и полезен для аудита цепочки поставок. Формируйте его при сборке и храните рядом с артефактом. При новой уязвимости вы быстро найдёте затронутые образы по компоненту и версии.
trivy image --format cyclonedx --output sbom.json myapp:1.0
trivy sbom sbom.json
trivy image --scanners license myapp:1.0
trivy image --format spdx-json --output sbom.spdx.json myapp:1.0
Лицензионная проверка помогает заметить компоненты с несовместимыми условиями, но не заменяет юридическую консультацию. Спорные случаи разбирайте с ответственными за лицензирование.
Конфигурация и исключения
Параметры удобно вынести в trivy.yaml, а подтверждённые ложные срабатывания — в .trivyignore. Каждое исключение сопровождайте причиной и датой пересмотра: иначе список скрывает реальные риски.
cat > trivy.yaml <<'EOF'
severity:
- HIGH
- CRITICAL
ignore-unfixed: true
exit-code: 1
format: table
EOF
cat > .trivyignore <<'EOF'
# CVE-2024-0000: не используется в нашем сценарии, пересмотр 2026-06-01
CVE-2024-0000
EOF
Не игнорируйте уязвимость только потому, что она мешает сборке. Проверьте, вызывается ли уязвимый код, есть ли компенсирующие меры и когда выйдет исправление. Для подтверждения анализа можно использовать VEX-документы.
Пример для GitHub Actions
Действие Trivy запускается после сборки и перед публикацией. Отчёт в SARIF загружается в Code Scanning, а exit-code останавливает конвейер при критических находках. Тег действия обновляйте вместе с зависимостями.
- name: Scan image
uses: aquasecurity/trivy-action@0.28.0
with:
image-ref: ghcr.io/org/app:${{ github.sha }}
format: sarif
output: trivy-results.sarif
severity: CRITICAL,HIGH
exit-code: '1'
- name: Upload SARIF
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: trivy-results.sarif
Для приватных образов передайте учётные данные через секреты репозитория. Ограничьте права токена чтением пакетов.
Кластер и центральный сервер
В Kubernetes Trivy сканирует рабочие нагрузки и отдаёт сводку. В больших организациях разворачивают trivy server с базами и кешем, а клиенты обращаются к нему по сети. Это ускоряет сборки и снижает число внешних обращений.
trivy k8s --report summary cluster
trivy server --listen 0.0.0.0:4954
trivy client --remote http://trivy.internal:4954 image myapp:1.0
trivy image --server http://trivy.internal:4954 myapp:1.0
Сервер размещайте во внутренней сети и защищайте сетевыми политиками: открытый сканер раскрывает состав инфраструктуры.
Ограничения и рабочий процесс
- базы не знают о контексте: часть находок окажется неэксплуатируемой;
- исправление может отсутствовать, тогда нужна компенсирующая мера;
- образ нужно пересобирать после выхода обновлений базовых пакетов;
Цикл простой: собрали образ, просканировали, разобрали CRITICAL и HIGH, обновили базовый образ и зависимости, пересобрали. Раз в месяц пересматривайте исключения и порог.
Чек-лист внедрения
- Trivy закреплён в CI и запускается на каждый образ;
- порог блокировки начинается с CRITICAL и постепенно расширяется;
- отчёты сохраняются как артефакты и доступны команде;
- секреты и конфигурации проверяются отдельно от уязвимостей;
- исключения имеют причину, владельца и дату пересмотра.
Итог
Trivy закрывает базовую гигиену контейнерной безопасности без сложной инфраструктуры. Он показывает уязвимые пакеты, случайные секреты и опасные настройки, а отчёты легко встроить в CI. Но сканер не принимает решения за инженера: находки нужно разбирать, исправления — выпускать, исключения — пересматривать. Только так проверка снижает риск, а не создаёт видимость контроля.