Trivy (prononcé /ˈtraɪvi/) est un scanner de sécurité complet open source développé par Aqua Security. Il compte plus de 35 000 stars sur GitHub. C'est l'un des outils de scan de sécurité open source les plus populaires du moment.
Le gros avantage de Trivy ? Sa polyvalence. Il peut scanner de nombreux types de cibles : images de conteneurs, systèmes de fichiers, dépôts Git, images de machines virtuelles, clusters Kubernetes. Et il détecte divers problèmes de sécurité : vulnérabilités CVE connues, erreurs de configuration IaC, fuites d'informations sensibles, licences logicielles, génération de SBOM. Pour les équipes DevSecOps modernes, Trivy couvre quasiment toute la chaîne de scan de sécurité. Du commit de code jusqu'au déploiement en production.
Cet article démarre avec l'installation. Puis on verra les fonctionnalités clés, les cas d'usage pratiques et comment intégrer Trivy dans vos pipelines CI/CD. Objectif : aider développeurs et ingénieurs sécurité à prendre en main rapidement cet outil puissant.
Pourquoi choisir Trivy ?
Avant Trivy, le monde du scan de sécurité était fragmenté. Il fallait des outils différents pour scanner les images de conteneurs, vérifier les configurations IaC, ou détecter les fuites de clés dans le code. Trivy rassemble tout ça dans un seul outil CLI. Voici ses points forts :
1. Support multi-cibles
Trivy peut scanner :
- Images de conteneurs : Docker, images OCI (locales ou en remote)
- Systèmes de fichiers : répertoires locaux, code source de projets
- Dépôts Git : dépôts Git distants (sans clonage nécessaire)
- Images de machines virtuelles : AWS EC2 AMI, Azure VM, etc.
- Clusters Kubernetes : ressources configurées sur des clusters en cours d'exécution
2. Détection multi-dimensionnelle
Trivy détecte plusieurs types de problèmes de sécurité :
- Vulnérabilités connues (CVE) : basé sur les bases de données de vulnérabilités des packages OS et des dépendances logicielles
- Erreurs de configuration IaC : violations des bonnes pratiques sur Terraform, CloudFormation, Kubernetes YAML, etc.
- Fuites d'informations sensibles : clés API, mots de passe, tokens en dur dans le code
- Conformité des licences logicielles : identification des types de licences open source utilisées
- Génération de SBOM : création de la liste des matériaux logiciels (Software Bill of Materials)
3. Facilité d'intégration
Trivy s'intègre partout :
- GitHub Actions : trivy-action
- Kubernetes Operator : trivy-operator
- Extension VS Code : trivy-vscode-extension
- Plateformes CI/CD : Jenkins, GitLab CI, CircleCI, etc.
4. Rapide et léger
Écrit en Go, Trivy démarre vite et consomme peu de mémoire. Parfait pour les exécutions fréquentes en CI/CD.
Installer Trivy
Plusieurs méthodes d'installation disponibles. Voici les plus courantes :
Méthode 1 : Homebrew (macOS/Linux)
brew install trivy
Méthode 2 : Docker
docker run aquasec/trivy --version
Méthode 3 : Binaire
Téléchargez le binaire depuis GitHub Releases :
# Linux x86_64
wget https://github.com/aquasecurity/trivy/releases/download/v0.50.0/trivy_0.50.0_Linux-64bit.tar.gz
tar -xzf trivy_0.50.0_Linux-64bit.tar.gz
sudo mv trivy /usr/local/bin/
Méthode 4 : apt/yum (distributions Linux)
# Ubuntu/Debian
sudo apt-get install wget gnupg
wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo apt-key add -
echo "deb https://aquasecurity.github.io/trivy-repo/deb generic main" | sudo tee -a /etc/apt/sources.list.d/trivy.list
sudo apt-get update
sudo apt-get install trivy
# CentOS/RHEL
sudo yum install trivy
Vérifier l'installation
trivy --version
# Exemple de sortie : Version: 0.50.0
Démarrage rapide : scanner votre première image de conteneur
Commençons simple. On va scanner une image Docker publique pour voir ce que Trivy trouve.
Scanner l'image officielle Python
trivy image python:3.9-slim
Trivy affiche quelque chose comme ça :
python:3.9-slim (debian 11.7)
=====================================
Total: 123 (UNKNOWN: 0, LOW: 45, MEDIUM: 52, HIGH: 24, CRITICAL: 2)
+------------------+---------------------+----------+-------------------+---------------+---------------------------------------+
| LIBRARY | VULNERABILITY ID | SEVERITY | INSTALLED VERSION | FIXED VERSION | TITLE |
+------------------+---------------------+----------+-------------------+---------------+---------------------------------------+
| libssl1.1 | CVE-2023-5678 | CRITICAL | 1.1.1w-0+deb11u1 | 1.1.1w-0+deb11u2 | OpenSSL: X.509 Email Address ... |
| openssl | CVE-2023-6129 | HIGH | 1.1.1w-0+deb11u1 | 1.1.1w-0+deb11u2 | OpenSSL: POLY1305 MAC implementation... |
+------------------+---------------------+----------+-------------------+---------------+---------------------------------------+
L'output contient ces infos clés :
- Total des vulnérabilités : classées par gravité (UNKNOWN, LOW, MEDIUM, HIGH, CRITICAL)
- Tableau des détails : nom de la librairie, ID CVE, gravité, version actuelle, version corrigée, description
N'afficher que les vulnérabilités HIGH et CRITICAL
En pratique, on se concentre sur les vulnérabilités graves. Filtrez avec --severity :
trivy image --severity HIGH,CRITICAL python:3.9-slim
Sortie au format JSON (pour l'automatisation)
trivy image --format json python:3.9-slim > results.json
Fonctionnalités clés en détail
1. Scan du système de fichiers
En plus des images de conteneurs, Trivy scanne les systèmes de fichiers locaux. Ça permet de détecter les vulnérabilités dans les dépendances du projet dès le développement.
# Scanner le répertoire courant
trivy fs .
# Scanner un répertoire spécifique
trivy fs /path/to/project
# Scanner uniquement certaines langues
trivy fs --scanners vuln --language python /path/to/project
Trivy supporte : Python, Node.js, Java, Go, Ruby, PHP, .NET, Rust et les autres langages majeurs.
2. Scan des dépôts Git
Trivy scanne directement les dépôts Git distants. Pas besoin de cloner :
# Scanner un dépôt GitHub public
trivy repo https://github.com/aquasecurity/trivy
# Scanner une branche spécifique
trivy repo https://github.com/aquasecurity/trivy@main
Très pratique pour auditer la sécurité de projets open source tiers.
3. Scan des configurations Kubernetes
Les erreurs de configuration Kubernetes sont une cause majeure d'incidents de sécurité. Trivy vérifie si vos fichiers YAML respectent les bonnes pratiques :
# Scanner un fichier YAML
trivy config deployment.yaml
# Scanner tous les fichiers d'un répertoire
trivy config ./k8s-manifests/
Trivy détecte :
- Les conteneurs qui tournent en root
- L'absence de limites de ressources (CPU/mémoire)
- L'utilisation du tag
latest - Le mode privilégié activé
- Les informations sensibles codées en dur dans les variables d'environnement
Exemple de sortie :
k8s-manifests/deployment.yaml
=============================
Tests: 15 (SUCCESSES: 12, FAILURES: 3, EXCEPTIONS: 0)
Failures: 3 (UNKNOWN: 0, LOW: 1, MEDIUM: 1, HIGH: 1, CRITICAL: 0)
+-----------+------------+-----------------+----------+---------------------------------------+
| TYPE | MISCONF ID | CHECK | SEVERITY | MESSAGE |
+-----------+------------+-----------------+----------+---------------------------------------+
| Kubernetes| KSV012 | Image Tag | MEDIUM | Container 'app' uses 'latest' tag |
| Kubernetes| KSV001 | Privileged | HIGH | Container 'app' runs in privileged mode|
+-----------+------------+-----------------+----------+---------------------------------------+
4. Génération de SBOM (Software Bill of Materials)
Le SBOM est essentiel pour la sécurité de la chaîne d'approvisionnement logicielle. Trivy génère des SBOM aux formats standards :
# Générer un SBOM au format SPDX
trivy image --format spdx-json python:3.9-slim > sbom.spdx.json
# Générer un SBOM au format CycloneDX
trivy image --format cyclonedx python:3.9-slim > sbom.cyclonedx.xml
Les SBOM générés servent pour les audits de conformité et l'analyse d'impact des vulnérabilités.
5. Détection des fuites d'informations sensibles
Trivy scanne le code pour détecter les informations sensibles codées en dur (clés API, mots de passe, tokens) :
trivy fs --scanners secret ./my-project
Règles de détection intégrées :
- AWS Access Key
- GitHub Token
- Slack Webhook URL
- Clé privée
- Chaîne de connexion base de données
Intégration CI/CD en pratique
Intégrer Trivy dans vos pipelines CI/CD est la clé du "shift left" en sécurité. Voici des exemples pour les plateformes courantes.
GitHub Actions
Créez .github/workflows/trivy.yml à la racine du projet :
name: Trivy Security Scan
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
trivy-scan:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Run Trivy vulnerability scanner
uses: aquasecurity/trivy-action@master
with:
image-ref: 'python:3.9-slim'
format: 'table'
severity: 'CRITICAL,HIGH'
exit-code: '1' # Échec si vulnérabilités graves détectées
Ce workflow scanne automatiquement l'image de conteneur à chaque push ou PR. Si des vulnérabilités HIGH ou CRITICAL sont trouvées, le CI échoue.
GitLab CI
Ajoutez dans .gitlab-ci.yml :
trivy-scan:
image:
name: aquasec/trivy:latest
entrypoint: [""]
script:
- trivy fs --exit-code 1 --severity HIGH,CRITICAL .
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
Jenkins Pipeline
pipeline {
agent any
stages {
stage('Security Scan') {
steps {
sh '''
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
aquasec/trivy image --exit-code 1 --severity HIGH,CRITICAL \
my-app:latest
'''
}
}
}
}
Fonctionnalités avancées
1. Ignorer certaines vulnérabilités
Certaines vulnérabilités peuvent être inexploitables dans votre contexte. Créez un fichier .trivyignore :
# .trivyignore
CVE-2023-1234
CVE-2023-5678
Ou utilisez --ignorefile pour un fichier personnalisé :
trivy image --ignorefile .trivyignore python:3.9-slim
2. Mettre en cache la base de données des vulnérabilités
Par défaut, Trivy met à jour la base de données à chaque scan. En CI/CD, ça crée du surcoût réseau. Utilisez le cache :
# Télécharger la base de données
trivy image --download-db-only
# Scans suivants avec cache local
trivy image --skip-db-update python:3.9-slim
Dans GitHub Actions, utilisez actions/cache :
- name: Cache Trivy DB
uses: actions/cache@v3
with:
path: ~/.cache/trivy
key: trivy-db-${{ hashFiles('~/.cache/trivy/db/trivy.db') }}
restore-keys: trivy-db-
3. Templates de rapports personnalisés
Trivy supporte les templates Go pour personnaliser l'output :
trivy image --format template --template "@contrib/html.tpl" python:3.9-slim > report.html
Templates intégrés :
@contrib/html.tpl: rapport HTML@contrib/junit.tpl: format JUnit XML (pour CI/CD)@contrib/sarif.tpl: format SARIF (pour GitHub Code Scanning)
4. Intégration avec Trivy Operator (Kubernetes)
Pour les clusters Kubernetes en production, déployez Trivy Operator pour une surveillance continue :
helm repo add aqua https://aquasecurity.github.io/helm-charts/
helm install trivy-operator aqua/trivy-operator --namespace trivy-system --create-namespace
Trivy Operator scanne automatiquement les workloads du cluster. Les résultats sont stockés en tant que CRD Kubernetes. Vous pouvez les consulter dans un Dashboard ou via l'API.
Dépannage des problèmes courants
Problème 1 : Scan trop lent
Cause : Le premier scan télécharge la base de données de vulnérabilités (environ 100-200 Mo).
Solution : Utilisez --skip-db-update ou téléchargez la base à l'avance :
trivy image --download-db-only
trivy image --skip-db-update python:3.9-slim
Problème 2 : Trop de faux positifs
Cause : La base de données peut contenir des vulnérabilités inexploitables dans votre contexte.
Solution : Utilisez .trivyignore pour ignorer les faux positifs connus, ou ajustez --severity pour ne voir que les vulnérabilités graves.
Problème 3 : Échec du scan d'images privées
Cause : Trivy ne peut pas accéder aux registries privées nécessitant une authentification.
Solution : Définissez les variables d'environnement ou utilisez --registry-token :
export TRIVY_USERNAME=myuser
export TRIVY_PASSWORD=mypassword
trivy image registry.example.com/my-private-image:latest
Problème 4 : Manque de mémoire
Cause : Le scan d'images ou systèmes de fichiers volumineux peut consommer beaucoup de mémoire.
Solution : Augmentez la limite mémoire du conteneur, ou utilisez le mode --light :
trivy image --light python:3.9-slim
Résumé
Trivy est un outil de scan de sécurité puissant et facile à utiliser. Sa valeur réside dans :
- La complétude : support de multiples cibles et types de détection, couvrant toute la chaîne de sécurité du code à la production
- La simplicité : interface CLI simple, documentation riche et communauté active
- L'intégration facile : support natif des plateformes CI/CD et Kubernetes majeures
- Les performances : implémenté en Go, démarrage rapide et faible consommation mémoire
Pour toute équipe de développement qui prend la sécurité au sérieux, intégrer Trivy dans le workflow quotidien est un choix judicieux. Il permet de détecter et corriger les problèmes de sécurité en amont, réduisant ainsi les risques en production.
Prochaines étapes recommandées :
- Installez Trivy en local et testez-le sur quelques images de conteneurs courantes
- Intégrez Trivy dans vos pipelines CI/CD avec des seuils de sécurité adaptés
- Passez en revue régulièrement les résultats de scan et établissez un processus de correction
- Explorez Trivy Operator pour ajouter une surveillance continue à vos clusters Kubernetes
La documentation officielle de Trivy est sur https://trivy.dev. Le dépôt GitHub est https://github.com/aquasecurity/trivy. En cas de problème, vous trouverez de l'aide détaillée et du support communautaire à ces adresses.
Lectures connexes :