Pipeline DevSecOps de A à Z
À la fin de ce tutoriel, vous saurez orchestrer un pipeline DevSecOps de A à Z : gitleaks, build, Trivy (HIGH/CRITICAL), SBOM Syft, Cosign (keyless ou mock lab), policy-as-code, puis push ECR
ca-central-1via OIDC — sans access keys. Les briques sont déjà couvertes ; l’angle DevOps Elastic Hayway (DEH) est l’enchaînement + les gates.Niveau : Intermédiaire · Temps estimé : 60–80 min · Versions cibles : GitHub Actions · gitleaks · Trivy · Syft · Cosign/Sigstore · AWS CLI v2 · ECR · OIDC · Dernière vérification : 2026-09-11 · Region :
ca-central-1Slug :
wow-devsecops-pipeline· Série : WOW (35/50) · Mot-clé SEO : pipeline DevSecOps · Publish : HOLD← Précédent : Cosign / Sigstore · → Suivant : GitLab CI avancé · Aussi : Trivy · SBOM · Falco · OIDC AWS
Prérequis
- Trivy + Dockerfile multi-stage / buildx
- SBOM & supply chain · Cosign / Sigstore
- OPA/Gatekeeper · Conftest CI
- GitHub Actions OIDC AWS
- Compte lab (
AWS_PROFILE=lab), repo Actions, droits IAM IdP + ECR
Coût estimé : 0–quelques € (ECR, runners). Cleanup obligatoire. Pas d’EKS « pour tester ».
export AWS_PROFILE=lab
export AWS_DEFAULT_REGION=ca-central-1
aws sts get-caller-identity
Ce que nous allons construire
Pipeline DevSecOps (WOW 35/50) — ca-central-1
├── Shift-left vs runtime (CI gates ≠ Falco)
├── checkout → gitleaks → build → trivy → sbom → cosign → ECR
├── Gates fail-on HIGH/CRITICAL + policy-as-code
├── Lab : ECR + OIDC + workflow GitHub Actions
└── Cleanup + anti-patterns + quiz + FAQ
(Schéma — alt : « Pipeline DevSecOps GitHub Actions vers ECR ca-central-1 via OIDC ».)
Étape 1 — Pourquoi un pipeline DevSecOps
Un pipeline DevSecOps n’est pas « Trivy dans un job isolé ». C’est un contrat : rien ne part en ca-central-1 sans secrets scannés, image construite, CVE HIGH/CRITICAL bloquées, SBOM, signature, policy-as-code. DEH : une chaîne, des gates, pas six outils que personne n’enchaîne.
| Brique | Rôle | Tuto |
|---|---|---|
| gitleaks / SAST-SCA | Secrets + deps | ce WOW |
| Trivy | CVE image / IaC | wow-security-scanning-trivy |
| Syft SBOM | Inventaire | wow-sbom-supply-chain |
| Cosign | Provenance | wow-cosign-sigstore |
| OPA / Conftest | Policy-as-code | wow-policy-as-code-opa · wow-conftest-ci |
| OIDC | AssumeRole sans clés | github-actions-oidc-aws |
Shift-left = gates avant merge/push. Runtime = détection après deploy (Falco). Pipeline vert ≠ cluster sourd.
Étape 2 — Stages et gates
PR / push main
1. checkout
2. gitleaks → fail si secret
3. docker build → tag sha
4. trivy image → fail HIGH,CRITICAL
5. syft SBOM → artefact
6. conftest → fail policy
7. cosign sign → keyless (prod) / mock lab
8. docker push → ECR ca-central-1, OIDC only
| Gate | Fail si | Pourquoi |
|---|---|---|
| gitleaks | secret | Fuite Git |
| Trivy | HIGH/CRITICAL | Surface connue |
| Conftest | violate Rego | Config non conforme |
| Cosign | unsigned (prod) | Pas de provenance |
Lab : Cosign keyless si id-token: write ; sinon mock (cosign generate-key-pair jetable, jamais git). Prod DEH = keyless + OIDC, pas de cosign.key dans Secrets.
Étape 3 — Secrets, SAST, SCA
gitleaks bloque API keys, tokens AWS, PEM avant le build. SCA (Trivy fs / Dependabot) : libs ≠ secrets, même gate « on ne merge pas ».
gitleaks detect --source . --verbose
trivy fs --severity HIGH,CRITICAL --exit-code 1 .
Anti-pattern : continue-on-error: true sur gitleaks. DEH : fail-closed ; allowlist fichier, pas skip job.
Étape 4 — Build + Trivy HIGH/CRITICAL
Image multi-stage (dockerfile-multistage-buildx-trivy). Scan après build, avant push. --exit-code 1 + HIGH,CRITICAL = gate. LOW/MEDIUM → rapport, pas rouge PR.
IMAGE=deh-wow35-app:$(git rev-parse --short HEAD)
docker build -t "$IMAGE" .
trivy image --severity HIGH,CRITICAL --exit-code 1 "$IMAGE"
Scannez l’image (OS + libs), pas seulement le Dockerfile. Distroless réduit le bruit ; ça ne remplace pas Trivy.
Étape 5 — SBOM Syft + Cosign
Le SBOM (CycloneDX/SPDX) sert aux CVE du lendemain. Cosign signe le digest. Détails : wow-sbom-supply-chain, wow-cosign-sigstore.
syft "$IMAGE" -o cyclonedx-json > sbom.cdx.json
cosign generate-key-pair # lab mock, jamais git
cosign sign --key cosign.key "$IMAGE"
# prod : cosign sign --yes "$IMAGE"
Artefact Actions et (prod) attestation sur le digest ECR. Tag latest unsigned = anti-pattern.
Étape 6 — Policy-as-code avant registry
Conftest/OPA sur YAML K8s, Dockerfile ou plan TF : privileged, :latest, region hors ca-central-1. Filet config ; Trivy = filet CVE.
conftest test k8s/ --policy policy/
Voir wow-conftest-ci. Après Trivy, avant sign/push : inutile de signer un Deployment non conforme.
Étape 7 — Lab ca-central-1 : ECR + OIDC + Actions
Remplacez ACCOUNT_ID, my-org/deh-wow35. Cleanup obligatoire.
7.1 — ECR + rôle OIDC
export AWS_PROFILE=lab AWS_DEFAULT_REGION=ca-central-1
ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
aws ecr create-repository --repository-name deh-wow35-app
--image-scanning-configuration scanOnPush=true
--image-tag-mutability IMMUTABLE --region ca-central-1
# IdP GitHub une fois / compte — github-actions-oidc-aws.md
# Trust sub : repo:my-org/deh-wow35:ref:refs/heads/main
# Perms : ecr:GetAuthorizationToken + ecr:* sur ce repo
IMMUTABLE protège un tag déjà signé. scanOnPush complète Trivy CI, ne le remplace pas (trop tard : l’image est dans le registry).
7.2 — Workflow GitHub Actions
.github/workflows/devsecops.yml :
name: deh-wow35-devsecops
on:
push: { branches: [main] }
pull_request:
permissions:
contents: read
id-token: write # OIDC AWS + Cosign keyless
env:
AWS_REGION: ca-central-1
ECR_REPO: deh-wow35-app
jobs:
pipeline:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with: { fetch-depth: 0 }
- uses: gitleaks/gitleaks-action@v2
env: { GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} }
- uses: docker/setup-buildx-action@v3
- uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::ACCOUNT_ID:role/deh-wow35-gha-ecr
aws-region: ca-central-1
- uses: aws-actions/amazon-ecr-login@v2
- id: build
env: { ACCOUNT_ID: ${{ vars.AWS_ACCOUNT_ID }} }
run: |
IMAGE="$ACCOUNT_ID.dkr.ecr.ca-central-1.amazonaws.com/${{ env.ECR_REPO }}:${GITHUB_SHA::12}"
docker build -t "$IMAGE" .
echo "image=$IMAGE" >> "$GITHUB_OUTPUT"
- uses: aquasecurity/trivy-action@0.28.0
with:
image-ref: ${{ steps.build.outputs.image }}
format: table
exit-code: "1"
severity: HIGH,CRITICAL
- uses: anchore/sbom-action@v0
with:
image: ${{ steps.build.outputs.image }}
format: cyclonedx-json
artifact-name: sbom-wow35.cdx.json
- uses: sigstore/cosign-installer@v3
- name: push-and-sign
env: { IMAGE: ${{ steps.build.outputs.image }} }
run: |
docker push "$IMAGE"
cosign sign --yes "$IMAGE"
Fork PR : OIDC prod interdit (trust sub = main). Lab : environment lab + reviewers. Cosign keyless sans id-token: write échoue : voulu. Trivy avant push.
7.3 — Vérifs + cleanup
aws ecr describe-images --repository-name deh-wow35-app --region ca-central-1
cosign verify --certificate-oidc-issuer https://token.actions.githubusercontent.com
--certificate-identity-regexp 'https://github.com/my-org/deh-wow35/'
"$ACCOUNT_ID.dkr.ecr.ca-central-1.amazonaws.com/deh-wow35-app:SHA"
aws ecr delete-repository --repository-name deh-wow35-app
--region ca-central-1 --force
# IAM lab : delete-role deh-wow35-gha-ecr
Étape 8 — Anti-patterns + checklist DEH
Anti-patterns : AWS_ACCESS_KEY_ID dans GitHub ; continue-on-error Trivy/gitleaks ; push puis scan ; images unsigned ; latest mutable ; skip SBOM ; OIDC sub repo:org/* ; confondre CI et Falco ; region us-east-1.
Checklist : gitleaks fail-closed ; Trivy HIGH/CRITICAL exit-code 1 ; SBOM artefact ; Cosign keyless (ou mock lab) ; ECR ca-central-1 IMMUTABLE + OIDC ; trust sub repo+ref ; Conftest avant push ; Falco en plus au runtime ; cleanup lab.
Erreurs fréquentes
| Erreur | Impact | Correction |
|---|---|---|
| Access keys dans Secrets | Fuite | OIDC + rôle IAM |
Trivy continue-on-error |
CVE en prod | exit-code: "1" HIGH,CRITICAL |
Scan après docker push |
Registry pollué | Trivy avant push |
| Image unsigned | Pas d’admission | cosign sign + verify deploy |
| SBOM oublié | Aveugle CVE J+1 | Syft artefact |
OIDC sub wildcard |
Assume trop large | Borner repo + ref |
| Region us-east-1 | Incohérence DEH | Forcer ca-central-1 |
| Runtime = CI | Trous post-deploy | Falco |
Quiz (5 questions)
1. Un pipeline DevSecOps DEH, c’est surtout :
– A. Un scan Trivy manuel trimestriel
– B. Un enchaînement CI fail-closed (secrets, CVE, SBOM, sign, OIDC)
– C. Un antivirus laptop
2. Où placer Trivy par rapport au push ECR ?
– A. Après, via scanOnPush uniquement
– B. Avant le push, exit-code 1 sur HIGH/CRITICAL
– C. Uniquement sur le Dockerfile
3. Pourquoi OIDC plutôt que des access keys ?
– A. Plus lent donc plus sûr
– B. Pas de secret longue durée ; JWT borné par sub
– C. ECR refuse les access keys
4. Region lab de ce tuto :
– A. us-east-1
– B. ca-central-1
– C. eu-west-3
5. Shift-left vs runtime :
– A. C’est la même chose
– B. Shift-left = gates CI ; runtime = détection cluster (Falco)
– C. Runtime remplace Trivy
Réponses : 1‑B · 2‑B · 3‑B · 4‑B · 5‑B
FAQ
Pourquoi un pipeline DevSecOps plutôt que des jobs isolés ?
Les outils isolés se skippent. Le pipeline DevSecOps impose l’ordre : secret → build → CVE → SBOM → policy → sign → ECR. Contrat d’équipe, pas démo scanner.
Keyless Cosign en lab si Fulcio timeout ?
Mock : cosign generate-key-pair hors git, signez, supprimez la clé. Prod = keyless + OIDC. Jamais cosign.key dans git.
scanOnPush ECR remplace-t-il Trivy ?
Non. ECR scanne après push. Le gate CI empêche l’entrée. DEH : les deux.
Faut-il Falco si le pipeline est vert ?
Oui. Le CI ne voit pas un miner après deploy. Falco = runtime.
GitLab au lieu de GitHub Actions ?
Même stages. Voir wow-gitlab-ci-advanced + OIDC GitLab. Gates inchangées.
Quelle sévérité bloquer ?
HIGH + CRITICAL fail. MEDIUM = ticket. CVE sans fix : trivyignore daté, pas continue-on-error.
Pour aller plus loin
- Trivy · Dockerfile multi-stage / Trivy
- SBOM · Cosign
- OPA · Conftest · OIDC AWS
- Falco · GitLab CI avancé
Maillage série WOW
| ← Précédent | Cosign / Sigstore (WOW 33) |
| Aussi (31–34) | Trivy (31) · SBOM (32) · Falco (34) |
| → Suivant | GitLab CI avancé (WOW 36) |
| Policies | OPA/Gatekeeper · Conftest CI |
Meta publication (SEO)
- Title SEO : Pipeline DevSecOps de A à Z : GitHub Actions, Trivy, SBOM (guide FR)
- Meta description : Pipeline DevSecOps de A à Z : GitHub Actions, gitleaks, Trivy, SBOM Syft, Cosign, OIDC ECR ca-central-1, gates HIGH/CRITICAL, FAQ et quiz DEH.
- Focus keyword : pipeline DevSecOps
- Secondary : DevSecOps GitHub Actions, Trivy CI, SBOM Syft, Cosign keyless, ECR OIDC
- Image :
assets/web/devopelastichayway/cover-wow-devsecops-pipeline-1200x630.webp(à générer) - Catégorie : WOW / DevSecOps · Niveau : Intermédiaire
- URL cible : https://devopelastichayway.com/tutoriels/wow-devsecops-pipeline/
- Post live : N/A (nouveau) · slug
wow-devsecops-pipeline· Publish : HOLD (draft only — feu vert Maître requis)
Pour aller plus loin — hubs live
Retour parcours Catalogue Tutoriels — hub de la série et leçons sœurs.