Dans l'écosystème DevOps moderne, Docker est devenu un standard incontournable pour la conteneurisation d'applications. Cependant, avec la popularité croissante des conteneurs viennent également des préoccupations importantes en matière de sécurité. Les images Docker peuvent contenir des vulnérabilités critiques provenant de leurs dépendances, exposant vos applications à des risques importants.
Trivy est un scanner de vulnérabilités open-source développé par Aqua Security, simple, rapide et complet. Il permet de détecter les CVE (Common Vulnerabilities and Exposures) dans vos images Docker, systèmes de fichiers, dépôts Git et plus encore.
Cet article vous guidera dans l'utilisation de Trivy pour sécuriser vos images Docker, avec des exemples pratiques et une intégration dans votre pipeline CI/CD.
Les conteneurs Docker partagent le noyau du système hôte, ce qui signifie qu'une vulnérabilité dans un conteneur peut potentiellement compromettre l'ensemble du système. Les risques incluent :
Trivy se démarque des autres scanners par :
brew install aquasecurity/trivy/trivysudo apt-get install
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
aquasec/trivy:latest image [IMAGE_NAME]trivy --versionLa commande la plus simple pour scanner une image :
trivy image node:18-alpineRésultat : Trivy va :

Pour se concentrer uniquement sur les vulnérabilités critiques et hautes :
trivy image --severity CRITICAL,HIGH node:18-alpinetrivy image --ignore-unfixed node:18-alpineCela affiche uniquement les vulnérabilités pour lesquelles un patch existe.
Utile pour l'intégration CI/CD et l'analyse automatisée :
trivy image --format json --output trivy-report.json node:18-alpineFormat standard pour GitHub Security, GitLab Security Dashboard :
trivy image --format sarif --output trivy-results.sarif node:18-alpineFormat par défaut, idéal pour la lecture humaine :
trivy image --format table node:18-alpineCréez votre propre format de rapport :
trivy image --format template --template "@contrib/html.tpl" -o report.html node:18-alpinePrenons un Dockerfile problématique basé sur une vieille version d'Ubuntu :
FROM ubuntu:20.04
RUN apt-get update && apt-get install -y \
curl \
git \
python3 \
python3-pip
COPY app.py /app/
WORKDIR /app
CMD ["python3", "app.py"]Construire et scanner :
docker build -t vulnerable-app:1.0 .
trivy image --severity HIGH,CRITICAL vulnerable-app:1.0Résultat : Probablement 50+ vulnérabilités CRITICAL/HIGH.
Solution : Dockerfile amélioré :
# Utiliser une image de base plus récente et minimale
FROM ubuntu:22.04
# Installer les paquets et mettre à jour pour corriger les vulnérabilités
RUN apt-get update && apt-get install -y --no-install-recommends \
curl \
git \
python3 \
python3-pip \
&& apt-get upgrade -y \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
# Créer un utilisateur non-root
RUN useradd -m -u 1000 appuser
COPY --chown=appuser:appuser app.py /app/
WORKDIR /app
USER appuser
CMD ["python3", "app.py"]Re-scanner :
docker build -t secure-app:1.0 .
trivy image --severity HIGH,CRITICAL secure-app:1.0Amélioration : Réduction drastique des vulnérabilités (typiquement 90%+ d'amélioration).
Vous pouvez scanner votre Dockerfile avant même de construire l'image :
trivy config DockerfileCela détecte :
trivy repo https://github.com/votre-org/votre-projetTrivy scannera :
Créez .github/workflows/trivy-scan.yml :
name: Trivy Security Scan
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main ]
schedule:
- cron: '0 2 * * *' # Scan quotidien à 2h du matin
jobs:
trivy-scan:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Build Docker image
run: docker build -t ${{ github.repository }}:${{ github.sha }} .
- name: Run Trivy vulnerability scanner
uses: aquasecurity/trivy-action@master
Ajoutez dans .gitlab-ci.yml :
stages:
- build
- security-scan
build:
stage: build
image: docker:latest
services:
- docker:dind
script:
- docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .
- docker save $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA -o image.tar
artifacts:
paths:
- image.tar
trivy-scan:
stage: security-scan
image: aquasec/trivy:latest
script:
- docker load -i image.tar
- trivy image --exit-code 1 --severity CRITICAL,HIGH $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
- trivy image --format json --output trivy-report.json $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
artifacts:
reports:
container_scanning
pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'docker build -t myapp:${BUILD_NUMBER} .'
}
}
stage('Trivy Scan') {
steps {
sh '''
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
aquasec/trivy:latest image \
--severity CRITICAL,HIGH \
--exit-code 1 \
--format json \
--output trivy-report.json \
myapp:${BUILD_NUMBER}
'''
}
}
}
post {
always {
archiveArtifacts artifacts: 'trivy-report.json', allowEmptyArchive: true
}
}
Créez un fichier .trivyignore à la racine de votre projet :
# Ignorer CVE-2023-1234 car non applicable à notre use case
CVE-2023-1234
# Ignorer temporairement en attendant un patch
CVE-2023-5678 # TODO: Upgrader quand version 2.0 est disponiblePuis lancez Trivy :
trivy image --ignorefile .trivyignore myapp:latestPour accélérer les scans en CI/CD, mettez en cache la base de données :
GitHub Actions :
- name: Cache Trivy DB
uses: actions/cache@v4
with:
path: ~/.cache/trivy
key: ${{ runner.os }}-trivy-${{ github.run_id }}
restore-keys: |
${{ runner.os }}-trivy-Mise à jour manuelle de la DB :
trivy image --download-db-only# Scanner uniquement les packages OS
trivy image --scanners vuln myapp:latest
# Scanner OS + dépendances d'application
trivy image --scanners vuln,config myapp:latest
# Tout scanner (vulnérabilités + secrets + misconfiguration)
trivy image --scanners vuln,secret,config myapp:latestUtilisez --exit-code avec des conditions :
# Échouer uniquement si CRITICAL
trivy image --severity CRITICAL --exit-code 1 myapp:latest
# Échouer si CRITICAL ou HIGH
trivy image --severity CRITICAL,HIGH --exit-code 1 myapp:latestlatest.trivyignore avec des commentaires explicatifslatest : Utilisez toujours des versions fixesSymptôme : Trivy remonte 200+ vulnérabilités sur une image officielle.
Solution :
--severity CRITICAL,HIGH--ignore-unfixed# Avant
trivy image ubuntu:20.04 # 150 vulnérabilités
# Après
trivy image ubuntu:22.04 # 20 vulnérabilités
trivy image alpine:3.19 # 2 vulnérabilitésSymptôme : Le scan prend plusieurs minutes.
Solution :
# Utiliser le cache local
trivy image --cache-dir ~/.cache/trivy myapp:latest
# Scanner uniquement les OS packages (plus rapide)
trivy image --scanners vuln myapp:latest
# Désactiver le scan de secrets (si non nécessaire)
trivy image --scanners vuln,config myapp:latestSymptôme : Error: failed to download vulnerability DB
Solution :
# Télécharger manuellement la DB
trivy image --download-db-only
# Utiliser un miroir alternatif
trivy image --db-repository ghcr.io/aquasecurity/trivy-db myapp:latest
# Mode offline (si DB déjà téléchargée)
trivy image --skip-db-update myapp:latestTrivy est un outil indispensable dans la boîte à outils de tout DevOps soucieux de la sécurité. Sa simplicité d'utilisation, sa rapidité et sa précision en font le choix idéal pour scanner les vulnérabilités dans vos images Docker.
trivy image.trivyignore pour documenter les exceptionsMerci de me suivre dans cette aventure ! 🚀
Cet article a été écrit avec ❤️ pour la communauté DevOps.