Sécurité

Trivy

Scanner de sécurité complet Aqua Security - images OCI, IaC Terraform/K8s, secrets, SBOM, CVE. Trivy Operator pour scan continu en cluster.

Trivy est le scanner de sécurité open source développé par Aqua Security. Il est capable de détecter les vulnérabilités CVE dans les images de conteneurs, les dépendances d'applications, les fichiers de configuration (Terraform, Kubernetes, Dockerfile), les secrets exposés dans le code, et de générer des SBOM (Software Bill of Materials). Sa simplicité d'utilisation - une commande suffit pour scanner une image - et sa couverture très large en ont fait le standard de facto dans les pipelines CI/CD et Kubernetes.

Incident supply chain - mars 2026 : Le 19 mars 2026, le binaire Trivy v0.69.4, la GitHub Action trivy-action et setup-trivy ont été compromis via un token PAT volé. La version malveillante contenait un credential stealer se propageant aux pipelines CI/CD. L'attaque a été contenue le jour même. Versions saines confirmées : Trivy v0.69.3, trivy-action v0.35.0, setup-trivy v0.2.6. Les versions ultérieures publiées après le 20 mars 2026 sont saines (remédiation complète par Aqua Security, releases désormais immutables). Voir l'advisory officiel.


Informations essentielles

Origine : Aqua Security  ·  Licence : Apache 2.0  ·  Architectures : x86_64, ARM64

Liens : Site officiel  ·  Documentation  ·  GitHub  ·  Releases

Support : Projet actif, releases régulières. Aqua Security maintient activement les bases de données de vulnérabilités. Incident supply chain mars 2026 - voir note ci-dessus.

Stack par défaut

ComposantValeur
Cibles de scanImages OCI, systèmes de fichiers, repos Git, manifests IaC, clusters K8s
Sources CVENVD, OSV, GitHub Advisory, distro advisories (Alpine, Ubuntu, RHEL…)
Formats de sortieTable (terminal), JSON, SARIF, CycloneDX (SBOM), SPDX
Base de donnéesMise à jour automatique (~12h de TTL)
Opérateur K8sTrivy Operator pour scan continu des workloads

Cibles de scan

TypeCommandeDescription
Image OCItrivy image nginx:latestCVE dans l'image + packages OS + dépendances app
Filesystemtrivy fs /path/to/appDépendances, secrets, misconfigurations
Repo Gittrivy repo https://github.com/...Scan d'un repo sans le cloner
IaCtrivy config ./terraform/Misconfigurations Terraform, K8s, Dockerfile
Cluster K8strivy k8s --report summary clusterVulnérabilités + misconfigurations du cluster
SBOMtrivy sbom image.spdx.jsonScanner un SBOM existant

Prérequis

RessourceValeur
OSLinux, macOS, Windows
Accès réseauPour télécharger la DB de vulnérabilités (~200 Mo)
Docker (optionnel)Pour scanner des images locales

Installation

CLI Trivy

# Linux - via script officiel
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin

# Ou via package manager
# Debian/Ubuntu
sudo apt-get install -y wget gnupg
wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | \
  gpg --dearmor | sudo tee /usr/share/keyrings/trivy.gpg > /dev/null
echo "deb [signed-by=/usr/share/keyrings/trivy.gpg] https://aquasecurity.github.io/trivy-repo/deb generic main" | \
  sudo tee /etc/apt/sources.list.d/trivy.list
sudo apt-get update && sudo apt-get install -y trivy

# macOS
brew install aquasecurity/trivy/trivy

# Vérifier
trivy version

Trivy Operator (scan continu en cluster)

helm repo add aqua https://aquasecurity.github.io/helm-charts/
helm repo update

helm install trivy-operator aqua/trivy-operator \
  --namespace trivy-system --create-namespace \
  --set trivy.ignoreUnfixed=true

kubectl rollout status deploy/trivy-operator -n trivy-system

Vérification de l'installation

# 1. Version et DB
trivy version
# Database: v2, UpdatedAt: <date récente>

# 2. Mise à jour de la base de données
trivy image --download-db-only
# DB téléchargée dans ~/.cache/trivy/db/

# 3. Scan d'une image légère en test
trivy image --severity HIGH,CRITICAL alpine:latest
# Doit lister les CVE HIGH/CRITICAL trouvées (ou "0 vulnerabilities")

# 4. Vérifier le Trivy Operator (si installé)
kubectl get pods -n trivy-system
# trivy-operator-* doit être Running (1/1)
kubectl get vulnerabilityreports -A | head -5
# Des rapports doivent apparaître après quelques minutes

# 5. Scan rapide d'un manifest K8s
trivy config deployment.yaml
# PASS ou liste des misconfigurations détectées

Pièges courants à l'installation

SymptômeCauseCorrection
DB update failedPas d'accès à GitHub (ghcr.io)Utiliser un miroir ou --skip-update avec DB locale
Scan très lent (première fois)Téléchargement de la DB (~200 Mo)Normal - la DB est mise en cache ensuite
Nombreux faux positifsVulnérabilités sans fix disponibleAjouter --ignore-unfixed pour ne voir que les fixables
UNKNOWN severity sur des CVECVE sans CVSS score dans la sourceFiltrer avec --severity HIGH,CRITICAL

Utilisation

Scanner une image

# Scan basique
trivy image nginx:1.25

# Seulement HIGH et CRITICAL, sans les non-corrigées
trivy image --severity HIGH,CRITICAL --ignore-unfixed nginx:1.25

# Sortie JSON pour intégration CI/CD
trivy image -f json -o report.json nginx:1.25

# Sortie SARIF pour GitHub Code Scanning
trivy image -f sarif -o trivy.sarif nginx:1.25

Scanner les misconfigurations IaC

# Terraform
trivy config ./terraform/

# Manifests Kubernetes
trivy config ./k8s/

# Dockerfile
trivy config ./Dockerfile

# Avec seuil de sévérité
trivy config --severity HIGH,CRITICAL ./

Scanner les secrets

# Détecter les secrets dans le code (clés API, tokens, mots de passe)
trivy fs --scanners secret ./

# Dans une image
trivy image --scanners secret my-app:latest

Générer un SBOM

# SBOM au format CycloneDX
trivy image --format cyclonedx --output sbom.json nginx:1.25

# SBOM au format SPDX
trivy image --format spdx-json --output sbom.spdx.json nginx:1.25

Scanner un cluster Kubernetes

# Rapport résumé du cluster complet
trivy k8s --report summary cluster

# Rapport détaillé par namespace
trivy k8s --report all --namespace production cluster

# Scanner un seul workload
trivy k8s deployment/my-app -n production

Intégration CI/CD

GitHub Actions

- name: Scan image avec Trivy
  uses: aquasecurity/trivy-action@master
  with:
    image-ref: ${{ env.IMAGE }}
    format: sarif
    output: trivy-results.sarif
    severity: HIGH,CRITICAL
    ignore-unfixed: true

- name: Upload résultats à GitHub Security
  uses: github/codeql-action/upload-sarif@v3
  with:
    sarif_file: trivy-results.sarif

Bloquer le pipeline si vulnérabilités critiques

trivy image \
  --exit-code 1 \
  --severity CRITICAL \
  --ignore-unfixed \
  my-app:$CI_COMMIT_SHA

# exit-code 1 = retour d'erreur si des vulnérabilités CRITICAL sont trouvées

Mise à jour

# Mettre à jour la CLI
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin

# Mettre à jour la base de données de vulnérabilités
trivy image --download-db-only

# Mettre à jour le Trivy Operator
helm upgrade trivy-operator aqua/trivy-operator \
  --namespace trivy-system \
  --reuse-values

Troubleshooting

# Voir la version de la DB utilisée
trivy version

# Forcer la mise à jour de la DB
trivy image --download-db-only --reset

# Mode verbose pour déboguer
trivy image --debug nginx:latest 2>&1 | head -50

# Vérifier les logs du Trivy Operator
kubectl logs -n trivy-system -l app.kubernetes.io/name=trivy-operator --tail=100

Trop de vulnérabilités (bruit)

# N'afficher que les CVE avec un fix disponible
trivy image --ignore-unfixed nginx:latest

# Ignorer des CVE spécifiques (fichier .trivyignore)
cat > .trivyignore <<EOF
# Ignorer cette CVE - non exploitable dans notre contexte
CVE-2023-12345
EOF
trivy image nginx:latest

Commandes utiles

trivy image <image>                              # Scanner une image
trivy image --severity HIGH,CRITICAL <image>    # Filtrer par sévérité
trivy image --ignore-unfixed <image>            # Seulement les CVE fixables
trivy fs .                                       # Scanner le répertoire courant
trivy config .                                   # Scanner les fichiers IaC
trivy k8s cluster --report summary              # Scanner un cluster K8s
trivy image --format cyclonedx -o sbom.json <i> # Générer un SBOM
trivy image --download-db-only                  # Mettre à jour la DB seule

Ressources

Newsletter · 2 000+ abonnés

Reste au courant de ce qui bouge en prod

RudeOps veille devops hebdo, droit au but.

Gratuit · Sans spam · Désinscription en un clic