Sprint 1 Report â DevSecOps & Security Scanning
PĂ©riode : 2026-05-16 Ă 2026-05-30 Ăquipe : 1 ingĂ©nieur DevOps (Youssef Kadi) Repo : gitlab.com/yk-devops/fastapi-eks-project
Rapport rĂ©digĂ© a posteriori (backfill du 2026-06-20) pour homogĂ©nĂ©iser la sĂ©rie 0â4. Stories et incidents tirĂ©s du milestone GitLab et des incidents documentĂ©s ; rĂ©trospective reconstituĂ©e Ă partir de ces traces.
Executive Summary
Ce sprint a transformĂ© le pipeline en un vĂ©ritable pipeline DevSecOps : intĂ©gration de SAST, secret detection, dependency scanning et scan de conteneur (Trivy), puis mise en place de security gates qui bloquent une MR si un scan Ă©choue. La sĂ©curitĂ© n'est plus un audit ponctuel, elle devient une barriĂšre automatique Ă chaque MR. La consĂ©quence directe a Ă©tĂ© une vague de CVEs Ă traiter : c'est ici qu'ont Ă©tĂ© menĂ©es les migrations structurantes (python-jose â PyJWT, passlib â bcrypt direct) et qu'a Ă©mergĂ© le besoin du multi-stage build (concrĂ©tisĂ© au Sprint 3). Le fil rouge du sprint : les scanners ne servent Ă rien sans la discipline de traiter ce qu'ils remontent.
Stories livrées
| # | Description | Taille | Statut |
|---|---|---|---|
| #8 | Activer SAST + Secret Detection dans .gitlab-ci.yml |
M | Livré |
| #9 | Ajouter Trivy container scanning | M | Livré |
| #10 | Activer Dependency Scanning | S | Livré |
| #11 | Configurer les Security Gates (bloquer la MR si un scan échoue) | M | Livré |
Les migrations de sécurité associées (
python-joseâ PyJWT #13,passlibâ bcrypt #14) ont Ă©tĂ© tracĂ©es sur le milestone Sprint 2, mais leurs incidents (INC-005, INC-006) ont Ă©tĂ© vĂ©cus et documentĂ©s pendant ce sprint : les CVEs remontĂ©es par les scanners de Sprint 1 ont dĂ©clenchĂ© ces migrations.
Vélocité
| Taille | Nb éléments |
|---|---|
| S | 1 |
| M | 3 |
| Total | 4 |
Incidents majeurs et résolutions
Le sprint a capitalisé 4 incidents (INC-004 à INC-007), tous nés des scanners de sécurité nouvellement activés.
INC-004 : CVEs en cascade depuis une dépendance inutilisée
Trivy remontait 17 CVEs HIGH. La cause : http-tools (qui tire mitmproxy, un outil de debug rĂ©seau jamais utilisĂ© par FastAPI) prĂ©sent dans requirements.in, gĂ©nĂ©rant 12 CVEs par ses dĂ©pendances transitives. Suppression de la dĂ©pendance â 12/17 CVEs Ă©liminĂ©s automatiquement.
Leçon : Principle of Least Dependency. Auditer réguliÚrement les dépendances (pip-audit, pip list --outdated) ; une dépendance inutile est une surface d'attaque gratuite.
INC-005 : python-jose CVE CRITICAL (CVE-2024-33663)
Algorithm confusion avec les clĂ©s ECDSA, aucun patch (projet peu maintenu). Migration vers PyJWT (from jose import JWTError â from jwt.exceptions import InvalidTokenError).
Leçon : évaluer la santé d'un projet open source avant de l'adopter (derniÚre release, issues, mainteneurs actifs ; outils deps.dev, snyk advisor).
INC-006 : passlib incompatible avec bcrypt â„ 4.0
passlib 1.7.4 (abandonné depuis 2023) accédait à bcrypt.__about__.__version__, supprimé dans bcrypt 4.0. Migration vers bcrypt direct (hashpw/checkpw). Décision formalisée en ADR 004.
Leçon : surveiller l'activité des dépendances critiques (auth, crypto). Un projet abandonné = risque de sécurité et d'incompatibilité future. Dependabot/Renovate pour les alertes.
INC-007 : CVEs OS de l'image de base (python:3.10-slim)
Trivy remontait des CVEs sur des doublons de packages (wheel, jaraco.context) installés à la fois par apt et par pip. Fix court terme : .trivyignore justifié (packages de build, non utilisés au runtime). Fix long terme identifié : multi-stage build (livré au Sprint 3).
Leçon : une image Docker hérite des CVEs de son OS de base. Le multi-stage build réduit la surface d'attaque en ne gardant que le runtime.
Décisions d'architecture (ADRs)
| ADR | Décision | Résumé |
|---|---|---|
| 004 | Migration passlib â bcrypt direct | passlib abandonnĂ© et incompatible bcrypt â„ 4.0 ; bascule sur l'API bcrypt native |
Le reste des décisions du sprint (choix des scanners, configuration des security gates) est capturé dans .gitlab-ci.yml et l'ADR 005 (build pipeline) consolidé plus tard.
Rétrospective (reconstituée)
Ce qui a bien fonctionné. Les security gates rendent la sécurité non négociable : une MR ne passe pas si un scan échoue. La discipline de traiter les CVEs (et non les ignorer en masse) a été posée ici et s'est confirmée jusqu'au Sprint 4 (#95 : analyse d'exploitabilité avant tout .trivyignore).
Ce qui a coûté du temps. Deux dépendances abandonnées (python-jose, passlib) ont imposé des migrations de code (auth, crypto) en plus du simple bump. Le coût n'était pas le scanner mais la dette d'avoir adopté des libs non maintenues.
Ce que ça a appris. Un scanner ne sécurise rien tout seul : il révÚle. La valeur est dans la réaction disciplinée (auditer, migrer, justifier). Le réflexe « évaluer la santé d'une dépendance avant de l'adopter » est né ici.
Sprint 1 fermé le 2026-05-30. Le pipeline est désormais un pipeline DevSecOps avec gates bloquants.