Culture de sécurité dans une équipe produit
- Accueil
- Développement, applications & chaîne logicielle
- Culture de sécurité dans une équipe produit
Culture de sécurité dans une équipe produit
Section intitulée « Culture de sécurité dans une équipe produit »Une culture de sécurité ne consiste pas à ajouter une validation de plus à la fin du cycle. Elle consiste à rendre les décisions dangereuses coûteuses au moment où elles sont prises, et les décisions sûres plus rapides que leurs contournements. Le compromis est net : on paie du temps de conception, de maintenance et de discipline pour supprimer des interruptions bien plus chères, mais moins visibles dans les tableaux de bord.
Une équipe produit ressemble à une cuisine qui sert sans arrêt. Si chaque plat doit attendre qu’un inspecteur arrive à la fin, le service bloque et les erreurs restent cachées. Mieux vaut organiser la cuisine pour que les bons gestes soient naturels, et que les ingrédients douteux soient repérés avant l’assiette.
→ Lire l’explication complète de la marmotte
Vélocité perçue et coût réel des contrôles
Section intitulée « Vélocité perçue et coût réel des contrôles »La sécurité ralentit la vélocité quand elle arrive comme une file d’attente humaine, une règle imprévisible ou une exception négociée au dernier moment. Elle l’accélère quand elle transforme une erreur récurrente en défaut impossible à introduire. La distinction est opérationnelle : un contrôle bloquant doit être déterministe, s’exécuter en quelques minutes et produire une correction actionnable. Sinon, il devient un rituel. Les rituels produisent des captures d’écran, puis des dérogations, puis une dette qui se nourrit de sa propre bureaucratie.
La recommandation est de concentrer les contrôles obligatoires sur les propriétés qui rendent une compromission exploitable : exposition d’un secret, dépendance connue comme vulnérable et activement exploitée, contournement d’une autorisation, journalisation absente sur une action sensible, interface d’administration exposée. Le reste doit informer, créer un ticket traçable ou alimenter une dette arbitrée. Bloquer chaque alerte de qualité ou chaque version mineure vieillissante transforme le pipeline en machine à générer de l’indifférence. Le scanner finit alors par servir de décoration de Noël industrielle.
La vélocité perçue masque fréquemment le coût du rework. Une fonctionnalité livrée sans modèle d’autorisation explicite semble rapide jusqu’à l’arrivée du premier rôle métier atypique. Le correctif impose alors migration de données, compatibilité des interfaces, revue des journaux et parfois rotation de jetons déjà émis. Concevoir les frontières d’accès avant d’écrire les routes évite cette facture. Ce n’est pas une cérémonie d’architecture, c’est une économie de modifications irréversibles.
Une équipe produit doit publier un contrat de sécurité court et versionné : quelles données sont sensibles, quels événements doivent être journalisés, quels contrôles bloquent, qui possède les exceptions et combien de temps elles vivent. Une règle sans propriétaire est une recommandation déguisée. Une exception sans date d’expiration est une règle concurrente, généralement la pire.
Les pages architecture cyber et gouvernance complètent ce contrat côté responsabilités, risques et critères d’arbitrage. Le contrat produit, lui, doit rester proche du dépôt et du flux de livraison. Une politique dans un portail distant n’empêche rien entre deux merges.
Ownership sécurité et décisions de conception
Section intitulée « Ownership sécurité et décisions de conception »Désigner un référent sécurité par équipe ne signifie pas fabriquer un mini-centre opérationnel de sécurité déguisé en développeur fatigué. Son rôle est de maintenir les règles locales, de préparer les arbitrages et de relier les changements sensibles aux bonnes compétences. Il ne doit pas devenir le seul autorisé à penser sécurité : ce modèle crée un goulot d’étranglement et une absence immédiatement exploitable pendant les congés.
Les décisions de conception qui doivent laisser une trace sont limitées mais non négociables : classification des données, frontière de confiance, modèle d’autorisation, durée de vie des identifiants, stratégie de journalisation, dépendances externes et mécanisme de révocation. Une fiche de décision d’une page suffit si elle contient les hypothèses, l’attaque redoutée, le contrôle retenu et le propriétaire de l’exploitation. Un diagramme sans frontière de confiance est une carte de métro dessinée par un vendeur de feutres.
Le modèle de menace doit être déclenché par un changement de capacité, non par une période du calendrier. Ajouter une exportation de données, accepter un document utilisateur, introduire un compte de service, connecter un fournisseur d’identité ou rendre une action asynchrone sont des déclencheurs. Ils modifient la surface d’attaque. Une revue trimestrielle seule ne voit pas le changement qui est déjà en production depuis onze semaines, paisiblement assis sur un seau de poudre.
La méthode STRIDE (Spoofing, Tampering, Repudiation, Information Disclosure, Denial of Service, Elevation of Privilege) peut structurer l’analyse, à condition de la relier à des décisions. Par exemple, un lien de réinitialisation d’accès doit résister à l’usurpation, ne pas révéler si un compte existe, expirer rapidement, être à usage unique et produire un événement de sécurité. Écrire seulement « STRIDE réalisé » ne protège rien, sauf peut-être la mise en page du compte rendu.
Le contrôle d’accès doit être testé comme une propriété métier. Tester qu’un administrateur reçoit une réponse correcte ne démontre pas qu’un compte ordinaire est refusé. Chaque action sensible exige au minimum un test positif, un test de refus et un test sur une ressource appartenant à un autre tenant. La séparation entre tenants ne provient pas du préfixe de l’URL ni d’un commentaire optimiste dans le code.
Garde-fous CI/CD et exemple de règle bloquante
Section intitulée « Garde-fous CI/CD et exemple de règle bloquante »L’intégration continue et livraison continue, ou CI/CD (Continuous Integration and Continuous Delivery), doit exécuter les contrôles au même endroit que les changements. Un contrôle manuel détaché du merge perd son contexte, puis son efficacité. Il faut séparer trois niveaux : vérification locale rapide, contrôle obligatoire avant fusion, et analyse approfondie asynchrone avec création automatique d’un ticket.
La détection statique d’applications, ou SAST (Static Application Security Testing), trouve des motifs de code dangereux sans exécuter l’application. Elle est utile pour interdire certaines primitives, comme la désérialisation non contrôlée ou la construction de requêtes à partir d’entrées brutes. Elle ne prouve ni l’absence de défaut logique ni l’isolation réelle entre utilisateurs. Un résultat sans chemin exploitable doit être trié, mais un résultat classé à tort comme faux positif doit être revu à chaque changement de contexte.
La détection de secrets ne doit pas seulement scanner les nouveaux commits. Un secret retiré du fichier reste potentiellement présent dans l’historique, dans les journaux du pipeline, dans un artefact ou dans un cache de dépendances. La réponse correcte est de révoquer ou faire tourner le secret, d’identifier ses usages et de purger ce qui peut l’être. Réécrire l’historique sans rotation est une opération cosmétique avec des outils de jardinage.
Voici une règle reproductible avec Gitleaks, un détecteur de secrets, dans GitHub Actions. Elle bloque une demande de fusion si un secret reconnu apparaît dans l’historique analysé.
name: secret-scan
on: pull_request: push: branches: [main]
jobs: gitleaks: runs-on: ubuntu-latest steps: # fetch-depth: 0 permet d'inspecter les commits accessibles, # pas seulement le dernier instantané du dépôt. - uses: actions/checkout@v4 with: fetch-depth: 0
# Une détection déclenche un code de sortie non nul et bloque le job. - uses: gitleaks/gitleaks-action@v2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}Cette règle ne protège pas contre un secret injecté par une variable de pipeline, copié dans un ticket ou envoyé vers un service tiers. La gestion des secrets doit définir une source d’autorité, des droits minimaux, une journalisation des lectures et une rotation testée. Les fondations de la cryptographie aident à distinguer un secret applicatif d’une clé de chiffrement, confusion dont les dégâts restent étonnamment modernes.
Les exclusions du scanner doivent être dans le dépôt, limitées à une règle précise, commentées et expirables. Exclure un chemin entier parce qu’un exemple de test a déclenché une alerte revient à retirer le détecteur de fumée parce qu’il s’est mis à sonner pendant l’incendie.
Surface d’attaque du flux produit
Section intitulée « Surface d’attaque du flux produit »La culture de sécurité a elle-même une surface d’attaque. Un attaquant cherche les chemins où la pression de livraison pousse à réduire les contrôles : comptes de maintenance partagés, approbations de merge formelles, variables secrètes lisibles par trop de jobs, exception permanente, dépendance téléchargée sans verrouillage, environnement de test connecté à des données réelles.
Les attaques sur la chaîne de livraison ciblent particulièrement l’identité du pipeline. Un jeton d’automatisation ayant le droit d’écrire dans le dépôt et de déployer en production cumule deux pouvoirs qui doivent rester distincts. La compromission d’une dépendance, d’un poste de développement ou d’un exécuteur peut alors devenir une publication de code arbitraire. Les jetons doivent être à durée courte, à portée minimale et liés à une identité de charge de travail, plutôt qu’à un secret statique copié dans les variables du projet.
La revue de code réduit les défauts, mais ne garantit pas qu’un réviseur ait exécuté le changement, compris le modèle métier ou détecté une porte dérobée subtile. Elle ne remplace pas les tests d’autorisation, le contrôle des artefacts ni la séparation des droits. Exiger deux approbations sur chaque changement banal est coûteux et produit des validations mécaniques. Exiger une approbation spécialisée pour les modifications d’identité, de chiffrement, de réseau sortant ou de pipeline est proportionné.
Les artefacts doivent être identifiables par leur révision source, leur dépendance verrouillée et leur résultat de build. Déployer une image marquée latest détruit cette traçabilité : après incident, personne ne sait exactement ce qui a tourné. Le tag immuable et le digest cryptographique ne rendent pas le code sûr, mais permettent de relier un incident à une matière vérifiable. C’est moins glamour qu’une plateforme « augmentée », mais les octets n’écoutent pas les présentations commerciales.
Exploitation, mesure et droit à l’échec
Section intitulée « Exploitation, mesure et droit à l’échec »Une pratique non exploitée est une alerte de plus dans un cimetière numérique. Chaque contrôle bloquant exige un propriétaire, un délai de correction attendu, une procédure de secours et un signal de supervision. Si le service de secrets devient indisponible, l’application doit échouer selon un comportement connu : refuser une action sensible, utiliser une valeur déjà chargée durant une durée bornée, ou s’arrêter. Continuer silencieusement avec une configuration de secours inconnue est le scénario préféré des incidents longs.
Les clés et secrets doivent avoir un inventaire : propriétaire, finalité, environnement, méthode de rotation, dépendances et date de dernière utilisation. La rotation n’est validée que si l’ancien identifiant est révoqué et si le service continue de fonctionner avec le nouveau. Créer une nouvelle valeur sans retirer l’ancienne double seulement le stock de choses à voler.
Mesurer la culture ne signifie pas compter les formations suivies ni les vulnérabilités trouvées. Les métriques exploitables sont le délai entre détection et révocation d’un secret, le nombre d’exceptions expirées mais actives, la proportion d’actions sensibles couvertes par des tests de refus, le délai de correction par criticité et le taux de réouverture des défauts. Elles révèlent des flux. Elles ne doivent pas devenir un classement individuel, sous peine de voir les défauts disparaître des statistiques avant de disparaître du code.
Les sauvegardes des configurations de pipeline, des règles de contrôle et des définitions d’infrastructure doivent être testées par restauration. Une sauvegarde non restaurée est une hypothèse, pas une capacité de reprise. Les journaux de sécurité doivent survivre à la suppression d’un environnement éphémère et être protégés contre l’altération par le compte qui exécute le déploiement.
🐝 Ce qui arrive si on s’en passe
Section intitulée « 🐝 Ce qui arrive si on s’en passe »Sans contrat de sécurité ni inventaire des secrets, la fuite d’un identifiant devient impossible à borner : faute de propriétaire, de finalité et de journal des lectures, rien ne permet de dater la première utilisation illégitime, et la réponse doit supposer compromis tout ce que ce secret pouvait atteindre depuis sa création. Sans tests de refus inter-tenants dans la chaîne de livraison, une refonte peut réintroduire silencieusement un accès entre clients ; l’écart n’est alors révélé que par un utilisateur qui voit des données qui ne sont pas les siennes. Sans fiche de décision, l’analyse après incident ne sait plus distinguer un comportement voulu d’un défaut, et le correctif risque de supprimer une protection dont personne ne connaissait la raison. Enfin, sans propriétaire des exceptions, aucune personne n’est habilitée à couper un flux pendant un incident, ce qui allonge la fenêtre d’exploitation.
🦫 Explication de la marmotte 🍫
Section intitulée « 🦫 Explication de la marmotte 🍫 »Une équipe qui fabrique un service doit décider à l’avance quelles erreurs sont interdites et lesquelles doivent être signalées sans bloquer tout le travail. Les règles les plus graves sont vérifiées automatiquement à chaque modification : présence d’un mot de passe dans le code, utilisation d’un programme connu pour être dangereux, accès à une donnée sans droit prévu. Si une vérification échoue, la modification ne peut pas être ajoutée tant que le problème n’est pas corrigé ou qu’une exception limitée dans le temps est acceptée.
Avant d’ajouter une fonction qui touche à des données, à des comptes ou à des échanges avec un autre service, l’équipe décrit ce qui peut être attaqué. Elle décide qui peut faire quoi, quelles traces doivent être conservées et comment retirer un accès devenu dangereux. Ces décisions sont écrites avec le code pour pouvoir être relues quand le service change.
Les contrôles automatiques ne suffisent pas. Ils peuvent manquer une erreur de logique, ne pas voir une information copiée ailleurs, ou tomber en panne. Il faut donc surveiller leur fonctionnement, garder la liste des accès et des secrets, remplacer régulièrement ces secrets, et vérifier que l’ancien accès ne marche plus après remplacement. Quand un contrôle échoue, la procédure doit dire qui agit, quoi arrêter et comment reprendre sans contourner définitivement la protection.
À lire aussi
- Threat modeling STRIDE avant écrire le codeMéthode de threat modeling appliquée en amont du développement avec STRIDE, exigences de sécurité et conditions d’exploitation.
- Intégrer SAST, DAST et IAST dans une CI/CDComparaison technique des tests SAST, DAST et IAST, de leur couverture réelle, de leurs limites et de leur intégration dans un pipeline de développement.
- Comment revoir le code de sécurité au-delà du linterUne revue de code orientée sécurité couvre les failles de conception, les hypothèses métier et les chemins d'exploitation qu'un linter ne peut pas déduire.
- Comment lire un rapport OWASP Top 10Lire un rapport de scan OWASP Top 10 sans confondre signal technique, risque exploitable et bruit de détection.
Pages voisines
La citent
- Écrire un outil jetable proprement, sans faille ni dette
- Les secrets dans les dépôts Git
- Revue de sécurité du code généré par un assistant IA
Culture de sécurité dans une équipe produit
Elle cite
