Установка Trivy#

# macOS
brew install aquasecurity/trivy/trivy

# Ubuntu/Debian
sudo apt-get install wget apt-transport-https gnupg lsb-release
wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo apt-key add -
echo deb https://aquasecurity.github.io/trivy-repo/deb $(lsb_release -sc) main | sudo tee -a /etc/apt/sources.list.d/trivy.list
sudo apt-get update
sudo apt-get install trivy

# скачать напрямую
wget https://github.com/aquasecurity/trivy/releases/latest/download/trivy_0.51.2_Linux-64bit.tar.gz
tar -xzf trivy_0.51.2_Linux-64bit.tar.gz
sudo mv trivy /usr/local/bin/

Обновление БД:

trivy image --download-db-only
# или
trivy image --refresh

Подготовить образы#

Скачать образы с Docker Hub:

docker pull nginx:latest
docker pull alpine:latest
docker pull python:3.9-slim

Скачать и сохранить как архив tar:

docker pull nginx:latest
docker pull alpine:latest
docker save nginx:latest -o nginx.tar 
docker save alpine:latest -o alpine.tar 

# Сразу несколько образов в 1 архив
docker save nginx:latest alpine:latest -o multiple-images.tar

Сканирование#

Сканировать образы в Docker демоне:

trivy image nginx:latest

# прямой скан сразу в реестре
trivy image docker.io/nginx:latest

# выбор выходного формата
trivy image --format table nginx:latest
trivy image --format json nginx:latest > scan_results.json
trivy image --format sarif nginx:latest > scan_results.sarif

# выбор критичности выводимых данных
trivy image --severity HIGH,CRITICAL nginx:latest

# игнорировать уязвимости без фикса
trivy image --ignore-unfixed nginx:latest

# сканирование в частном реестре (после входа в него)
docker login private-registry.example.com
trivy image private-registry.example.com/myapp:latest

Пропуск выбранных уязвимостей:

# создать файл .trivyignore и вписать имена уязвимостей
echo "CVE-2021-12345" >> .trivyignore
echo "CVE-2021-67890" >> .trivyignore

# сканировать
trivy image myimage:latest

Скан rootless контейнеров через сокет Docker-а:

DOCKER_HOST=unix://$XDG_RUNTIME_DIR/docker.sock trivy image nginx:latest

Сканировать образы в архивах tar:

trivy image --input nginx.tar

Создание Software Bill of Materials (SBOM):

# формат SPDX
trivy image --format spdx nginx:latest > sbom.spdx.json

# формат CycloneDX
trivy image --format cyclonedx nginx:latest > sbom.cyclonedx.json

# создание SBOM в JSON + сканирование
trivy image --format json --scanners vuln,sbom nginx:latest > full_scan.json

Интеграция с CI/CD:

# остановить конвеер в случае критичной уязвимости
trivy image --exit-code 1 --severity CRITICAL myapp:latest

# создание артифакта сборки для GitLab
trivy image --format gitlab myapp:latest > container-scanning-report.json

Скриптование#

Скан всех образов реестра в цикле:

for image in $(docker images --format "{{.Repository}}:{{.Tag}}"); do
  echo "Scanning $image"
  trivy image --format table $image
done