Aller au contenu
Culture DevOps high
🚧 Section en cours de réécriture — Le contenu est en cours de restructuration et peut évoluer.

Shift-Left : détecter les problèmes au plus tôt

18 min de lecture

En 2017, Equifax découvre une faille dans une dépendance Apache Struts. Le correctif existait depuis deux mois. Résultat : 147 millions de données personnelles compromises, 700 millions de dollars de pénalités. Cette faille aurait pu être détectée automatiquement par un simple scan de dépendances dans le pipeline CI.

Ce n’est pas un cas isolé. En 2021, la vulnérabilité Log4Shell dans la librairie Java Log4j a affecté des millions d’applications dans le monde. Les équipes qui avaient déjà mis en place des scans de dépendances automatisés ont pu identifier et corriger le problème en quelques heures. Les autres ont passé des semaines à auditer manuellement leur code.

Ces exemples illustrent un principe fondamental : le moment où vous détectez un problème détermine le coût de sa résolution.

Le shift-left est le principe fondateur du DevSecOps. L’idée est intuitive : plus on détecte un problème tôt dans le cycle de développement, moins il coûte cher à corriger. Au lieu d’attendre la fin du projet pour tester et auditer, on déplace (“shift”) ces activités vers le début (“left”) du processus.

Concrètement, cela signifie :

  • Écrire des tests avant ou pendant le développement, pas après
  • Scanner le code à chaque commit, pas une fois par mois
  • Vérifier les dépendances automatiquement, pas manuellement avant la release
  • Valider l’infrastructure avant de la provisionner, pas en production

Le shift-left n’est pas une nouveauté absolue. Les pratiques de Test-Driven Development (TDD) datent des années 2000. Ce qui est nouveau, c’est l’application systématique de ce principe à tous les aspects du développement : fonctionnel, sécurité, infrastructure, conformité.

Le terme vient de la représentation classique du cycle de développement sur une timeline horizontale. Par convention, le temps s’écoule de gauche à droite :

Timeline du cycle de développement : le shift-left détecte les problèmes en phase Code (gauche), l'approche traditionnelle détecte en Production (droite)

Dans l’approche traditionnelle héritée du modèle en cascade (waterfall), les tests de sécurité arrivent juste avant la release. Une équipe dédiée effectue un audit, souvent sous pression du calendrier. Les problèmes découverts à ce stade créent des tensions : réécrire du code coûte cher, retarder la release aussi.

Le shift-left inverse cette logique en déplaçant les contrôles vers la phase de code, voire avant (conception). L’idée n’est pas de supprimer les contrôles finaux, mais de réduire drastiquement ce qu’ils trouvent parce que les vérifications ont déjà eu lieu plus tôt.

Chaque étape franchie multiplie le coût de correction d’un problème. Ce n’est pas une métaphore : c’est un phénomène mesurable et documenté depuis des décennies dans l’ingénierie logicielle.

Phase de détectionCoût relatifPourquoiExemple concret
IDE / pre-commit1xLe développeur corrige immédiatement, contexte frais5 minutes pour supprimer un secret hardcodé
CI / Pull Request5xRelecture nécessaire, tests à relancer30 min : comprendre l’alerte, corriger, repousser
Staging / QA15xCycle complet de test, potentiel rollback2h : investigation, correction, nouveau cycle de tests
Production100xIncident, rollback, communication, post-mortem1-2 jours : mobilisation équipe, rollback, vérifications
Après compromission1000x+Forensics, amendes, réputation, juridiqueSemaines à mois : Equifax a payé 700M$

Plusieurs facteurs expliquent cette croissance exponentielle :

  1. Perte de contexte : Plus le temps passe, plus le développeur oublie les détails de son code. Retrouver le contexte prend du temps.

  2. Effet domino : Un bug non détecté influence le code écrit ensuite. Corriger le bug original peut casser le code qui en dépendait.

  3. Coordination : En production, la correction implique plusieurs équipes (dev, ops, sécurité, communication). Chaque coordination a un coût.

  4. Impact business : Un incident en production affecte les utilisateurs, la réputation, potentiellement le chiffre d’affaires.

  5. Obligations légales : Une fuite de données déclenche des obligations (notification CNIL, communication aux utilisateurs) avec des délais stricts.

Le shift-left peut se comprendre comme une stratégie de prévention de la dette technique. Chaque problème non détecté est comme un emprunt à taux variable : plus vous attendez pour le rembourser, plus les intérêts s’accumulent. Les intérêts, ici, ce sont les coûts de coordination, de contexte perdu et d’impact business.

Le shift-left s’applique à trois domaines complémentaires. Chacun apporte des bénéfices spécifiques, et c’est leur combinaison qui produit les meilleurs résultats.

C’est le shift-left “classique”, celui qui a donné son nom au concept. L’idée est d’écrire les tests avant ou pendant le développement, pas après.

Historiquement, les tests arrivaient en fin de cycle. Une équipe QA dédiée testait l’application une fois le développement “terminé”. Ce modèle posait plusieurs problèmes :

  • Les développeurs avaient déjà changé de contexte
  • Les bugs découverts nécessitaient de revenir en arrière
  • La QA devenait un goulot d’étranglement

Le shift-left des tests inverse cette dynamique :

PratiqueDescriptionBénéficeFeedback
TDDÉcrire le test avant le codeDesign émergent, couverture garantieSecondes
Tests unitairesTester chaque fonction isolémentFeedback rapide, facile à maintenirSecondes
Tests d’intégrationTester les interactions entre composantsDétection des problèmes d’interfaceMinutes
Tests de contratValider les APIs entre servicesÉviter les régressions d’interfaceMinutes

Le principe clé : chaque test doit s’exécuter le plus tôt possible dans le cycle. Un test unitaire qui s’exécute en 10ms dans l’IDE est plus précieux qu’un test E2E qui prend 5 minutes dans la CI.

→ Voir Stratégies de tests pour approfondir la pyramide des tests

C’est le cœur du DevSecOps : intégrer les contrôles de sécurité dès le développement, au lieu de les reléguer à un audit final.

Traditionnellement, la sécurité fonctionnait en mode “gardien” : une équipe dédiée validait (ou rejetait) les releases juste avant la mise en production. Ce modèle créait des frictions :

  • Les équipes sécurité étaient perçues comme des freins
  • Les audits de dernière minute retardaient les releases
  • Les développeurs ne comprenaient pas les enjeux de sécurité
  • Les failles découvertes tard coûtaient cher à corriger

Le shift-left de la sécurité distribue les contrôles sur tout le cycle :

PhaseContrôlesOutilsCe qu’on détecte
IDELinters sécurité, détection secrets temps réelExtensions Semgrep, SnykPatterns dangereux pendant l’écriture
Pre-commitScan secrets, validation formatGitleaks, pre-commit hooksSecrets avant qu’ils n’atteignent le dépôt
CI/CDSAST, SCA, IaC scanningSemgrep, Trivy, CheckovVulnérabilités dans le code et les dépendances
BuildScan images, signatureTrivy, CosignVulnérabilités dans les images, intégrité

L’objectif n’est pas de supprimer l’équipe sécurité, mais de changer son rôle. Au lieu de valider chaque release, elle définit les règles, maintient les outils et aide les équipes à monter en compétences. C’est un passage du mode “contrôleur” au mode “enabler”.

Avec l’Infrastructure as Code (IaC), l’infrastructure devient du code. Et comme tout code, elle peut (et doit) être testée avant d’être appliquée.

Sans shift-left, les erreurs d’infrastructure sont découvertes au moment du provisioning — ou pire, en production quand un attaquant exploite une misconfiguration. Exemples typiques :

  • Un bucket S3 accessible publiquement
  • Un groupe de sécurité qui autorise tout le trafic entrant
  • Un secret Kubernetes non chiffré
  • Un conteneur qui tourne en root

Le shift-left de l’infrastructure consiste à scanner ces configurations avant qu’elles ne soient appliquées :

QuoiQuandCommentCe qu’on détecte
TerraformAvant terraform applyCheckov, tfsec, OPABuckets publics, chiffrement manquant, ports ouverts
KubernetesAvant kubectl applyKubescape, DatreeConteneurs root, secrets en clair, limites manquantes
DockerfilesAvant docker buildHadolint, DockleImages non officielles, utilisateur root, layers inutiles
CloudFormationAvant déploiementcfn-lint, CheckovConfigurations AWS non conformes

L’avantage de l’IaC : les mêmes outils de revue de code (pull requests, CI/CD) s’appliquent à l’infrastructure. Un changement de configuration passe par le même processus qu’un changement de code applicatif.

La mise en œuvre du shift-left doit être progressive. Vouloir tout faire d’un coup est le meilleur moyen de frustrer les équipes et d’abandonner. Voici une approche incrémentale qui a fait ses preuves.

  1. Commencer par les pre-commit hooks

    C’est l’investissement le plus rentable. Les pre-commit hooks s’exécutent localement, avant même que le code n’atteigne le dépôt. Si un développeur tente de committer un secret, il est bloqué immédiatement.

    Fenêtre de terminal
    # Installation de pre-commit (framework Python)
    pip install pre-commit
    # Initialiser dans le projet
    cd mon-projet
    pre-commit install

    Créez un fichier .pre-commit-config.yaml à la racine :

    .pre-commit-config.yaml
    repos:
    # Détection de secrets
    - repo: https://github.com/gitleaks/gitleaks
    rev: v8.18.0
    hooks:
    - id: gitleaks
    # Formatage et linting basique
    - repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v4.5.0
    hooks:
    - id: trailing-whitespace
    - id: end-of-file-fixer
    - id: check-yaml
    - id: check-added-large-files

    Pourquoi commencer ici ? Parce que c’est le point le plus à gauche du cycle. Un secret bloqué en pre-commit ne coûte que quelques secondes à corriger. Le même secret découvert en production peut coûter des millions.

  2. Ajouter SAST dans la CI

    Une fois les pre-commit hooks en place, ajoutez l’analyse statique dans votre pipeline CI. Chaque pull request sera scannée automatiquement.

    # Exemple GitHub Actions (.github/workflows/security.yml)
    name: Security Scan
    on: [pull_request]
    jobs:
    sast:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    - name: Run Semgrep
    uses: returntocorp/semgrep-action@v1
    with:
    config: >-
    p/security-audit
    p/secrets
    p/owasp-top-ten

    Conseil : Commencez avec des règles larges (p/security-audit) puis affinez selon les faux positifs rencontrés. Mieux vaut quelques alertes pertinentes que des centaines ignorées.

  3. Intégrer SCA pour les dépendances

    L’analyse des dépendances (SCA) détecte les vulnérabilités connues (CVE) dans les bibliothèques tierces. C’est crucial : 80% du code d’une application moderne vient de dépendances.

    - name: Scan dependencies with Trivy
    run: |
    # Installer Trivy
    curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin
    # Scanner le système de fichiers
    # --exit-code 1 : échouer si vulnérabilités HIGH ou CRITICAL
    trivy fs --severity HIGH,CRITICAL --exit-code 1 .

    Stratégie de seuils : Bloquez uniquement les vulnérabilités critiques au début. Une fois l’équipe habituée, abaissez progressivement le seuil.

  4. Scanner l’IaC

    Si vous utilisez Terraform, CloudFormation ou Kubernetes, ajoutez un scan des configurations :

    - name: Checkov IaC scan
    uses: bridgecrewio/checkov-action@master
    with:
    directory: terraform/
    framework: terraform
    # Ne pas échouer sur les warnings, uniquement les erreurs
    soft_fail: false
    # Exclure certaines règles si nécessaire
    skip_check: CKV_AWS_123,CKV_AWS_456

    Important : Documentez chaque règle exclue (skip_check). Une exclusion sans justification devient une dette technique.

  5. Mesurer et itérer

    Le shift-left n’est pas un projet one-shot. C’est une pratique qui s’améliore continuellement. Suivez ces métriques :

    MétriqueCe qu’elle indiqueCible
    Vulnérabilités par phaseEfficacité du shift-leftMax en pre-commit/CI, min en prod
    Temps moyen de correctionRéactivité de l’équipe< 24h pour critique
    Taux de faux positifsQualité des règles< 10%
    Taux de contournementAdhésion de l’équipe< 5%

    Revoyez ces métriques mensuellement et ajustez les règles en conséquence.

Le shift-left mal implémenté peut faire plus de mal que de bien. Voici les erreurs les plus courantes et comment les éviter.

PiègeSymptômeCauseSolution
Tout bloquerPipeline rouge en permanence, devs frustrésRègles trop strictes dès le départBloquer uniquement le critique, alerter le reste. Durcir progressivement.
Ignorer les faux positifs500 alertes/jour, tout le monde ignoreOutils mal configurésConfigurer des exclusions documentées. Chaque exclusion doit avoir une justification.
Outils sans formationDevs contournent les contrôles avec --no-verifyRègles imposées sans explicationFormer, expliquer le “pourquoi”. Impliquer les devs dans le choix des règles.
Shift-left sans shift-rightSentiment de fausse sécuritéFocus exclusif sur la CICompléter avec DAST en staging et monitoring en production.
Pas de propriétaireAlertes qui traînent, personne ne corrigeResponsabilité floueChaque alerte doit avoir un propriétaire. Intégrer dans le workflow (tickets Jira).
Métriques absentesImpossible de savoir si ça marchePas de suiviMesurer : vulnérabilités par phase, temps de correction, faux positifs.

Un des pièges les plus insidieux est la fatigue d’alerte (alert fatigue). Quand les développeurs reçoivent des centaines d’alertes par jour, ils finissent par tout ignorer — y compris les vraies failles critiques.

Pour l’éviter :

  • Prioriser : Seules les vulnérabilités critiques bloquent. Le reste est informatif.
  • Contextualiser : Une CVE critique dans une dépendance de test n’est pas aussi grave qu’en production.
  • Dédupliquer : Un même problème ne doit pas générer 50 alertes.
  • Actionner : Chaque alerte doit mener à une action claire (corriger, accepter le risque, exclure avec justification).

Le shift-left a un complément naturel : le shift-right. Si le shift-left déplace les contrôles vers le début, le shift-right les étend vers la fin — c’est-à-dire en production.

Pourquoi tester en production ? Parce que certains problèmes ne se manifestent que dans des conditions réelles :

  • Charge utilisateur réelle (vs tests de charge simulés)
  • Interactions avec des systèmes tiers en production
  • Comportements émergents à grande échelle
  • Attaques zero-day non couvertes par les scans

Les pratiques shift-right incluent :

PratiqueDescriptionObjectif
Feature flagsActiver une fonctionnalité pour un sous-ensemble d’utilisateursLimiter l’impact d’un bug
Canary releasesDéployer sur 1% des serveurs avant le resteDétecter les problèmes avant propagation
Blue/greenDeux environnements identiques, basculer instantanémentRollback immédiat si problème
Chaos engineeringInjecter des pannes volontairesValider la résilience
Monitoring de sécuritéDétecter les comportements anormaux en temps réelIdentifier les attaques

Les deux approches forment un continuum de qualité :

Continuum shift-left / shift-right : du pre-commit au monitoring, avec les contrôles de sécurité à chaque étape

Le shift-left réduit le nombre de problèmes qui atteignent la production. Le shift-right détecte ceux qui passent malgré tout et limite leur impact. Les équipes les plus performantes pratiquent les deux.

  • Shift-left = déplacer tests et sécurité vers le début du cycle
  • Le coût de correction augmente exponentiellement avec le temps
  • Trois dimensions : tests fonctionnels, sécurité, infrastructure
  • Commencer par les pre-commit hooks (ROI immédiat)
  • Ne pas tout bloquer : critique → blocage, moyen → alerte
  • Compléter avec shift-right (monitoring, chaos engineering)