Skip to content

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.