Security scanning avec Trivy

À la fin de ce tutoriel, vous saurez installer Aqua Trivy, scanner des images Docker, un filesystem / repo (CVE, misconfigs, secrets), produire un SBOM et des rapports (table, JSON, SARIF), poser un gate CI fail-closed sur les CRITICAL, et optionnellement scanner une image vers ECR en ca-central-1. Le lab Dockerfile multi-stage + Buildx + Trivy intègre Trivy dans un build ; ici on approfondit le security scanning dédié (FS, config, secrets, SBOM, CI, ECR).

Niveau : Intermédiaire · Temps estimé : 45–60 min · Versions cibles : Trivy 0.5x+, Docker, AWS CLI v2 · Dernière vérification : 2026-09-11 · Region : ca-central-1

Slug : wow-security-scanning-trivy · Série : WOW (9/50) · Mot-clé SEO : trivy security scanning · Publish : READY

← Précédent : Dockerfile multi-stage Buildx Trivy · → Suivant : Conftest dans le CI · Aussi : Docker Registry · Argo CD GitOps

Prérequis

Coût estimé : 0–quelques €. Scans locaux gratuits. Lab ECR optionnel : cleanup obligatoire.

export AWS_PROFILE=lab
export AWS_DEFAULT_REGION=ca-central-1

Ce que nous allons construire

Security scanning Trivy (WOW 9/50) — ca-central-1
  ├── Pourquoi scanner (CVE, supply chain, shift-left)
  ├── Install Trivy 0.5x+ + DB update
  ├── trivy image (alpine / nginx, HIGH+CRITICAL)
  ├── trivy fs / repo (misconfigs, secrets)
  ├── SBOM + formats (table, json, sarif) + .trivyignore
  ├── Gate CI fail-closed + policy DEH
  ├── Lab optionnel ECR ca-central-1 + cleanup
  └── Anti-patterns + checklist prod + quiz + FAQ

(Schéma — alt : « Commit → Trivy image/fs/config → SBOM + SARIF → gate CI → ECR ca-central-1 si CRITICAL=0 ».)

Étape 1 — Pourquoi scanner (CVE, supply chain, shift-left)

Une image « qui démarre » n’est pas sûre. CVE packagées, secrets oubliés et misconfigs font partie de la supply chain. Le shift-left : détecter avant merge / push registry.

Chez DevOps Elastic Hayway (DEH), Aqua Trivy est le scanner polyvalent : images, FS, repo, config, secrets, SBOM — un binaire, idéal en CI.

Scanner Force Limite typique
Trivy (Aqua) Image + FS + config + secrets + SBOM Policies métier → Conftest/OPA
Grype / Syft CVE + SBOM Moins config/secrets intégré
Clair Focus registry Setup plus lourd
Docker Scout UX Docker Hub Moins universel hors Docker
Snyk DX + suggestions Licence / quotas

Complément DEH : Trivy (CVE/misconfig) + Conftest (Rego métier).

Étape 2 — Installer Trivy

TRIVY_VERSION=0.56.2
curl -sfL "https://github.com/aquasecurity/trivy/releases/download/v${TRIVY_VERSION}/trivy_${TRIVY_VERSION}_Linux-64bit.tar.gz" 
  | tar -xz trivy
sudo mv trivy /usr/local/bin/
trivy --version

Debian/Ubuntu : repo Aqua apt ; macOS : brew install trivy. En CI : image aquasec/trivy ou binaire piné.

trivy image --download-db-only

Sans DB à jour, les résultats sont périmés. Air-gap : cache DB versionné.

Étape 3 — Scanner une image Docker

docker pull alpine:3.20
docker pull nginx:1.27-alpine
trivy image --severity HIGH,CRITICAL alpine:3.20
trivy image --severity HIGH,CRITICAL nginx:1.27-alpine

Lisez le résumé (OS + libs). Ne citez pas une CVE comme « actuelle » sans re-scan — la DB évolue. Placeholders du type CVE-XXXX uniquement en doc.

trivy image --severity CRITICAL --exit-code 1 alpine:3.20
echo "exit=$?"

--exit-code 1 : échec si finding au seuil. Sans cela, Trivy peut lister des CRITICAL et sortir 0 — dangereux en CI. Option utile : --ignore-unfixed si la policy DEH n’exige un correctif que lorsqu’un fix existe.

Étape 4 — Scanner le filesystem / repo

mkdir -p ~/lab-trivy-wow9 && cd ~/lab-trivy-wow9
trivy fs --severity HIGH,CRITICAL .
trivy config --severity HIGH,CRITICAL .
trivy fs --scanners vuln,secret,misconfig --severity HIGH,CRITICAL .
# variante remote :
# trivy repo --severity HIGH,CRITICAL https://github.com/aquasecurity/trivy-ci-test

trivy fs : dépendances / lockfiles. Misconfigs : Dockerfile USER root, K8s privileged, Terraform public. Secrets : tokens en clair. Corrigez à la source ; un secret en .trivyignore sans ticket + expiry = dette.

Étape 5 — SBOM + formats + .trivyignore

trivy image --format table alpine:3.20
trivy image --format json -o alpine-trivy.json alpine:3.20
trivy image --format sarif -o alpine-trivy.sarif alpine:3.20
trivy image --format spdx-json -o alpine-sbom.spdx.json alpine:3.20

table = lecture locale · json = scripts · sarif = GitHub Code Scanning · SBOM (SPDX/CycloneDX) = inventaire supply chain.

cat > .trivyignore << 'EOF'
# Ticket DEH-1234 — waiver jusqu’au 2026-12-01 — owner: plateforme
CVE-XXXX-YYYY
EOF

Chaque entrée : ID, ticket, owner, expiry. Préférez patch / rebuild de la base image.

Étape 6 — Gate CI + policy DEH

#!/usr/bin/env bash
set -euo pipefail
IMAGE="${1:?image required}"
trivy image --severity CRITICAL --exit-code 1 --ignore-unfixed "$IMAGE"
echo "OK: aucun CRITICAL (unfixed) sur $IMAGE"
name: trivy-scan
on: [push, pull_request]
jobs:
  image:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: docker build -t deh/app:${{ github.sha }} .
      - uses: aquasecurity/trivy-action@0.28.0
        with:
          image-ref: deh/app:${{ github.sha }}
          severity: CRITICAL
          exit-code: "1"
          ignore-unfixed: true
Règle Attendu DEH
CRITICAL unfixed sur main Bloquant
HIGH Bloquant ou ticket < 14 j
Secrets Bloquant immédiat
.trivyignore Ticket + owner + expiry
SBOM Artefact CI aux releases

Jamais continue-on-error: true sur Trivy. Complétez avec Conftest.

Étape 7 — Lab ECR ca-central-1 (optionnel)

export AWS_PROFILE=lab
export AWS_DEFAULT_REGION=ca-central-1
ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
REPO=deh-wow9-trivy
aws ecr create-repository --repository-name "$REPO" --region ca-central-1 || true
aws ecr get-login-password --region ca-central-1 
  | docker login --username AWS --password-stdin "${ACCOUNT_ID}.dkr.ecr.ca-central-1.amazonaws.com"
docker pull alpine:3.20
docker tag alpine:3.20 "${ACCOUNT_ID}.dkr.ecr.ca-central-1.amazonaws.com/${REPO}:alpine-320"
# docker push ...   # optionnel
ECR_URI="${ACCOUNT_ID}.dkr.ecr.ca-central-1.amazonaws.com/${REPO}:alpine-320"
trivy image --severity HIGH,CRITICAL "$ECR_URI"

Cleanup :

aws ecr batch-delete-image --repository-name "$REPO" --region ca-central-1 
  --image-ids imageTag=alpine-320 2>/dev/null || true
aws ecr delete-repository --repository-name "$REPO" --region ca-central-1 --force

Priorité : image locale + gate CI. ECR = preuve registry privée en ca-central-1.

Étape 8 — Anti-patterns + checklist prod DEH

Anti-patterns : scanner seulement en prod ; .trivyignore fourre-tout ; base latest sans digest ; secrets dans l’image ; gate warning-only sur main ; confondre ce WOW avec le lab multi-stage (là-bas Trivy embarqué au build ; ici profondeur scanning + CI + ECR).

Checklist prod DEH

  • [ ] Trivy piné (version / action) en CI
  • [ ] Gate CRITICAL (--exit-code 1) sur PR et main
  • [ ] Scan fs / config / secret sur le repo
  • [ ] SBOM archivé aux releases
  • [ ] Waivers documentés (ticket, expiry)
  • [ ] Digest piné ; ECR ca-central-1 si AWS
  • [ ] Complément Conftest / OPA
  • [ ] Cleanup lab ECR après exercices

Erreurs fréquentes

Symptôme Cause / correction
DB download timeout Proxy ; --download-db-only + cache
Exit 0 avec CRITICAL Ajouter --exit-code 1
Trop de bruit HIGH --ignore-unfixed ; fixer la base
Secret faux positif Affiner ; ne pas couper tout le scanner
ECR no basic auth Relogin ; région ca-central-1
Image introuvable Tag/digest exact ; auth registry
Diff local vs CI Piner version Trivy + cache DB
Confusion multi-stage Ce WOW = scanning depth ; l’autre = Buildx lab

Quiz (5 questions)

1. Aqua Trivy sert surtout à :
– A. Remplacer OPA/Conftest
B. Scanner images, FS, config, secrets et produire SBOM / rapports
– C. Provisionner des clusters EKS

2. Pour faire échouer la CI sur CRITICAL :
– A. trivy image sans options
B. --severity CRITICAL --exit-code 1 (ou action équivalente)
– C. continue-on-error: true

3. Un .trivyignore DEH doit contenir :
– A. Seulement l’ID CVE
B. CVE + ticket + owner + date d’expiry
– C. Le mot de passe root

4. La région lab DEH est :
– A. us-east-1 uniquement
B. ca-central-1
– C. eu-west-3 obligatoire

5. Différence avec dockerfile-multistage-buildx-trivy :
– A. Doublon exact
B. Ici : profondeur scanning (FS, secrets, SBOM, CI, ECR) ; là-bas : lab multi-stage Buildx avec Trivy embarqué
– C. Trivy n’existe que dans l’un des deux

Réponses : 1‑B · 2‑B · 3‑B · 4‑B · 5‑B

FAQ

Trivy est-il gratuit ?

L’OSS Aqua Trivy est gratuit en local/CI classique. Offres commerciales Aqua possibles ; ce WOW reste sur le CLI OSS.

Scanner avant ou après le push ECR ?

Les deux : gate avant merge/push, puis scan de l’URI ECR en ca-central-1 pour valider le registry.

Trivy remplace-t-il Conftest ?

Non. Trivy = CVE, misconfigs, secrets, SBOM. Conftest = policies Rego métier. Voir wow-conftest-ci.

Quelle sévérité bloquer d’abord ?

DEH : CRITICAL (surtout unfixed) bloquant dès le jour 1 ; étendez aux HIGH selon le risque.

Comment gérer les faux positifs ?

Reproduire, documenter, waiver temporaire (.trivyignore + expiry). Pas de silence permanent.

SBOM obligatoire ?

De plus en plus exigé (audits clients). Archivez SPDX/CycloneDX aux releases.

Coût du lab ?

Scans locaux = 0 €. ECR optionnel = quelques centimes si cleanup oublié.

Pour aller plus loin

Maillage série WOW

← Précédent Argo CD GitOps
→ Suivant Conftest dans le CI
Aussi Dockerfile multi-stage Buildx Trivy · Docker Registry · DevSecOps pipeline

Meta publication (SEO)

  • Title SEO : Security scanning avec Trivy : images, FS, SBOM et gates CI (guide FR)
  • Meta description : Trivy security scanning : scanner images Docker, filesystem, secrets, SBOM, gate CI fail-closed et lab ECR ca-central-1. Guide WOW DevOps Elastic Hayway.
  • Focus keyword : trivy security scanning
  • Secondary : trivy docker, trivy ci, sbom trivy, ecr trivy, aqua trivy
  • Image : assets/web/devopelastichayway/cover-wow-security-scanning-trivy-1200x630.webp (à générer)
  • Catégorie : WOW / DevSecOps · Niveau : Intermédiaire
  • URL cible : https://devopelastichayway.com/tutoriels/wow-security-scanning-trivy/
  • Post live : N/A (nouveau) · slug wow-security-scanning-trivy · Publish : READY (Maître push centralisé)

← Catalogue Tutoriels

Pour aller plus loin — hubs live

Retour parcours Catalogue Tutoriels — hub de la série et leçons sœurs.