
Tu viens de construire une image Docker. Elle fonctionne, les tests passent, tu es prêt à déployer. Mais sais-tu vraiment ce qu’elle contient ? Peut-être une bibliothèque avec une faille critique publiée la semaine dernière. Ou un bucket S3 public dans ton Terraform. Ou pire : un mot de passe en clair oublié dans le code.
Trivy, c’est le détecteur de fumée de ton code. En quelques secondes, il scanne tes images, ton Infrastructure as Code et ton code source pour t’alerter avant que ces problèmes n’arrivent en production.
Ce guide est fait pour toi si…
Section intitulée « Ce guide est fait pour toi si… »Pourquoi Trivy est devenu incontournable
Section intitulée « Pourquoi Trivy est devenu incontournable »Dans le monde du développement logiciel, la sécurité est souvent reléguée au second plan dans les cycles de développement. Cependant, avec l’émergence du DevSecOps, il est devenu impératif d’intégrer la sécurité dès les premières étapes du développement (Shift Left).
C’est ici qu’intervient Trivy : un outil d’analyse de sécurité open source développé par Aqua Security, devenu rapidement populaire pour sa fiabilité, sa rapidité et sa facilité d’intégration.
L’histoire de Trivy
Section intitulée « L’histoire de Trivy »Trivy a été développé par Aqua Security avec la vision de simplifier la sécurité pour les développeurs et les équipes d’opérations. Contrairement à d’autres outils qui nécessitaient une configuration complexe et une compréhension approfondie des aspects de sécurité, Trivy se distinguait par sa simplicité d’utilisation. Cette facilité d’accès a permis même aux développeurs moins expérimentés en matière de sécurité de l’intégrer dans leurs workflows.
L’outil a évolué rapidement, passant d’un simple scanner de vulnérabilités à une solution complète pour la sécurité des applications et des infrastructures. Aujourd’hui, Trivy est capable de détecter non seulement les vulnérabilités dans les images de conteneurs, mais aussi les mauvaises configurations dans l’Infrastructure as Code (IaC), les secrets exposés, les risques de sécurité des clusters Kubernetes et bien plus encore.
Fonctionnalités de Trivy
Section intitulée « Fonctionnalités de Trivy »Trivy se distingue non seulement par sa facilité d’utilisation, mais aussi par son éventail complet de fonctionnalités qui en font un outil polyvalent pour la sécurité dans le développement logiciel. Les bases de données de Trivy sont constamment mises à jour avec les dernières informations sur les failles, garantissant ainsi que les scans sont basés sur les données les plus récentes.
Trivy est capable de scanner une variété de targets :
- Images de conteneurs : Docker, Podman, OCI, images distroless et Chainguard
- Systèmes de fichiers : code source, dépendances applicatives
- Dépôts Git : analyse directe depuis GitHub, GitLab, Bitbucket
- Infrastructure as Code : Terraform, Kubernetes YAML, Helm, Dockerfile, CloudFormation
- Machines virtuelles : images VMDK, AMI AWS
- Clusters Kubernetes : workloads, configurations, RBAC
- Comptes AWS : audit de configuration cloud
Gestionnaires de paquets supportés
Section intitulée « Gestionnaires de paquets supportés »Trivy détecte automatiquement les dépendances dans de nombreux écosystèmes :
| Langage | Gestionnaires |
|---|---|
| Python | pip, Poetry, Pipenv, conda |
| JavaScript | npm, yarn, pnpm |
| Go | go.mod, binaires compilés |
| Java | Maven, Gradle, JAR/WAR |
| Ruby | Bundler, Gemfile |
| Rust | Cargo |
| PHP | Composer |
| .NET | NuGet, packages.config |
Génération de SBOM
Section intitulée « Génération de SBOM »Trivy génère des SBOM (Software Bill of Materials) et KBOM (Kubernetes BOM) détaillés, fournissant un inventaire complet des composants logiciels. Les SBOM permettent une compréhension approfondie des composants utilisés lors de la construction.
Les SBOM peuvent être signés avec Cosign, ainsi que l’image. Ces signatures pourront ensuite être vérifiées avant déploiement dans un cluster Kubernetes pour confirmer leur origine.
Trivy peut également lancer des benchs permettant de vérifier que les artefacts produits sont conformes aux normes. Vous l’aurez compris Trivy ne se limite plus au simple scan d’images de conteneurs. Voyons comment l’utiliser.
Installation de Trivy
Section intitulée « Installation de Trivy »L’installation de Trivy est assez simple, car le package ne contient qu’un seul binaire.
Installation sur Linux
Section intitulée « Installation sur Linux »Sur les systèmes Linux, Trivy peut être installé via le gestionnaire de paquets. Mais je vous conseille de le faire avec asdf qui permet d’installer les dernières versions.
asdf plugin add trivyasdf install trivy latestasdf set --home trivy latestSi vous préférez une installation manuelle, vous pouvez télécharger le binaire depuis la page des releases de Trivy sur GitHub.
Installation sur macOS
Section intitulée « Installation sur macOS »Pour les utilisateurs de macOS, Trivy peut être installé via Homebrew en exécutant la commande suivante :
brew install trivyInstallation sur Windows
Section intitulée « Installation sur Windows »Sur Windows, Trivy peut être installé en téléchargeant le fichier exécutable depuis la page de releases de Trivy sur GitHub et en l’ajoutant au PATH du système. Un moyen est d’utiliser chocolatey.
Vérification de l’Installation
Section intitulée « Vérification de l’Installation »Une fois installé, vous pouvez vérifier que Trivy fonctionne correctement en exécutant la commande suivante :
trivy --versionCette commande affichera la version de Trivy installée, confirmant que l’installation a été réussie.
Utilisation de la CLI Trivy
Section intitulée « Utilisation de la CLI Trivy »La CLI Trivy utilise ce format de commande :
trivy [global flags] command [flags] targetLes principales commandes de scan
Section intitulée « Les principales commandes de scan »Trivy propose plusieurs cibles de scan (targets) :
- image : analyse les images de conteneurs (Docker, OCI)
- fs : scanne un système de fichiers ou dossier local
- repository : analyse un dépôt Git directement
- rootfs : scanne le système de fichiers racine d’une image ou VM
- sbom : analyse un SBOM existant (CycloneDX, SPDX)
- vm : scanne les images de machines virtuelles (VMDK, AMI AWS)
- k8s : analyse un cluster Kubernetes complet
Trivy peut utiliser des scanners spécifiques :
- vuln : détection des vulnérabilités (CVE)
- misconfig : analyse des mauvaises configurations (IaC, Dockerfile, Kubernetes)
- secret : recherche de secrets exposés (clés API, tokens, mots de passe)
- license : inventaire des licences logicielles
Par défaut, seuls les scanners vuln et secret sont activés. Pour activer
les autres, utilisez le flag --scanners.
Exemples de combinaisons de scanners :
# Scan répertoire source : vulnérabilités uniquement (recommandé)trivy fs --scanners vuln .
# Scan complet projet : vulnérabilités + secrets + IaCtrivy fs --scanners vuln,secret,misconfig .Exemple réel : scan du projet devops-status-api :
trivy fs --scanners vuln . -q
Report Summary┌──────────────────┬──────┬─────────────────┐│ Target │ Type │ Vulnerabilities │├──────────────────┼──────┼─────────────────┤│ requirements.txt │ pip │ 4 │└──────────────────┴──────┴─────────────────┘
requirements.txt (pip)Total: 4 (LOW: 0, MEDIUM: 3, HIGH: 0, CRITICAL: 1)
┌─────────────┬────────────────┬──────────┬───────────────────┬───────────────┐│ Library │ Vulnerability │ Severity │ Installed Version │ Fixed Version │├─────────────┼────────────────┼──────────┼───────────────────┼───────────────┤│ python-jose │ CVE-2024-33663 │ CRITICAL │ 3.3.0 │ 3.4.0 ││ ├────────────────┼──────────┤ │ ││ │ CVE-2024-33664 │ MEDIUM │ │ ││ ├────────────────┤ │ │ ││ │ CVE-2016-1000 │ │ │ │├─────────────┼────────────────┤ │───────────────────┼───────────────┤│ requests │ CVE-2024-35195 │ MEDIUM │ 2.32.3 │ (no fix) │└─────────────┴────────────────┴──────────┴───────────────────┴───────────────┘Ce qu’on observe :
- 4 CVE détectées dans
requirements.txt - 1 Critical (python-jose) : vulnérabilité de confusion d’algorithme
- 3 Medium : déni de service, injection CRLF
- Fix disponible : python-jose 3.3.0 → 3.4.0
Scan Infrastructure as Code (IaC)
Section intitulée « Scan Infrastructure as Code (IaC) »Trivy analyse Terraform, Kubernetes, Dockerfile, Helm, CloudFormation pour détecter les mauvaises configurations :
# Scanner un Dockerfiletrivy config --file-patterns "dockerfile:Dockerfile" .
# Scanner Terraformtrivy config ./infra/terraform
# Scanner manifestes Kubernetestrivy fs --scanners misconfig ./k8s/
# Scan complet : vulnérabilités + IaC + secretstrivy fs --scanners vuln,misconfig,secret .Exemple : scan Dockerfile de devops-status-api :
trivy config --file-patterns "dockerfile:Dockerfile" .
Report Summary┌────────────┬────────────┬───────────────────┐│ Target │ Type │ Misconfigurations │├────────────┼────────────┼───────────────────┤│ Dockerfile │ dockerfile │ 0 │└────────────┴────────────┴───────────────────┘Legend:- '0': Clean (no security findings detected)Résultat : Dockerfile conforme aux bonnes pratiques Trivy :
- ✅ Utilise multi-stage build (réduction de taille)
- ✅ Image de base récente (Alpine 3.23.2)
- ✅ Pas de secrets hardcodés
- ✅ USER non-root configuré dans l’image de base Python
main.tf (terraform)Tests: 8 (SUCCESSES: 0, FAILURES: 8)Failures: 8 (UNKNOWN: 0, LOW: 1, MEDIUM: 1, HIGH: 6, CRITICAL: 0)
AVD-AWS-0086 (HIGH): Public access block does not block public ACLs══════════════════════════════════════════════════════════════════════S3 buckets should block public ACLs on buckets and any objects they contain.
See https://avd.aquasec.com/misconfig/avd-aws-0086────────────────────────────────────────────────────────────────────── main.tf:8────────────────────────────────────────────────────────────────────── 5 resource "aws_s3_bucket_public_access_block" "example" { 8 [ block_public_acls = false──────────────────────────────────────────────────────────────────────
AVD-AWS-0088 (HIGH): Bucket does not have encryption enabled══════════════════════════════════════════════════════════════════════S3 Buckets should be encrypted to protect the data stored within them.
See https://avd.aquasec.com/misconfig/avd-aws-0088────────────────────────────────────────────────────────────────────── main.tf:1-3────────────────────────────────────────────────────────────────────── 1 ┌ resource "aws_s3_bucket" "example" { 2 │ bucket = "my-tf-test-bucket" 3 └ }──────────────────────────────────────────────────────────────────────Trivy s’appuie sur des règles intégrées (Rego policies) pour détecter :
- Conteneurs exécutés en root (
runAsNonRoot: false) - Ressources Kubernetes sans limites CPU/mémoire
- Buckets S3 publics ou sans chiffrement
- Secrets en clair dans les configurations Terraform
- Ports sensibles exposés (22, 3389, etc.)
- Images sans tag fixe (utilisation de
latest) - Privilèges élevés (
privileged: true,CAP_SYS_ADMIN)
Scan de machines virtuelles et rootfs
Section intitulée « Scan de machines virtuelles et rootfs »Trivy propose deux commandes pour auditer des systèmes complets :
Commande rootfs (machine locale ou image montée)
Section intitulée « Commande rootfs (machine locale ou image montée) »La commande rootfs scanne le système de fichiers racine d’une machine.
L’exécution en root est quasi indispensable pour une visibilité complète
sur tous les packages installés :
# Scanner le système de fichiers racine (nécessite les droits root)sudo trivy rootfs --scanners vuln --severity HIGH,CRITICAL /
# Scanner une image de VM montéesudo trivy rootfs --scanners vuln /mnt/vm-disk/Commande vm (images de machines virtuelles)
Section intitulée « Commande vm (images de machines virtuelles) »La commande vm cible spécifiquement les images de VM (VMDK, QCOW2, AMI
exportées). Idéal pour valider des golden images avant déploiement :
# Scanner une image QCOW2trivy vm --severity HIGH,CRITICAL ./disk.qcow2
# Scanner une image VMDK avec rapport détaillétrivy vm --format table ./windows-server.vmdkTests de compliance
Section intitulée « Tests de compliance »Trivy permet de lancer des audits de compliance basés sur les référentiels des principales organisations sur les images de container, les clusters kubernetes et les comptes AWS.
$ trivy image --compliance docker-cis-1.6.0 nginx:latest2025-12-10T07:18:07Z INFO [image] Container image config scanners scanners=[misconfig secret]2025-12-10T07:18:07Z INFO [vuln] Vulnerability scanning is enabled2025-12-10T07:18:07Z INFO [misconfig] Misconfiguration scanning is enabled2025-12-10T07:18:09Z INFO Detected OS family="debian" version="13.2"2025-12-10T07:18:09Z INFO [debian] Detecting vulnerabilities...
Summary Report for compliance: CIS Docker Community Edition Benchmark v1.6.0┌──────┬──────────┬──────────────────────────────────────────────────────────────┬────────┬────────┐│ ID │ Severity │ Control Name │ Status │ Issues │├──────┼──────────┼──────────────────────────────────────────────────────────────┼────────┼────────┤│ 4.1 │ HIGH │ Ensure a user for the container has been created │ FAIL │ 1 ││ 4.2 │ HIGH │ Ensure that containers use only trusted base images (Manual) │ - │ - ││ 4.3 │ HIGH │ Ensure unnecessary packages are not installed in the │ - │ - ││ │ │ container (Manual) │ │ ││ 4.4 │ CRITICAL │ Ensure images are scanned and rebuilt to include security │ PASS │ 0 ││ │ │ patches │ │ ││ 4.5 │ LOW │ Ensure Content trust for Docker is Enabled (Manual) │ - │ - ││ 4.6 │ LOW │ Ensure HEALTHCHECK instructions have been added to the │ FAIL │ 1 ││ │ │ container image │ │ ││ 4.7 │ HIGH │ Ensure update instructions are not used alone in the │ PASS │ 0 ││ │ │ Dockerfile │ │ ││ 4.9 │ LOW │ Ensure COPY is used instead of ADD │ PASS │ 0 ││ 4.10 │ CRITICAL │ Ensure secrets are not stored in Dockerfiles │ PASS │ 0 ││ 4.11 │ MEDIUM │ Ensure only verified packages are installed (Manual) │ - │ - ││ 4.12 │ MEDIUM │ Ensure all signed artifacts are validated (Manual) │ - │ - │└──────┴──────────┴──────────────────────────────────────────────────────────────┴────────┴────────┘Les référentiels de compliance disponibles varient selon la cible :
- Images Docker (
trivy image --compliance) :- docker-cis-1.6.0 : CIS Docker Community Edition Benchmark v1.6.0
- Clusters Kubernetes (
trivy k8s --compliance) :- k8s-cis-1.23 : CIS Kubernetes Benchmark v1.23
- k8s-nsa : NSA Kubernetes Hardening Guide
- k8s-pss-baseline / k8s-pss-restricted : Pod Security Standards
- Comptes AWS (
trivy aws --compliance) :- aws-cis-1.2 / aws-cis-1.4 : CIS AWS Foundations Benchmark
Exemple de scan compliance sur un cluster Kubernetes :
# Audit NSA Kubernetes Hardening Guidetrivy k8s --compliance k8s-nsa --report summary
# Audit CIS Kubernetes Benchmark v1.23trivy k8s --compliance k8s-cis-1.23 --report allGestion de configuration
Section intitulée « Gestion de configuration »Trivy peut être configuré via (par ordre de priorité) :
- Flags CLI (priorité max)
- Variables d’environnement (préfixées
TRIVY_) - Fichier
trivy.yaml
Exemple de fichier trivy.yaml :
# Cache et timeoutcache: dir: "/tmp/trivy-cache"timeout: 10m
# Format et sévéritéformat: "table"exit-code: 1severity: - HIGH - CRITICAL
# Scannersscan: scanners: - vuln - secret skip-dirs: - /lib64 - /usr/lib
# Vulnérabilitésvulnerability: ignore-unfixed: trueDocumentation complète des paramètres
Formats de sortie et rapports
Section intitulée « Formats de sortie et rapports »Trivy supporte plusieurs formats d’export pour s’intégrer dans différents outils :
# Format JSON (pour traitement automatisé)$ trivy image --format json --output report.json alpine:latest
# Format SARIF (intégration GitHub Security, Azure DevOps, GitLab)$ trivy image --format sarif --output report.sarif alpine:latest
# Format CycloneDX SBOM (standard OWASP)$ trivy image --format cyclonedx --output sbom.json alpine:latest
# Format SPDX SBOM (standard Linux Foundation)$ trivy image --format spdx-json --output sbom.spdx.json alpine:latestExemple de sortie JSON :
{ "SchemaVersion": 2, "CreatedAt": "2025-12-10T07:19:20Z", "ArtifactName": "alpine:latest", "ArtifactType": "container_image", "Metadata": { "OS": { "Family": "alpine", "Name": "3.23.0" }, "ImageID": "sha256:7acffee03fe864cd6b88219a1028855d6c912e7cf6fac..." }}Génération et consommation de SBOM
Section intitulée « Génération et consommation de SBOM »Le SBOM (Software Bill of Materials) est un inventaire complet des composants. Trivy peut le générer puis le scanner ultérieurement :
# Étape 1 : Générer le SBOM (format CycloneDX)trivy fs --format cyclonedx --output sbom.json .
# Étape 2 : Scanner le SBOM (sans accès au code source)trivy sbom sbom.json
Report Summary┌──────────────────┬──────┬─────────────────┐│ Target │ Type │ Vulnerabilities │├──────────────────┼──────┼─────────────────┤│ sbom.json (pip) │ pip │ 4 │└──────────────────┴──────┴─────────────────┘Cette approche découple la génération de l’analyse (idéal pour environnements air-gapped ou supply-chain security). Le SBOM permet de tracer tous les composants et de rescanner lors de nouvelles CVE.
Intégration de Trivy dans les pipelines CI/CD
Section intitulée « Intégration de Trivy dans les pipelines CI/CD »L’intégration de Trivy dans vos pipelines CI/CD permet d’automatiser les scans de sécurité à chaque commit, pull request ou déploiement. Cette approche Shift Left détecte les vulnérabilités avant la mise en production.
Exemple avec Gitlab CI/CD
Section intitulée « Exemple avec Gitlab CI/CD »Pour analyser une image construite et transférée dans le registre GitLab. Le cache persistant améliore les temps de scan en évitant de retélécharger la base de vulnérabilités :
container_scanning: image: name: docker.io/aquasec/trivy:0.68.2 entrypoint: [""] variables: # Pas besoin de cloner le repo, on travaille uniquement sur l'image GIT_STRATEGY: none TRIVY_USERNAME: "$CI_REGISTRY_USER" TRIVY_PASSWORD: "$CI_REGISTRY_PASSWORD" TRIVY_AUTH_URL: "$CI_REGISTRY" TRIVY_NO_PROGRESS: "true" TRIVY_CACHE_DIR: ".trivycache/" FULL_IMAGE_NAME: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG script: - trivy --version # Téléchargement de la base de vulnérabilités - time trivy image --download-db-only # Génération du rapport GitLab (format template) - time trivy image --exit-code 0 --format template --template "@/contrib/gitlab.tpl" --output "$CI_PROJECT_DIR/gl-container-scanning-report.json" "$FULL_IMAGE_NAME" # Affichage du rapport complet - time trivy image --exit-code 0 "$FULL_IMAGE_NAME" # Échec sur vulnérabilités critiques - time trivy image --exit-code 1 --severity CRITICAL "$FULL_IMAGE_NAME" cache: paths: - .trivycache/ artifacts: when: always reports: container_scanning: gl-container-scanning-report.json tags: - docker-runnerExemple avec GitHub Actions
Section intitulée « Exemple avec GitHub Actions »Pour intégrer Trivy dans GitHub Actions, utilisez l’action officielle
aquasecurity/trivy-action. L’action gère automatiquement le cache des
bases de données de vulnérabilités :
name: Security Scan
on: push: branches: [main] pull_request: branches: [main]
jobs: trivy-scan: runs-on: ubuntu-24.04 permissions: contents: read security-events: write steps: - name: Checkout code uses: actions/checkout@v4
- name: Build image run: docker build -t myapp:${{ github.sha }} .
- name: Run Trivy vulnerability scanner uses: aquasecurity/trivy-action@0.33.1 with: image-ref: 'myapp:${{ github.sha }}' format: 'sarif' output: 'trivy-results.sarif' severity: 'CRITICAL,HIGH' exit-code: '1' ignore-unfixed: true
- name: Upload Trivy scan results to GitHub Security uses: github/codeql-action/upload-sarif@v4 if: always() with: sarif_file: 'trivy-results.sarif'Le format SARIF permet d’afficher les vulnérabilités directement dans l’onglet Security de GitHub, avec des liens vers les CVE et les fichiers concernés.
Scan Kubernetes avec Trivy Operator
Section intitulée « Scan Kubernetes avec Trivy Operator »Pour un scan continu de votre cluster Kubernetes, installez Trivy Operator. Cet opérateur analyse automatiquement tous les workloads déployés et stocke les résultats dans des Custom Resources (CR) Kubernetes :
# Ajout du dépôt Helmhelm repo add aqua https://aquasecurity.github.io/helm-charts/helm repo update
# Installation de Trivy Operatorhelm install trivy-operator aqua/trivy-operator \ --namespace trivy-system \ --create-namespace \ --version 0.29.0Vous pouvez aussi installer depuis l’OCI registry (Helm 3.8+) :
helm install trivy-operator \ oci://ghcr.io/aquasecurity/helm-charts/trivy-operator \ --namespace trivy-system \ --create-namespace \ --version 0.29.0L’opérateur crée des CRD pour stocker les rapports de sécurité :
# Lister les rapports de vulnérabilités de tous les namespaceskubectl get vulnerabilityreports -A
# Lister les rapports de configuration (misconfigs)kubectl get configauditreports -A
# Voir les secrets exposéskubectl get exposedsecretreports -A
# Détails d'un rapport spécifiquekubectl describe vulnerabilityreport -n default <nom-du-pod>Les rapports peuvent être exportés vers des outils de monitoring comme Prometheus/Grafana ou Datadog pour un suivi centralisé.
Optimisation des performances
Section intitulée « Optimisation des performances »Pour accélérer les scans dans vos pipelines :
# Utiliser un cache persistantexport TRIVY_CACHE_DIR="/path/to/cache"
# Télécharger la DB une seule foistrivy image --download-db-only
# Scanner sans mise à jour de la DBtrivy image --skip-db-update alpine:latest
# Scanner uniquement les vulnérabilités (plus rapide)trivy image --scanners vuln alpine:latest
# Ignorer les vulnérabilités non corrigéestrivy image --ignore-unfixed alpine:latestGestion des exceptions avec .trivyignore
Section intitulée « Gestion des exceptions avec .trivyignore »Pour documenter les exceptions métier (faux positifs, risques acceptés),
créez un fichier .trivyignore à la racine du projet :
# .trivyignore - Exceptions documentées# CVE acceptée car non exploitable dans notre contexteCVE-2023-12345
# Vulnérabilité mitigée par configuration réseauCVE-2024-67890
# Secret de test (non utilisé en production)secret:generic-api-keyTrivy supporte également les dates d’expiration pour forcer une revue périodique des exceptions :
# Expire le 31 mars 2025 - à revoirCVE-2024-11111 exp:2025-03-31Bonnes pratiques et limites
Section intitulée « Bonnes pratiques et limites »Ce que Trivy fait bien
Section intitulée « Ce que Trivy fait bien »- Détection rapide des vulnérabilités connues (CVE) dans les images et dépendances
- Multi-cibles : images, IaC, code source, SBOM, Kubernetes
- Intégration CI/CD simple avec GitHub Actions, GitLab CI, Jenkins
- Génération de SBOM (CycloneDX, SPDX) pour la traçabilité supply-chain
- Scan offline possible grâce à la consommation de SBOM
Ce que Trivy ne remplace pas
Section intitulée « Ce que Trivy ne remplace pas »Recommandations DevSecOps
Section intitulée « Recommandations DevSecOps »- Combinez plusieurs outils : Trivy + Grype + tests manuels
- Images minimalistes : utilisez des images distroless ou Chainguard pour réduire la surface d’attaque
- Mettez à jour régulièrement Trivy et ses bases de vulnérabilités
- Signez vos artefacts avec Cosign pour garantir l’intégrité
- Auditez régulièrement vos systèmes avec Lynis
- Définissez des seuils : bloquez les builds sur les CVE CRITICAL et HIGH
- Archivez les SBOM pour pouvoir rescanner lors de nouvelles CVE
- Utilisez
.trivyignorepour documenter les exceptions avec dates d’expiration
Cross-check avec Grype
Section intitulée « Cross-check avec Grype »Pour une couverture maximale, croisez les résultats de Trivy avec Grype (≥0.87). Les versions récentes de Grype apportent le support CSAF (Custom Vulnerability Sources) et des améliorations VEX :
# Scan avec Trivytrivy image --severity HIGH,CRITICAL nginx:latest > trivy-report.txt
# Scan avec Grype (même image)grype nginx:latest --only-fixed --fail-on high > grype-report.txt
# Comparer les résultats pour identifier les écartsdiff trivy-report.txt grype-report.txtCette approche multi-scanner réduit les risques de faux négatifs et renforce la confiance dans vos audits de sécurité.
Conclusion
Section intitulée « Conclusion »Trivy s’impose comme un outil incontournable pour les équipes DevSecOps. Sa capacité à scanner images, IaC, dépôts Git et clusters Kubernetes en fait une solution polyvalente pour intégrer la sécurité dès les premières étapes du développement.
L’approche Shift Left que Trivy facilite permet de détecter les vulnérabilités avant la production, réduisant ainsi les coûts de remédiation et les risques de sécurité. Combiné à la génération de SBOM et à l’intégration dans les pipelines CI/CD, Trivy devient un pilier de la supply-chain security.
Pour aller plus loin
Section intitulée « Pour aller plus loin »Tu maîtrises maintenant Trivy pour scanner images, code et IaC. Mais la sécurité ne s’arrête pas là. Voici comment compléter ton arsenal DevSecOps :
Approfondir la sécurité
Section intitulée « Approfondir la sécurité »Registre et workflow complet
Section intitulée « Registre et workflow complet »- Registre sécurisé : Intègre Trivy dans Harbor pour scanner automatiquement toutes les images poussées
- Conformité ANSSI : Applique les recommandations ANSSI-BP-028 sur tes systèmes
Ressources
Section intitulée « Ressources »| Ressource | Description |
|---|---|
| Site Officiel | Page produit Aqua Security |
| Documentation | Documentation officielle |
| GitHub | Code source et issues |
| Trivy Action | Action GitHub officielle |
| Trivy Operator | Scan continu Kubernetes |
Questions fréquentes
Section intitulée « Questions fréquentes »Trivy est un scanner de sécurité open source développé par Aqua Security qui détecte les vulnérabilités, les mauvaises configurations et les secrets exposés dans vos applications et infrastructures.
Ce que Trivy analyse
| Cible | Exemple | Détection |
|---|---|---|
| Images conteneurs | Docker, OCI, distroless | CVE dans packages OS et applicatifs |
| Code source | Dépendances applicatives | Vulnérabilités npm, pip, Maven... |
| Infrastructure as Code | Terraform, Kubernetes YAML | Mauvaises configurations |
| Dépôts Git | GitHub, GitLab | Vulnérabilités + secrets |
| Clusters Kubernetes | Workloads en production | Audit de sécurité complet |
Analogie simple
Trivy, c'est comme un détecteur de fumée pour votre code : il vous alerte sur les risques (vulnérabilités connues) avant qu'ils ne causent un incendie (incident de sécurité).
Exemple rapide
# Scanner une image Docker
trivy image nginx:latest
# Scanner votre code source
trivy fs --scanners vuln .
Voici un comparatif des principaux scanners de vulnérabilités :
Comparaison
| Critère | Trivy | Grype | Clair |
|---|---|---|---|
| Développeur | Aqua Security | Anchore | Quay/CoreOS |
| Cibles | Images, IaC, K8s, SBOM | Images, fichiers, SBOM | Images uniquement |
| IaC | ✅ Terraform, K8s, Helm | ❌ Non supporté | ❌ Non supporté |
| Secrets | ✅ Détection intégrée | ❌ Non | ❌ Non |
| Kubernetes | ✅ Trivy Operator | ❌ Non | ❌ Non |
| Vitesse | Très rapide | Rapide | Modéré |
| Installation | 1 binaire | 1 binaire | Service avec DB |
Quand utiliser quoi ?
- Trivy : outil polyvalent, idéal pour DevSecOps complet
- Grype : excellent pour cross-check (croiser avec Trivy)
- Clair : intégré à Quay/Harbor pour registres d'images
Recommandation
# Croiser les résultats pour fiabilité maximale
trivy image nginx:latest > trivy-results.txt
grype nginx:latest > grype-results.txt
diff trivy-results.txt grype-results.txt
Trivy s'installe facilement car c'est un binaire unique sans dépendances.
Linux (recommandé : asdf)
# Avec asdf (gestion de versions)
asdf plugin add trivy
asdf install trivy latest
asdf set --home trivy latest
# Ou via le script officiel
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin
macOS
# Homebrew
brew install trivy
Windows
# Chocolatey
choco install trivy
# Ou Scoop
scoop install trivy
Docker (sans installation)
# Utiliser l'image officielle
docker run --rm aquasec/trivy image nginx:latest
Vérification
trivy --version
# Version: 0.xx.x
La commande de base pour scanner une image Docker avec Trivy :
Scan basique
# Scanner une image publique
trivy image nginx:latest
# Scanner une image locale
trivy image mon-app:1.0
# Scanner depuis un registre privé
export TRIVY_USERNAME="user"
export TRIVY_PASSWORD="password"
trivy image registry.example.com/mon-app:latest
Options courantes
# Afficher uniquement HIGH et CRITICAL
trivy image --severity HIGH,CRITICAL nginx:latest
# Ignorer les vulnérabilités sans correctif
trivy image --ignore-unfixed nginx:latest
# Sortie JSON (pour automatisation)
trivy image --format json --output results.json nginx:latest
# Échouer si vulnérabilités critiques (CI/CD)
trivy image --exit-code 1 --severity CRITICAL nginx:latest
Exemple de sortie
nginx:latest (debian 12.2)
Total: 42 (LOW: 12, MEDIUM: 20, HIGH: 8, CRITICAL: 2)
┌─────────────┬────────────────┬──────────┬───────────────┐
│ Library │ Vulnerability │ Severity │ Fixed Version │
├─────────────┼────────────────┼──────────┼───────────────┤
│ libssl3 │ CVE-2024-12345 │ CRITICAL │ 3.0.13-1 │
└─────────────┴────────────────┴──────────┴───────────────┘
Trivy analyse automatiquement vos fichiers de dépendances (package.json, requirements.txt, go.mod, pom.xml...) pour détecter les bibliothèques vulnérables.
Commande
# Scanner le répertoire courant
trivy fs --scanners vuln .
# Scanner un chemin spécifique
trivy fs --scanners vuln ./mon-projet/
# Scanner avec secrets et IaC
trivy fs --scanners vuln,secret,misconfig .
Langages supportés
| Langage | Fichiers analysés |
|---|---|
| Python | requirements.txt, Pipfile.lock, poetry.lock |
| JavaScript | package-lock.json, yarn.lock, pnpm-lock.yaml |
| Go | go.mod, go.sum |
| Java | pom.xml, build.gradle, JAR/WAR |
| Ruby | Gemfile.lock |
| Rust | Cargo.lock |
| PHP | composer.lock |
| .NET | packages.config, *.csproj |
Exemple concret
$ trivy fs --scanners vuln . -q
requirements.txt (pip)
Total: 4 (MEDIUM: 3, CRITICAL: 1)
┌─────────────┬────────────────┬──────────┬───────────────┐
│ Library │ Vulnerability │ Severity │ Fixed Version │
├─────────────┼────────────────┼──────────┼───────────────┤
│ python-jose │ CVE-2024-33663 │ CRITICAL │ 3.4.0 │
│ requests │ CVE-2024-35195 │ MEDIUM │ (no fix) │
└─────────────┴────────────────┴──────────┴───────────────┘
Trivy détecte les mauvaises configurations dans vos fichiers IaC (Terraform, Kubernetes, Dockerfile, Helm, CloudFormation).
Commandes
# Scanner un Dockerfile
trivy config --file-patterns "dockerfile:Dockerfile" .
# Scanner du Terraform
trivy config ./infra/terraform/
# Scanner des manifestes Kubernetes
trivy fs --scanners misconfig ./k8s/
# Scan complet (vulns + IaC + secrets)
trivy fs --scanners vuln,misconfig,secret .
Problèmes détectés
Trivy détecte des patterns dangereux comme :
- Conteneurs exécutés en root
- Buckets S3 publics ou non chiffrés
- Ports sensibles exposés (22, 3389)
- Images avec tag :latest (non reproductible)
- Secrets en clair dans les configurations
- Ressources K8s sans limites CPU/mémoire
- Privilèges élevés (
privileged: true)
Exemple Terraform
main.tf (terraform)
Failures: 8 (HIGH: 6, MEDIUM: 1, LOW: 1)
AVD-AWS-0086 (HIGH): Public access block does not block public ACLs
────────────────────────────────────────────────────────────────────
main.tf:8
8 │ block_public_acls = false ← Problème ici
────────────────────────────────────────────────────────────────────
See https://avd.aquasec.com/misconfig/avd-aws-0086
Un SBOM (Software Bill of Materials) est un inventaire complet de tous les composants logiciels de votre application — comme la liste d'ingrédients sur un emballage alimentaire.
Pourquoi un SBOM ?
- Traçabilité : savoir exactement ce qui compose votre logiciel
- Conformité : exigence réglementaire (US Executive Order, FDA)
- Supply chain : réagir rapidement aux nouvelles CVE (ex: Log4Shell)
- Audit : partager avec clients ou équipes sécurité
Générer un SBOM
# Format CycloneDX (recommandé OWASP)
trivy fs --format cyclonedx --output sbom.json .
# Format SPDX (standard Linux Foundation)
trivy fs --format spdx-json --output sbom.spdx.json .
# SBOM d'une image Docker
trivy image --format cyclonedx --output sbom.json nginx:latest
Scanner un SBOM ultérieurement
# Analyser le SBOM pour détecter les vulnérabilités
# (utile pour environnements air-gapped ou rescans)
trivy sbom sbom.json
Workflow supply chain
1. Build image → 2. Générer SBOM → 3. Signer (Cosign) → 4. Stocker
↓
5. Nouvelle CVE publiée → 6. Scanner SBOM archivé → 7. Alerter si impacté
GitHub Actions
name: Security Scan
on: [push, pull_request]
jobs:
trivy-scan:
runs-on: ubuntu-latest
permissions:
security-events: write
steps:
- uses: actions/checkout@v4
- name: Build image
run: docker build -t myapp:${{ github.sha }} .
- name: Run Trivy
uses: aquasecurity/trivy-action@0.33.1
with:
image-ref: 'myapp:${{ github.sha }}'
format: 'sarif'
output: 'results.sarif'
severity: 'CRITICAL,HIGH'
exit-code: '1'
- name: Upload to GitHub Security
uses: github/codeql-action/upload-sarif@v4
if: always()
with:
sarif_file: 'results.sarif'
GitLab CI/CD
container_scanning:
image: aquasec/trivy:latest
variables:
TRIVY_NO_PROGRESS: "true"
TRIVY_CACHE_DIR: ".trivycache/"
script:
- trivy image --download-db-only
- trivy image --exit-code 0 --format template
--template "@/contrib/gitlab.tpl"
--output gl-container-scanning-report.json
$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG
- trivy image --exit-code 1 --severity CRITICAL
$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG
cache:
paths:
- .trivycache/
artifacts:
reports:
container_scanning: gl-container-scanning-report.json
Le fichier .trivyignore permet de documenter les exceptions (faux positifs, risques acceptés) de manière auditée.
Créer un .trivyignore
# .trivyignore - Exceptions documentées
# CVE non exploitable dans notre contexte (pas de données sensibles)
CVE-2023-12345
# Vulnérabilité mitigée par notre configuration réseau
CVE-2024-67890
# Secret de test (fixture, non utilisé en production)
secret:generic-api-key
# Expire le 31 mars 2025 - à revoir à cette date
CVE-2024-11111 exp:2025-03-31
Bonnes pratiques
| Pratique | Pourquoi |
|---|---|
| Documenter chaque exception | Audit trail pour la sécurité |
| Ajouter une date d'expiration | Forcer la revue périodique |
| Committer le fichier | Versionné avec le code |
| Revue par l'équipe sécurité | Validation des exceptions |
Option complémentaire
# Ignorer les vulnérabilités sans correctif disponible
trivy image --ignore-unfixed nginx:latest
Cette option est pragmatique en CI pour réduire le bruit sur les CVE que vous ne pouvez pas corriger immédiatement.
Trivy Operator est un opérateur Kubernetes qui scanne automatiquement tous vos workloads et stocke les résultats dans des Custom Resources.
Installation
# Ajouter le repo Helm
helm repo add aqua https://aquasecurity.github.io/helm-charts/
helm repo update
# Installer l'opérateur
helm install trivy-operator aqua/trivy-operator \
--namespace trivy-system \
--create-namespace \
--version 0.31.0
Consulter les rapports
# Rapports de vulnérabilités
kubectl get vulnerabilityreports -A
# Rapports de configuration
kubectl get configauditreports -A
# Secrets exposés
kubectl get exposedsecretreports -A
# Détails d'un rapport
kubectl describe vulnerabilityreport -n default <nom-pod>
Avantages
- Scan continu : nouveaux déploiements scannés automatiquement
- Natif Kubernetes : résultats dans des CRD (kubectl friendly)
- Intégration monitoring : export vers Prometheus/Grafana
- Pas de CI/CD requis : scan en production directement
En CI/CD, chaque seconde compte. Voici comment optimiser les performances de Trivy.
1. Cacher la base de vulnérabilités
# Définir un répertoire de cache persistant
export TRIVY_CACHE_DIR="/path/to/cache"
# Télécharger la DB une seule fois
trivy image --download-db-only
# Scanner sans mise à jour
trivy image --skip-db-update alpine:latest
2. Configuration CI (GitHub Actions)
- uses: aquasecurity/trivy-action@0.33.1
with:
cache: 'true' # Cache automatique
skip-db-update: 'true' # Si DB récente
3. Limiter le scope du scan
# Scanner uniquement les vulnérabilités (plus rapide)
trivy image --scanners vuln alpine:latest
# Ignorer les non corrigées (moins de résultats)
trivy image --ignore-unfixed alpine:latest
# Exclure des répertoires
trivy fs --skip-dirs node_modules,vendor .
4. Fichier trivy.yaml
cache:
dir: "/tmp/trivy-cache"
timeout: 5m
scan:
scanners:
- vuln
skip-dirs:
- node_modules
- .git
vulnerability:
ignore-unfixed: true
Gain typique
| Sans optimisation | Avec optimisation |
|---|---|
| ~45 secondes | ~8 secondes |
Trivy supporte plusieurs formats d'export pour s'intégrer dans différents outils.
Formats disponibles
| Format | Usage | Commande |
|---|---|---|
| table | Lecture humaine (défaut) | --format table |
| json | Automatisation, API | --format json |
| sarif | GitHub Security, Azure DevOps | --format sarif |
| cyclonedx | SBOM OWASP | --format cyclonedx |
| spdx-json | SBOM Linux Foundation | --format spdx-json |
| template | Personnalisé (Go templates) | --format template |
Exemples
# JSON pour traitement automatisé
trivy image --format json -o report.json nginx:latest
# SARIF pour GitHub Security tab
trivy image --format sarif -o report.sarif nginx:latest
# SBOM CycloneDX
trivy fs --format cyclonedx -o sbom.json .
# Template GitLab
trivy image --format template \
--template "@/contrib/gitlab.tpl" \
-o gl-report.json nginx:latest
Format SARIF
Le format SARIF est particulièrement utile car il s'intègre nativement avec :
- GitHub Advanced Security (onglet Security)
- Azure DevOps
- VS Code (extension SARIF Viewer)
Oui ! Trivy inclut un scanner de secrets qui détecte les credentials exposés dans votre code.
Activer le scan de secrets
# Scanner avec secrets
trivy fs --scanners secret .
# Combiné avec vulnérabilités
trivy fs --scanners vuln,secret .
# Dans une image Docker
trivy image --scanners vuln,secret nginx:latest
Types de secrets détectés
- API Keys : AWS, GCP, Azure, GitHub, Slack...
- Tokens : JWT, OAuth, Bearer tokens
- Clés privées : SSH, RSA, PGP
- Mots de passe : connexions DB, services
- Credentials : utilisateur/mot de passe en clair
Exemple de sortie
app/config.py (secrets)
Total: 2 (HIGH: 1, MEDIUM: 1)
┌──────────────────┬──────────┬──────────────────────────┐
│ Secret │ Severity │ Location │
├──────────────────┼──────────┼──────────────────────────┤
│ AWS Access Key │ HIGH │ config.py:15 │
│ Generic Password │ MEDIUM │ .env.example:3 │
└──────────────────┴──────────┴──────────────────────────┘
Ignorer un secret (test/fixture)
# .trivyignore
secret:generic-api-key
secret:aws-access-key-id
Trivy est puissant mais a des limites à connaître pour éviter les faux sentiments de sécurité.
Ce que Trivy NE fait PAS
| Limite | Explication | Alternative |
|---|---|---|
| Vulnérabilités 0-day | Détecte uniquement les CVE publiées | Veille sécurité, pentest |
| Tests dynamiques | Analyse statique uniquement | DAST (OWASP ZAP, Burp) |
| Logique métier | Ne comprend pas votre code | Revue de code manuelle |
| Faux positifs | Peut signaler des non-problèmes | Croiser avec Grype |
| Faux négatifs | Peut rater des vulnérabilités | Multi-scanner approach |
| Binaires compilés | Analyse limitée sans SBOM | Générer SBOM au build |
Recommandations
# Croiser les résultats avec Grype
trivy image nginx:latest > trivy.txt
grype nginx:latest > grype.txt
diff trivy.txt grype.txt
Approche DevSecOps complète
- Trivy : scan statique (vulns, IaC, secrets)
- Grype : cross-check vulnérabilités
- DAST : tests dynamiques (pentest automatisé)
- Revue de code : logique métier
- Lynis : audit système hôte
- Monitoring : détection en runtime
Trivy peut scanner des systèmes complets (VMs, serveurs Linux) pour détecter les packages vulnérables.
Scanner le système local (rootfs)
# Scanner le système de fichiers racine
# Nécessite les droits root pour accéder à tous les packages
sudo trivy rootfs --scanners vuln /
# Scanner une partition montée
sudo trivy rootfs --scanners vuln /mnt/vm-disk/
# Filtrer par sévérité
sudo trivy rootfs --severity HIGH,CRITICAL /
Scanner une image de VM
# Image QCOW2 (KVM/Proxmox)
trivy vm ./disk.qcow2
# Image VMDK (VMware)
trivy vm --severity HIGH,CRITICAL ./server.vmdk
Cas d'usage
| Commande | Usage |
|---|---|
trivy rootfs / |
Audit serveur Linux en place |
trivy rootfs /mnt/ |
Audit d'un disque monté |
trivy vm disk.qcow2 |
Validation golden image |
Exemple de sortie
/ (ubuntu 22.04)
Total: 127 (LOW: 45, MEDIUM: 62, HIGH: 18, CRITICAL: 2)
┌──────────────┬────────────────┬──────────┬───────────────┐
│ Package │ Vulnerability │ Severity │ Fixed Version │
├──────────────┼────────────────┼──────────┼───────────────┤
│ openssl │ CVE-2024-XXXXX │ CRITICAL │ 3.0.13-0 │
│ libcurl4 │ CVE-2024-YYYYY │ HIGH │ 7.81.0-1.16 │
└──────────────┴────────────────┴──────────┴───────────────┘