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-1 via 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-1

Slug : 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

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

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)

← Catalogue Tutoriels

Pour aller plus loin — hubs live

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