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-1Slug :
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
- Docker installé — rappel Images Docker
- Bases Dockerfile / multi-stage — Dockerfile multi-stage + Buildx + Trivy
- Trivy : installé à l’étape 2 (apt ou binaire officiel)
- Optionnel ECR :
AWS_PROFILE=lab, AWS CLI v2, droits ECR enca-central-1— Docker Registry
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 etmain - [ ] Scan
fs/config/secretsur le repo - [ ] SBOM archivé aux releases
- [ ] Waivers documentés (ticket, expiry)
- [ ] Digest piné ; ECR
ca-central-1si 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
- Documentation Trivy (Aqua)
- Dockerfile multi-stage + Buildx + Trivy
- Conftest dans le CI
- Docker Registry
- Argo CD GitOps
- Pipeline DevSecOps
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é)
Pour aller plus loin — hubs live
Retour parcours Catalogue Tutoriels — hub de la série et leçons sœurs.