1. Ce que cherche un scanner #
Vulnérabilités, configuration, secrets.
Le principe #
Un scanner inventorie les paquets de l'image (système et langages : npm, pip, Maven…) et les compare aux bases de vulnérabilités (CVE). Trivy cherche aussi les erreurs de configuration (Dockerfile, Kubernetes, Terraform) et les secrets oubliés.
2. Trivy en pratique #
Des résultats réels.
Scanner une image #
trivy image --severity HIGH,CRITICAL php:8.2-fpm-alpine
trivy image --ignore-unfixed --severity HIGH,CRITICAL nginx:1.30.6
trivy image --format json -o rapport.json monimage:1.0Sur une image PHP construite en 2023 (Alpine 3.18), Trivy a trouvé 23 vulnérabilités HIGH et CRITICAL, toutes corrigées depuis :
| Paquet | CVE | Installée | Corrigée en |
|---|---|---|---|
| curl | CVE-2023-38545 | 8.3.0-r0 | 8.4.0-r0 |
| curl | CVE-2024-6197 | 8.3.0-r0 | 8.9.0-r0 |
| libcrypto3 | CVE-2023-5363 | 3.1.3-r0 | 3.1.4-r0 |
| libcrypto3 | CVE-2024-6119 | 3.1.3-r0 | 3.1.7-r0 |
Ici, la correction est simple : reconstruire l'image sur une base à jour.
Le bruit des vulnérabilités sans correctif #
Sur l'image nginx officielle la plus récente (Debian), Trivy remonte 71 vulnérabilités HIGH et CRITICAL, dont 69 sans correctif disponible. Bloquer la CI sur ces 69 ne mènerait nulle part : utilisez --ignore-unfixed pour ne retenir que ce que vous pouvez corriger, et suivez le reste dans un fichier .trivyignore justifié, ou passez à une image durcie.
Scanner aussi la configuration #
trivy config DockerfileTests: 27 (SUCCESSES: 22, FAILURES: 5)
Failures: 5 (UNKNOWN: 0, LOW: 2, MEDIUM: 1, HIGH: 2, CRITICAL: 0)
DS-0001 (MEDIUM): Specify a tag in the 'FROM' statement for image 'node'
DS-0002 (HIGH): Specify at least 1 USER command in Dockerfile with non-root user as argument
DS-0005 (LOW): Consider using 'COPY . /app' command instead of 'ADD . /app'
DS-0026 (LOW): Add HEALTHCHECK instruction in your Dockerfile
DS-0029 (HIGH): '--no-install-recommends' flag is missed: 'apt-get update && apt-get install -y curl'Trivy recoupe Hadolint (version, ADD, --no-install-recommends) et ajoute l'absence d'utilisateur non-root et de HEALTHCHECK.
3. Bloquer en CI, et les alternatives #
Automatiser.
Dans un pipeline #
name: image
on: [push, pull_request]
jobs:
build-scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Lint du Dockerfile
run: docker run --rm -i hadolint/hadolint:v2.15.1 hadolint --failure-threshold warning - < Dockerfile
- name: Construire l'image
run: docker build -t app:${{ github.sha }} .
- name: Scanner l'image
run: |
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock aquasec/trivy:0.76.2 \
image --exit-code 1 --ignore-unfixed --severity HIGH,CRITICAL app:${{ github.sha }}--exit-code 1 fait échouer le job dès qu'une vulnérabilité HIGH ou CRITICAL corrigible est trouvée.
Les autres outils #
| Outil | Points forts |
|---|---|
| Trivy (Aqua) | Vulnérabilités, configuration, secrets, SBOM ; libre |
| Grype (Anchore) | Scanner libre rapide, souvent couplé à Syft pour le SBOM : grype monimage:1.0 |
| Docker Scout | Intégré à Docker Desktop et Docker Hub, recommandations d’image de base : docker scout cves monimage:1.0 |
| Registres | Harbor (Trivy intégré), GitLab, GitHub : scan à la réception |
Grype et Docker Scout n'ont pas été exécutés pour cet article ; leurs commandes viennent de leur documentation.
Sources #
Résultats réels de Trivy 0.76.2, novembre 2026 ; les nombres évoluent chaque jour avec les bases de vulnérabilités.
