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. Но сканер не принимает решения за инженера: находки нужно разбирать, исправления — выпускать, исключения — пересматривать. Только так проверка снижает риск, а не создаёт видимость контроля.

Насколько публикация полезна?

Нажмите на звезду, чтобы оценить!

Средняя оценка 0 / 5. Количество оценок: 0

Оценок пока нет. Поставьте оценку первым.

Поделиться: Telegram ВКонтакте