Ce qui vous est demandé aujourd'hui
Jour 1 · Auditer, prouver et soutenir · 20 min
Une journée pour transformer quinze jours de travaux en trois livrables qu'un tiers peut vérifier, et pour les défendre vingt minutes devant un jury. Aucune notion nouvelle aujourd'hui : tout ce dont vous avez besoin a été construit entre le 3 et le 20 août. Ce que vous n'avez jamais fait, en revanche, c'est le faire tenir ensemble en une seule fois.
À quelle heure vous faites quoi
La journée est minutée et les jalons sont des rendez-vous : Samer les a dans son agenda, et il suit à distance.
| Créneau | Ce qui s'y joue |
|---|---|
| 9 h 00 – 9 h 30 | Cette leçon, puis le quiz de cadrage |
| 9 h 30 – 11 h 00 | Jalon 1 — la plateforme remonte et les cinq jobs passent au vert |
| 11 h 00 – 12 h 15 | Jalon 2 — les dix vulnérabilités rejouées, une preuve de fermeture chacune |
| 12 h 15 – 13 h 15 | Déjeuner |
| 13 h 15 – 14 h 50 | La leçon sur le rapport d'audit, puis jalon 3 — rédaction |
| 14 h 50 – 16 h 00 | La leçon sur la soutenance, puis jalon 4 — répétition chronométrée et plan de repli |
| 16 h 00 – 17 h 00 | Dernière vérification, soutenance à 16 h 10, retour du jury, clôture du parcours |
Les trois livrables
Ni plus, ni moins. Tout le reste de la journée sert ces trois-là.
| Livrable | Ce qui le rend recevable | Construit en |
|---|---|---|
| La plateforme | devsecops-lab:hardened tourne, le cluster dso-lab répond, Juice Shop est joignable sur 3000 | M1 · M3 |
| Le pipeline | Les cinq jobs — secrets, sast, sca, dast, image — verts sur main, et rouges dès qu'une faille revient | M1 J3 · M2 · M3 |
| Le rapport d'audit | rapports/audit-devsecops-lab.md au format des six parties, une preuve rejouable par finding | plan type posé en M5, rempli aujourd'hui |
Aucune vulnérabilité nouvelle à corriger. Aucun outil à installer. Aucun manifeste Kubernetes à écrire. Si vous vous surprenez à ouvrir un éditeur sur app.py pour autre chose que la régression volontaire du jalon 4, arrêtez-vous : vous êtes en train de fabriquer du travail au lieu de prouver celui qui est fait.
Les dix VULN-NN ont été fermées en M1, M2, M3 et M5. Ce qui manque n'est pas une correction de plus, c'est la preuve, aujourd'hui, sur le HEAD d'aujourd'hui, que chacune est effectivement fermée.
Le rappel qui ne se négocie pas
La journée fait rejouer des exploits réels et relance Juice Shop. Le cadre du 3 août s'applique intégralement : vous n'attaquez que ce que vous déployez vous-même, sur votre poste — devsecops-lab sur 5000 et juice-shop sur 3000. Jamais sur Internet, jamais sur une ressource de Caplogy, jamais sur le système d'un tiers sans mandat écrit. Ce n'est pas une précaution de style : les articles 323-1 et suivants du Code pénal punissent l'accès non autorisé à un système, même sans dommage.
Cela vaut aussi pendant la démonstration. Si le jury vous demande « et sur un vrai site, ça donnerait quoi ? », la bonne réponse est de décrire, pas de montrer.
La grille de soutenance
La voici en entier, à 9 h 05. Vous devez savoir à quoi vous consacrez vos heures.
| Critère | Ce que le jury regarde | Poids |
|---|---|---|
| Le pipeline refuse la faille | Une régression poussée en direct fait rougir la CI et bloque la fusion. C'est la démonstration centrale de la journée | ●●● |
| Les dix failles sont closes | Une preuve rejouable par VULN-NN — la même commande qu'à l'aller, un résultat différent | ●●● |
| Justification des choix | Pourquoi ce seuil de sévérité, pourquoi Calico, pourquoi ce périmètre. Un choix non justifié vaut un choix subi | ●●● |
| Durcissement effectif | Image non-root, PSA qui rejette, NetworkPolicy qui bloque — montrés, pas déclarés | ●● |
| Rapport d'audit | Les six parties, un vecteur CVSS complet par finding, une remédiation vérifiable | ●● |
| Posture d'attaquant | Le rapport de pentest Juice Shop du 20 août tient debout sous questions | ●● |
| Soutenance | Vingt minutes tenues, démonstration maîtrisée, réponses aux questions | ●● |
Le nombre d'outils installés sur votre poste. La longueur du rapport. Le score brut de kube-bench — un cluster kind n'est pas durci, ses FAIL sont attendus et vous l'avez écrit vous-même le 13 août.
Une plateforme modeste qui tourne, dont chaque garde-fou est démontrable et chaque choix explicable, vaut mieux qu'un dispositif ambitieux à moitié remonté. C'est le conseil le plus utile de cette page.
Le piège du jour n'est pas technique, il est de calendrier : les deux jalons qui pèsent le plus dans la grille — le pipeline vert et les dix preuves — sont ceux du matin, et le matin ne dure que trois heures et quart. Tout ce qui déborde de 12 h 15 se paie sur le rapport, puis sur la répétition, c'est-à-dire sur les deux choses qui rendent la soutenance tenable.
Auto-vérification en trente secondes : sur les sept lignes de la grille, dites laquelle vous inquiète le plus et à quelle heure de la journée elle se joue. Si vous ne savez pas répondre à la seconde partie, relisez le tableau des créneaux avant de lancer le premier conteneur.
Intention — poser le contrat d'évaluation avant le premier geste, et faire comprendre que la journée est une journée de preuve, pas de production. Le risque numéro un du PFR d'une filière DevSecOps est le réflexe de développeur : ouvrir l'éditeur et améliorer. L'encadré « ce que la journée ne vous demande pas » existe pour cela, et c'est le passage à faire relire s'il dérive.
Ce qui coince
- La confusion entre « la faille est corrigée » et « la fermeture est prouvée ». Elle structure toute la journée et se repère tôt : s'il vous dit à 9 h 30 que le jalon 2 sera rapide « parce que tout est déjà corrigé », il n'a pas lu la troisième ligne du tableau des livrables. Reprenez-le tout de suite, cela coûte deux minutes maintenant et une heure à 11 h 30.
- Le cluster kind, sous-estimé. Il l'a laissé tourner le 13 août et n'y a plus touché depuis huit jours ; entre-temps Docker a redémarré au moins une fois. C'est le composant le plus susceptible de manquer à l'appel, et c'est pour cela que le jalon 1 le prend en deuxième position et non en dernier.
- La grille lue en diagonale. Trois critères sur sept valent ●●● et deux d'entre eux se jouent avant midi. S'il commence par soigner le rapport, il inverse la journée.
Questions à anticiper
- « Est-ce que je peux corriger encore une faille ce matin ? » — non, et l'angle n'est pas l'interdiction : une correction non répétée est une régression potentielle poussée le jour de la soutenance, sur une branche protégée, sans temps pour la rattraper.
- « Le jury, c'est qui ? » — vous, à distance, plus un second évaluateur. Dites-le clairement : la soutenance passe par un partage d'écran, ce qui change la préparation matérielle. C'est traité au jalon 4, ne l'anticipez pas ici.
- « Je montre
devsecops-labou Juice Shop ? » — les deux ont leur place, mais le fil rouge de la démonstration estdevsecops-lab, parce que c'est la seule dont il possède le code et le pipeline. Juice Shop n'intervient qu'à travers le rapport de pentest.
Ce qu'il faut exiger — rien de matériel à la fin d'une leçon. Mais au premier échange de la journée, deux réponses en trente secondes : quelle ligne de la grille l'inquiète, et à quelle heure elle se joue. S'il cite un critère du soir alors que ses deux critères ●●● les plus lourds tombent avant midi, l'arbitrage de 11 h n'aura pas lieu et le rapport sera écrit à la va-vite après 15 h.
Quiz — Ce que le jury vérifiera
Jour 1 · Auditer, prouver et soutenir · 10 min
1. Votre job image lance trivy image --severity HIGH,CRITICAL --exit-code 1. Une CVE de sévérité MEDIUM apparaît dans l'image. Que fait le pipeline ?
2. Vous avez fermé VULN-03 (injection de commande) le 7 août. Qu'est-ce qui le prouve au jury ?
3. Votre netpol.yaml est appliqué et kubectl get netpol -n dso le liste. Que devez-vous montrer en plus ?
4. Le jury demande pourquoi votre registre de risques cote en CVSS et en DREAD.
Ces quatre questions ne mesurent pas votre score, elles vous rendent quatre réponses que le jury vous demandera cet après-midi presque mot pour mot. Après correction, reprenez chaque option que vous aviez cochée à tort et dites à voix haute ce qui la rend fausse, sans relire l'explication — si vous n'y arrivez pas, notez-la sur la fiche que vous préparerez au jalon 4.
La deuxième question est celle qui structure toute votre matinée : si vous l'avez manquée, relisez-la avant de lancer le jalon 2, sans quoi vous produirez un tableau de captures d'écran au lieu d'un tableau de preuves.
Intention — quatre questions, quatre réponses de soutenance, prises une dans chaque module (M3 pour le gate d'image, M2 pour la preuve de fermeture, M3 pour Calico, M4 pour CVSS/DREAD). Placé à 9 h 20 pour révéler le trou avant qu'il ne coûte, pas pour noter.
Ce qui coince
- q1 ratée dans le sens « il échoue » : il croit que
--exit-code 1réagit à tout. Conséquence directe, il ne saura pas défendre son seuil de sévérité, qui est une question de jury quasi certaine. - q2 est la plus importante des quatre et la plus ratée, dans le sens « Semgrep ne remonte plus rien ». C'est le cœur du jalon 2 : un échec ici annonce un tableau de preuves fait de sorties d'outils au lieu de rejeux d'exploits. À reprendre avant 11 h, pas après.
- q3 ratée signifie que la demi-journée du 12 août sur le remplacement de kindnet par Calico a été vécue comme une manipulation d'installation, sans en retenir le motif. La démonstration Kubernetes de l'après-midi sera alors une déclaration, pas une preuve.
- q4 ratée dans le sens « CVSS pour le code, DREAD pour l'infra » : partage faux mais confortable, et il tiendra devant le jury s'il n'est pas repris ici.
Questions à anticiper
- « Pourquoi un quiz le jour de la soutenance ? » — l'angle est utilitaire : ce sont quatre questions du jury, posées quatre heures plus tôt, quand il reste du temps pour y répondre.
- « Le score compte dans l'évaluation ? » — non. Ce qui compte est ce qu'il en fait d'ici 16 h ; renvoyez-le à la fiche de questions du jalon 4.
Ce qu'il faut exiger — le score seul ne dit rien, la répartition dit tout. Un 3/4 dont l'erreur est q1 ou q4 se rattrape dans la conversation de 11 h. Un 3/4 dont l'erreur est q2 impose de reprendre avec lui la première ligne de son tableau de preuves avant qu'il n'écrive les neuf autres sur le même modèle.
Jalon 1 — La plateforme remonte, les cinq jobs passent au vert
Jour 1 · Auditer, prouver et soutenir · 1 h 30
Obtenir, une fois et pour de bon, un état de départ démontrable : tout tourne, tout est vert, et vous savez ce qui ne l'est pas.
Le cluster kind passe en deuxième position, avant l'image et avant le pipeline. Ce n'est pas un caprice : c'est le composant que vous n'avez plus touché depuis le 13 août, et Docker a redémarré au moins une fois depuis. Si le cluster doit être reconstruit, cela prend huit à dix minutes — supportable à 9 h 40, impossible à 16 h 05.
Règle de coupure : à 10 h 15, ce qui ne remonte pas ne remontera pas. Vous le notez dans journal-incidents.md, vous basculez ce point sur le plan de repli du jalon 4, et vous avancez. Un jalon 1 fini à 11 h avec un composant en moins vaut infiniment mieux qu'un jalon 1 fini à midi.
- Le réseau et les deux cibles.
dso-netexiste depuis le 3 août ; la commande de création échoue si c'est le cas, et c'est le résultat attendu.docker network create dso-net 2>/dev/null || echo 'dso-net : deja la, tres bien' docker start juice-shop devsecops-lab 2>/dev/null docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}' # juice-shop met 30 a 60 s avant de repondre : on l'interroge, on n'attend pas au juge curl -s -o /dev/null -w '%{http_code}\n' http://localhost:3000/ curl -s -o /dev/null -w '%{http_code}\n' http://localhost:5000/ - Le cluster, tout de suite. S'il ne répond pas, ses deux nœuds sont des conteneurs arrêtés : on les redémarre, on réexporte le kubeconfig, et on attend que les nœuds passent
Ready. Calico met environ une minute à se remettre en route.kind get clusters # attendu : dso-lab kubectl get nodes # si la commande ci-dessus echoue ou n'en finit pas : docker start dso-lab-control-plane dso-lab-worker kind export kubeconfig --name dso-lab kubectl wait --for=condition=Ready node --all --timeout=120s kubectl -n dso get pods,netpol kubectl -n kube-system get pods | grep -i calico - Décision à prendre ici, pas plus tard. Si à 10 h 15 le cluster ne répond toujours pas, vous ne le reconstruisez pas : vous écrivez la ligne dans
journal-incidents.md, et les deux démonstrations Kubernetes de cet après-midi — le pod root rejeté par PSA, le flux bloqué par la NetworkPolicy — passeront par les captures du 13 août. Le jury accepte très bien une preuve enregistrée annoncée comme telle ; il n'accepte pas cinq minutes de silence devant un terminal. - L'image durcie. Vous la reconstruisez pour être certain que le
Dockerfiledu dépôt est bien celui qui produit l'image que vous montrerez, puis vous rejouez le gate exactement comme le pipeline le lance.cd ~/devsecops-lab docker build -t devsecops-lab:hardened . docker run --rm devsecops-lab:hardened id # attendu : uid=10001 trivy image --severity HIGH,CRITICAL --exit-code 1 --format json \ --output artefacts/trivy-image-2026-08-21.json devsecops-lab:hardened echo "code de sortie : $?" # attendu : 0 - Le dépôt. Trois vérifications de trente secondes qui valent chacune une question de jury : l'arbre est propre, le dernier commit est signé, et rien de secret n'est suivi par Git.
git status --short # doit ne rien afficher git log --show-signature -1 --oneline # attendu : Good "git" signature git ls-files | grep -E '(^|/)\.env$|\.key$|^artefacts/' # doit ne rien afficher - Le pipeline complet. Vous poussez une branche sans modification de code — un simple horodatage dans le journal suffit — et vous ouvrez la pull request : c'est le seul moyen de voir les cinq jobs s'exécuter dans les conditions de la protection de
main.git checkout -b feat/pfr-verification printf '\n## 2026-08-21 — verification de bout en bout (PFR)\n' >> journal-incidents.md git add journal-incidents.md git commit -m 'chore(pfr): verification de bout en bout du pipeline' git push -u origin feat/pfr-verification # puis, dans le navigateur : ouvrir la PR, onglet Actions, et regarder les cinq jobs. # secrets et sast repondent en 1 a 2 min ; sca en 2 a 3 ; image en 2 ; # dast est le plus lent (4 a 6 min) : c'est lui qui fixe la duree totale du run. - Les cinq jobs doivent être verts :
secrets,sast,sca,dast,image. Si l'un est rouge, triez avant de corriger — les deux cas ne se traitent pas pareil. Une régression réelle (une règle Semgrep qui correspond de nouveau, une CVE HIGH apparue dans une image de base rafraîchie) se corrige, et c'est du travail utile. Une défaillance d'environnement (dépassement de délai sur le téléchargement d'une image, quota de runner, indisponibilité de GitHub) ne se corrige pas : vous relancez une fois, et si cela recommence, vous notez et vous basculez suractà l'étape suivante. - Le repli hors ligne, vérifié maintenant et pas au moment où vous en aurez besoin. Deux jobs seulement ont été validés sous
actle 5 août : ce sont les deux que vous montrerez si le réseau tombe.brew install act # si ce n'est pas deja fait act -j secrets act -j sast # ne tentez pas dast ni image sous act : ils n'ont jamais ete repetes ainsi, # et une soutenance n'est pas le moment de decouvrir comment ils s'y comportent. - Fusionnez la pull request, et vérifiez que
mainporte bien le run vert. Puis notez dansjournal-incidents.mdl'heure de fin du jalon, la durée totale du run, et tout ce qui n'est pas remonté. Cette dernière liste n'est pas un aveu : c'est la matière de la partie 5 de votre rapport et de votre plan de repli.
- Combien de temps a duré le run complet, et quel job en consomme la moitié ?
- Qu'est-ce qui, dans votre plateforme, n'est pas remonté seul après huit jours sans y toucher — et quel geste le remet ?
Quatre-vingt-dix minutes pour six composants : vous avez environ un quart d'heure chacun. Le seul qui mérite qu'on dépasse est le cluster, et encore, jusqu'à 10 h 15 seulement. Tout le reste — image, dépôt, pipeline — se vérifie par des commandes que vous avez déjà lancées des dizaines de fois : si l'une d'elles vous surprend, c'est un constat à noter, pas un chantier à ouvrir.
L'erreur classique de ce créneau est de vouloir un tableau parfaitement vert. Ce n'est pas le but : le but est de savoir, à 11 h précises, ce qui est vert, ce qui est rouge et pourquoi. Un pipeline dont vous expliquez le job rouge se défend très bien ; un pipeline vert dont vous ne savez pas dire ce qu'il vérifie ne se défend pas du tout.
Intention — établir un état de départ opposable et, surtout, provoquer avant midi les pannes qui auraient sinon surgi à 16 h. C'est le seul créneau de la journée où une panne ne coûte rien. L'ordre des étapes encode ce raisonnement : le plus fragile d'abord.
Ce qui coince
- Le cluster kind. C'est la panne la plus probable de la journée, et le réflexe sera
kind delete clustersuivi d'une reconstruction. Coupez court : reconstruire impose de réinstaller Calico, de réappliquer les quatre manifestes et d'attendre que tout se stabilise — huit à dix minutes dans le meilleur des cas, et il n'a pas répété cette séquence.docker startdes deux nœuds puiskind export kubeconfigrésout la grande majorité des cas en deux minutes. - La règle de coupure de 10 h 15, ignorée. C'est le point où votre intervention à distance est justifiée, même si vous intervenez peu : envoyez un message à 10 h 15 s'il n'a pas signalé la fin du cluster. Sans ce rappel, il y passera la matinée — c'est le scénario d'échec le plus fréquent d'un PFR d'infrastructure.
- Le triage du job rouge. Il corrigera sans distinguer régression réelle et défaillance d'environnement, et perdra vingt minutes sur un dépassement de délai réseau. Le signe : il modifie
ci.ymlalors que le message d'erreur parle de connexion. actrepoussé « si j'ai le temps ». Le repli n'existe que s'il a été essayé une fois dans la journée : la version d'act, l'image de runner qu'elle télécharge et le socket Docker sont trois choses qui se découvrent mal en urgence.
Questions à anticiper
- « Le job
dastprend six minutes, je peux le désactiver pour la démonstration ? » — non, mais la vraie réponse est ailleurs : il n'attend pas la fin du run, il montresastqui rougit en quatre-vingt-dix secondes. C'est ce qu'enseigne le déroulé de l'après-midi ; s'il pose la question dès le matin, renvoyez-l'y. - « Trivy me sort une CVE HIGH nouvelle sur
python:3.12-slim. » — cela arrive et c'est même une excellente nouvelle : l'image de base a été rafraîchie depuis le 11 août. Deux issues acceptables, épingler un digest ou documenter l'exception dans le rapport ; jamais lever le seuil du gate pour faire passer le build. - «
git log --show-signatureme dit No signature sur un vieux commit. » — normal, la signature n'a été activée que le 4 août. Seul le dernier commit compte pour le critère.
Ce qu'il faut exiger — à 11 h, pas « tout est vert », mais trois choses montrées : la sortie de docker run --rm devsecops-lab:hardened id avec son uid=10001, la durée totale du run avec le nom du job qui en consomme la moitié, et la liste écrite de ce qui n'est pas remonté seul. Le premier sépare « image durcie » de « image durcie et vérifiée aujourd'hui ». Le troisième est ce qui fera la différence entre un plan de repli réel et un plan de repli déclaré.
Jalon 2 — Rejouer les dix preuves de fermeture
Jour 1 · Auditer, prouver et soutenir · 1 h 15
Démontrer, exploit par exploit et sur le HEAD d'aujourd'hui, que chacune des dix vulnérabilités est effectivement close.
Un finding sans preuve rejouable et sans remédiation vérifiable n'est pas un finding, c'est une opinion. Vous appliquez ce format depuis le 7 août ; aujourd'hui vous l'appliquez à votre propre code.
Concrètement : pour chaque VULN-NN, vous relancez exactement la commande d'exploitation qui fonctionnait, et vous notez ce qu'elle renvoie aujourd'hui. Une sortie d'outil qui ne signale plus rien n'est pas une preuve de fermeture — c'est une preuve que l'outil ne signale plus rien, ce qui n'est pas la même chose et le jury fera la différence.
Toutes les commandes visent localhost:5000, votre appli, sur votre poste.
- Ouvrez le tableau de preuves. C'est l'ossature de la partie 3 de votre rapport : ne le recopiez pas plus tard, écrivez-le directement dans
rapports/audit-devsecops-lab.md.| VULN | Faille | Exploit rejoue le 21/08 | Resultat | Statut | Ferme en | |------|------------------|------------------------------|----------|--------|----------| | 01 | Injection SQL | | | | M1 J3 | | 02 | XSS reflechi | | | | M2 | | 03 | Injection cmd | | | | M2 | | 04 | IDOR | | | | M5 | | 05 | Secret en dur | | | | M1 J2 | | 06 | Hachage md5 | | | | M2 | | 07 | Deserialisation | | | | M2 | | 08 | SSRF | | | | M5 | | 09 | debug=True | | | | M3 | | 10 | Dependances CVE | | | | M2 | - Les quatre injections. Ce sont les rejeux les plus parlants et les plus rapides : la même charge qu'à l'aller, et un comportement différent.
# VULN-01 — injection SQL : attendu 401, et non plus "bienvenue" curl -s -o /dev/null -w '%{http_code}\n' -X POST http://localhost:5000/login \ --data "user=admin'--&pwd=x" # VULN-02 — XSS reflechi : la balise doit ressortir echappee (<script>) curl -s 'http://localhost:5000/search?q=<script>alert(1)</script>' # VULN-03 — injection de commande : aucun 'uid=' ne doit apparaitre curl -s 'http://localhost:5000/ping?host=127.0.0.1;id' # VULN-07 — deserialisation : la charge yaml ne doit plus s'executer curl -s -X POST http://localhost:5000/config \ --data-binary '!!python/object/apply:os.system ["id"]' - Les trois failles de logique et de cryptographie. Notez la longueur de la sortie de
/hash: trente-deux caractères, c'est encore du md5 ; soixante-quatre, c'est bien du sha256.# VULN-04 — IDOR : un identifiant qui ne vous appartient pas doit etre refuse curl -s -o /dev/null -w '%{http_code}\n' http://localhost:5000/profile/2 # VULN-06 — hachage : compter les caracteres, c'est la preuve la plus courte curl -s 'http://localhost:5000/hash?p=test' | wc -c # VULN-08 — SSRF : l'adresse de metadonnees doit etre refusee par la liste blanche curl -s -o /dev/null -w '%{http_code}\n' \ 'http://localhost:5000/fetch?url=http://169.254.169.254/latest/meta-data/' - Les trois failles de configuration et de chaîne d'approvisionnement. Elles ne se prouvent pas par un
curlsur une route, mais par l'état de l'image et du dépôt.# VULN-09 — debug=True et execution en root : deux preuves distinctes docker run --rm devsecops-lab:hardened id # attendu : uid=10001 # le mode debug s'annonce au demarrage dans les journaux, jamais dans une page 404 : # c'est la que Flask ecrit "Debug mode: on" et le code PIN du debogueur. docker logs devsecops-lab 2>&1 | grep -ciE 'debug mode: on|debugger is active' # attendu : 0 # VULN-10 — dependances : plus aucune HIGH ni CRITICAL dans l'arbre trivy fs --scanners vuln --severity HIGH,CRITICAL --exit-code 1 . echo "code de sortie : $?" # attendu : 0 # VULN-05 — secret : l'arbre de travail est propre docker run --rm -v "$PWD:/repo" zricethezav/gitleaks:v8.18.4 \ detect --source=/repo --no-git -v - Et maintenant la question que le jury posera. La commande ci-dessus porte
--no-git: elle n'inspecte que l'arbre de travail. Or votre secret a existé dans un commit. Relancez Gitleaks sans cette option, et regardez l'historique.docker run --rm -v "$PWD:/repo" zricethezav/gitleaks:v8.18.4 \ detect --source=/repo -v git log --oneline -S 's3cr3t-dev-key' --all git log --oneline -S 'AKIAIOSFODNN7EXAMPLE' --all - Vous venez de trouver un défaut dans votre propre pipeline, et c'est le meilleur moment de la journée. Le secret est retiré du code, mais il reste dans l'historique, et votre job
secretsne peut pas le voir puisqu'il est configuré avec--no-git. Ne corrigez rien : réécrire l'historique impose ungit filter-repoet une poussée forcée sur une branche protégée, ce qui n'est ni répété ni raisonnable à quatre heures de la soutenance. Écrivez-le comme un finding ouvert, avec sa remédiation en deux volets : rotation du secret d'abord — ici sans objet, la clé AWS est un exemple public de la documentation d'Amazon — et purge de l'historique ensuite, planifiée. C'est exactement ce qu'un auditeur écrit dans la vraie vie. - Complétez la colonne « Statut » avec trois valeurs seulement : Fermé (l'exploit rejoué échoue), Ouvert (il fonctionne encore, ou la correction est incomplète comme pour l'historique Git), Accepté (le risque est connu et assumé, avec sa raison écrite). Une case vide ou un statut inventé sont les deux seules fautes qui peuvent faire basculer un jury, parce qu'elles ne portent pas sur la technique.
- Reportez chaque sortie brute dans
artefacts/preuves-2026-08-21.txt— la commande et ce qu'elle a répondu chez vous. Le tableau du rapport renvoie à ce fichier ; c'est ce qui permet à un tiers de tout rejouer sans vous.
- Sur les dix lignes, combien de statuts « Fermé » reposent sur un rejeu d'exploit, et combien sur une sortie d'outil silencieuse ?
- Le finding de l'historique Git : quelle est sa sévérité réelle, sachant que le dépôt est privé et que la clé est un exemple public ?
Soixante-quinze minutes pour dix lignes, soit sept minutes chacune : c'est large si vous rejouez, très court si vous vous mettez à corriger. Dès qu'un rejeu ne donne pas le résultat attendu, votre réflexe doit être d'écrire « Ouvert » et de passer à la suivante. Vous reviendrez sur les cas ouverts à la fin s'il reste du temps — et s'il n'en reste pas, un finding ouvert honnêtement documenté vaut mieux qu'une ligne vide.
Le passage sur l'historique Git est le plus important du jalon, et c'est aussi le plus tentant à corriger. Résistez : la valeur de ce constat est qu'il montre que vous savez auditer votre propre dispositif, y compris là où il vous arrange de ne pas regarder. C'est très exactement ce qui distingue un ingénieur qui applique une chaîne d'outils d'un ingénieur qui la comprend.
Intention — produire la matière du rapport et celle de la démonstration en un seul geste, et faire vivre la différence entre « l'outil ne dit plus rien » et « l'exploit ne marche plus ». L'étape sur --no-git est le sommet pédagogique de la journée : elle transforme un exercice de vérification en un vrai travail d'audit, où l'on trouve un défaut dans son propre dispositif de contrôle.
Ce qui coince
- La tentation de corriger. Elle est presque irrésistible sur l'historique Git, et c'est le pire moment possible :
filter-repoplus poussée forcée surmainprotégée, à quatre heures de la soutenance, sur un dépôt dont dépend toute la démonstration. Si vous ne deviez intervenir qu'une fois dans la journée, c'est ici. - Les preuves par sortie d'outil. Il écrira « Semgrep ne remonte plus VULN-03 » au lieu de rejouer le
curl. Signe repérable en dix secondes : la colonne « Exploit rejoué » contient des noms d'outils au lieu de commandes. C'est la question q2 du quiz du matin, et c'est pour cela qu'elle y était. - VULN-04 et VULN-08, fermées le 19 août et donc les plus fraîches — mais aussi les deux dont la correction est la plus susceptible d'être partielle. Un IDOR « corrigé » par une vérification côté client, ou une SSRF filtrée par une liste noire plutôt qu'une liste blanche, se rouvrent en une question de jury. Faites-lui montrer le code, pas seulement le code de retour.
- Le statut « Accepté » employé comme synonyme de « pas eu le temps ». Un risque accepté porte une raison écrite et un responsable ; sans cela, c'est un risque ouvert déguisé, et le jury le retourne immédiatement.
Questions à anticiper
- « Le secret dans l'historique, c'est grave ? » — ne tranchez pas à sa place. Faites-lui énumérer les facteurs : dépôt privé, clé qui est un exemple public de la documentation AWS, mais aussi un dépôt privé qui peut devenir public d'un clic. La réponse attendue n'est pas un score, c'est un raisonnement — et c'est la deuxième question de réflexion.
- « Je change
--no-gitdansci.yml? » — c'est une modification d'une ligne, tentante, et elle rendrait le job rouge sur-le-champ à cause de l'historique. Donc non aujourd'hui : cela va dans la feuille de route de la partie 5, après la purge, dans cet ordre. - « sha256 au lieu de md5, VULN-06 est donc réglée ? » — la question mérite mieux qu'un oui. Le finding CWE-327 est effectivement fermé : l'algorithme cassé a disparu. Mais un hachage rapide reste un mauvais choix pour un mot de passe, quel qu'il soit — il faut une fonction lente et salée, bcrypt ou argon2. Faites-lui écrire cette nuance comme une ligne de la feuille de route plutôt que comme une correction : c'est une question de jury très probable, et savoir qu'un finding fermé peut laisser une faiblesse derrière lui est exactement ce qu'on attend d'un auditeur.
Ce qu'il faut exiger — à 12 h 15, dix lignes remplies dont aucune vide, et au moins un statut qui ne soit pas « Fermé ». Un tableau intégralement fermé après quinze jours de travail est statistiquement improbable et, s'il vous en présente un, l'unique question à poser est celle de l'historique Git : soit il l'a trouvé et l'a classé, soit il a coché sans regarder. Vérification en une minute : choisissez vous-même une ligne et faites rejouer l'exploit devant vous.
Le rapport d'audit — ce que le rapport de pentest ne dit pas
Jour 1 · Auditer, prouver et soutenir · 20 min
Vous avez rendu hier rapports/pentest-juice-shop.md. Vous allez écrire cet
après-midi rapports/audit-devsecops-lab.md. Même plan en six parties, même barème
CVSS, même gabarit de finding — et pourtant deux documents qui ne répondent pas à la même
question.
| Rapport de pentest (20 août) | Rapport d'audit (aujourd'hui) | |
|---|---|---|
| Cible | Juice Shop, dont vous n'avez pas le code | devsecops-lab, dont vous avez tout |
| Point de vue | Boîte noire, celui de l'attaquant | Boîte blanche, celui du propriétaire |
| Question posée | Que puis-je casser depuis l'extérieur ? | Ce code et sa chaîne de production sont-ils sains ? |
| Identifiants | F-01 … F-10 | VULN-01 … VULN-10, plus les findings du jour |
| Ce qu'on y trouve en plus | — | Les contrôles : ce qui empêche la faille de revenir |
| Preuve attendue | L'exploit qui fonctionne | L'exploit qui ne fonctionne plus, et le garde-fou qui le maintient ainsi |
Un pentest constate. Un audit constate et se prononce sur le dispositif. Pour chacune de vos dix lignes, la question qui compte n'est pas « est-ce corrigé ? » mais « qu'est-ce qui m'avertira si cela revient ? ». Pour VULN-01, la réponse est le job sast avec son option --error. Pour VULN-10, c'est le job sca. Pour l'exécution en root, c'est le job image et son --exit-code 1.
Et là où il n'y a pas de contrôle — VULN-04, l'IDOR, qu'aucun de vos cinq jobs ne détecterait s'il revenait — dites-le. C'est le constat le plus précieux du rapport.
Les six parties, et ce que vous y mettez déjà
Le rapport n'est pas une rédaction, c'est un assemblage : quatre des six parties existent déjà, écrites entre le 14 et ce matin.
| Partie | Contenu | Vous l'avez déjà |
|---|---|---|
| 1. Résumé exécutif | Une page sans jargon, pour un décideur. Combien de failles, combien de fermées, ce qui reste et ce que cela coûte | à écrire — en dernier |
| 2. Périmètre et méthodologie | La cible, les versions, les dates, les outils, ce qui est hors périmètre | à écrire — quinze minutes |
| 3. Synthèse des findings | Le tableau du jalon 2, avec sévérité et statut | fait ce matin |
| 4. Findings détaillés | Un bloc par vulnérabilité, au gabarit : sévérité, vecteur CVSS complet, composant, description, impact, preuve rejouable, remédiation | les vecteurs CVSS viennent du registre du 17 août |
| 5. Feuille de route | Les findings ouverts, par sévérité puis par effort | l'historique Git en est la première ligne |
| 6. Annexes | Commandes rejouables, sorties d'outils, renvois CWE et OWASP | artefacts/preuves-2026-08-21.txt et le modèle de menaces du 14 août |
L'affirmation non mesurée. « Le pipeline détecte toute injection » alors que vous avez vérifié trois règles Semgrep sur une application de cent trente lignes. Écrivez plutôt ce que vous avez constaté, et sous quelle hypothèse cela s'étend.
Le zéro absolu. « Aucune vulnérabilité résiduelle. » Un auditeur qui ne trouve rien n'a pas fini de chercher, et un jury le sait. Vous avez au moins un finding ouvert depuis 11 h 40 — celui-là fait plus pour votre crédibilité que les neuf fermés.
Intention — empêcher que le rapport d'audit soit un rapport de pentest avec un autre nom de cible. La différence tient en un mot, contrôle : un audit se prononce sur le dispositif qui empêche le retour de la faille, pas seulement sur la faille. Placée après le jalon 2 parce qu'à cet instant quatre parties sur six sont déjà écrites — c'est ce qui rend l'exercice faisable en soixante-quinze minutes.
Ce qui coince
- L'ordre de rédaction. Il commencera par la partie 1 et y passera trente minutes. Le résumé exécutif s'écrit en dernier, quand on sait ce qu'on résume : c'est écrit dans le tableau, il faudra probablement le redire à 14 h.
- La colonne « contrôle » traitée comme un ornement. C'est pourtant le seul apport propre de l'audit, et la question de jury la plus prévisible sur VULN-04 : quel job l'aurait vue ? Aucun. S'il ne l'a pas écrit, la réponse s'improvisera mal.
- Le copier-coller du rapport d'hier, structure comprise. Le format est effectivement le même — c'est voulu — mais un rapport d'audit qui n'emploie jamais le mot « contrôle » n'en est pas un.
- La partie 5 confondue avec des excuses. Une feuille de route ordonne par sévérité puis par effort et donne un geste concret par ligne. Sans effort estimé, ce n'est pas une feuille de route, c'est une liste de regrets.
Questions à anticiper
- « Combien de pages ? » — cinq à sept. La question cache presque toujours « je n'ai pas assez de matière », ce qui est faux : montrez-lui la troisième colonne du tableau des parties plutôt que de répondre au chiffre.
- « Je remets les vecteurs CVSS complets ou juste les scores ? » — complets, c'est la règle du format depuis le 7 août. Un score sans vecteur ne se rejoue pas.
- « Je mets du code dans le rapport ? » — les commandes de preuve, oui ; le code source corrigé, non. La formule qui reste en tête : le dépôt dit comment, le rapport dit pourquoi.
Ce qu'il faut exiger — leçon, donc rien à valider dans l'instant. Le signe à guetter dans l'heure qui suit : si son rapport ne comporte aucune ligne de contrôle et aucun finding ouvert, ce n'est pas un défaut de rédaction, c'est qu'il rend compte de son travail au lieu d'auditer son système. Cela ressortira intact à la première question de justification, et il sera trop tard pour le reprendre.
Jalon 3 — Rédiger audit-devsecops-lab.md
Jour 1 · Auditer, prouver et soutenir · 1 h 15
Assembler en un document livrable ce qui existe déjà en morceaux, et le rendre rejouable par un tiers.
Ouvrez côte à côte les quatre sources : le tableau de preuves de ce matin, rapports/threat-model.md du 14 août, rapports/risk-register.csv du 17 août, et artefacts/preuves-2026-08-21.txt. Presque tout ce que vous allez écrire est déjà dans l'un des quatre.
Heure de bascule : 14 h 35. À cette heure-là, quel que soit l'état du texte, vous écrivez le résumé exécutif et vous fermez le document. Un rapport à quatre-vingts pour cent se lit très bien ; une démonstration non répétée se voit tout de suite.
- Créez le document et posez ses six titres de partie avant d'écrire une phrase. Vous remplissez ensuite dans l'ordre 3, 4, 5, 6, 2, et 1 en dernier.
- Partie 3 — synthèse. Collez le tableau du jalon 2 et ajoutez-lui deux colonnes : la sévérité en bande CVSS, et le contrôle qui détecterait le retour de la faille. Pour les lignes sans contrôle, écrivez « aucun » — c'est un résultat d'audit, pas une lacune de rédaction.
- Partie 4 — findings détaillés. Un bloc par vulnérabilité, au gabarit que vous appliquez depuis le 7 août. Voici le premier, entièrement rempli : les neuf autres suivent le même moule.
### VULN-01 — Injection SQL sur le formulaire d'authentification - Severite : Critical — CVSS 9.8 (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) - Composant : POST /login, parametre `user` - References : CWE-89, OWASP A03:2021 — Injection - Statut : FERME le 2026-08-05 (commit fix(VULN-01), branche fix/vuln-01-sqli) - Controle anti-regression : job `sast` (Semgrep 1.85.0, option --error) Description La requete etait construite par concatenation de chaines ; une entree contenant une apostrophe modifiait la structure de la requete. Preuve de fermeture (rejouee le 2026-08-21) $ curl -s -o /dev/null -w '%{http_code}\n' -X POST http://localhost:5000/login \ --data "user=admin'--&pwd=x" 401 (avant correction : 200 et le corps "bienvenue") Remediation appliquee Requete parametree : db().execute( "SELECT * FROM users WHERE user=? AND pwd=?", (user, pwd)) Verifie par rejeu ci-dessus. Toute reintroduction fait echouer le job sast. - Partie 5 — feuille de route. Vos findings ouverts, ordonnés par sévérité puis par effort, avec un geste concret et une estimation par ligne. La première est le secret présent dans l'historique Git : rotation, puis purge par
git filter-repo, puis retrait de l'option--no-gitdu jobsecrets— dans cet ordre, l'inverse rendrait le pipeline rouge en permanence. - Partie 6 — annexes. Un renvoi vers
artefacts/preuves-2026-08-21.txt, la liste des versions d'outils épinglées, et le renvoi vers le modèle de menaces du 14 août. Ne recopiez pas les sorties brutes dans le corps du rapport. - Partie 2 — périmètre et méthodologie. Quinze minutes, et soyez précis sur ce qui est hors périmètre : Juice Shop n'est pas auditée ici, seulement attaquée dans le rapport d'hier ; le cluster kind n'est pas un environnement de production et ses écarts CIS sont attendus ; aucun test n'a visé autre chose que
localhost. - Partie 1 — résumé exécutif, en dernier et en une page. Sans jargon : combien de failles au départ, combien de fermées et prouvées, combien d'ouvertes, ce que la chaîne de production empêche désormais, et les deux ou trois actions qui restent. Un lecteur non technique doit pouvoir décider après cette page seule.
- Relisez en traquant une seule chose : toute affirmation que vous ne pouvez pas prouver. Puis committez, et vérifiez une dernière fois que rien de secret n'est suivi.
git add rapports/audit-devsecops-lab.md git commit -m 'docs(pfr): rapport audit devsecops-lab, dix findings prouves' git ls-files | grep -E '(^|/)\.env$|\.key$|^artefacts/' # doit ne rien afficher git push
- Combien de vos dix lignes ont un contrôle anti-régression, et combien n'en ont aucun ?
- Si un collègue reprenait ce dépôt lundi sans vous, que lui manquerait-il pour rejouer vos dix preuves ?
La partie qui prend le plus de temps est la 4, parce qu'elle compte dix blocs. Chronométrez le premier : s'il vous prend plus de six minutes, les neuf suivants ne tiendront pas dans le créneau. La parade n'est pas d'écrire plus vite, c'est de raccourcir la description — le gabarit est utile parce qu'il est court, et l'essentiel est dans les deux lignes « preuve de fermeture » et « contrôle anti-régression ».
Écrivez « aucun » là où aucun contrôle n'existe, et résistez à l'envie d'écrire une phrase rassurante à la place. C'est la ligne que le jury lira en premier, et c'est celle qui montre que vous avez audité votre dispositif plutôt que raconté votre quinzaine.
Intention — obtenir un livrable qu'un tiers peut rejouer, et faire pratiquer l'ordre de rédaction inverse : synthèse d'abord, résumé exécutif en dernier. C'est aussi le créneau où se révèle la qualité réelle du jalon 2 — un tableau de preuves bâclé le matin rend la partie 4 impossible à remplir.
Ce qui coince
- L'heure de bascule de 14 h 35, franchie sans y penser. C'est le seul endroit de la journée où une intervention d'autorité de votre part est justifiée : coupez, et faites lancer la première répétition. Un rapport parfait et une démonstration jamais répétée est le pire couple possible sur cette grille.
- Les dix blocs de la partie 4 écrits à longueur décroissante : trois pages pour VULN-01, deux lignes pour VULN-10. Signe que le gabarit n'est pas tenu ; le remède est de chronométrer le premier bloc.
- Les vecteurs CVSS recopiés du registre du 17 août sans vérification. Deux d'entre eux ont pu changer de contexte depuis — notamment VULN-09, dont l'exposition n'est plus la même une fois l'image durcie. Demandez-lui d'en justifier un au hasard.
- La partie 2 expédiée en trois lignes. C'est pourtant celle qui protège l'auteur : sans périmètre écrit, toute question du type « et sur un vrai cluster ? » devient un reproche au lieu d'un hors-sujet assumé.
Questions à anticiper
- « Je remets les dix blocs alors que neuf sont fermés ? » — oui. Un audit documente ce qui est fermé autant que ce qui est ouvert, sinon rien ne prouve que la fermeture a été vérifiée à cette date.
- « Le contrôle pour VULN-04, je mets quoi ? » — ne lui donnez pas « aucun » : faites-lui passer en revue ses cinq jobs et conclure lui-même. Le raisonnement vaut plus que le mot, et c'est celui qu'il redira au jury.
- « Je peux réutiliser le résumé exécutif d'hier ? » — non, les deux documents n'ont pas le même lecteur ni le même verdict. Le fond de la question est souvent le temps : renvoyez-le à l'heure de bascule.
Ce qu'il faut exiger — à 14 h 50, un fichier commité et poussé, avec ses six parties présentes, même inégales. Deux vérifications de trente secondes chacune : la partie 3 comporte une colonne « contrôle » avec au moins un « aucun », et la partie 5 porte la ligne de l'historique Git avec ses trois gestes dans le bon ordre. Si la purge y précède le retrait de --no-git, il a écrit la séquence sans la penser — et c'est une question de jury toute trouvée.
Tenir vingt minutes devant un jury
Jour 1 · Auditer, prouver et soutenir · 15 min
Vingt minutes, en visioconférence, écran partagé. Le jury évalue autant votre plateforme que votre capacité à l'expliquer — c'est exactement ce qu'on attendra de vous en poste, lors d'une revue de sécurité.
Le déroulé qui fonctionne
Il est construit autour d'une idée : lancer la régression tôt et parler pendant qu'elle tourne. Un run complet prend six à huit minutes ; attendre en silence devant l'onglet Actions serait la pire minute de votre soutenance.
0-2 min le contexte : une appli Flask de 130 lignes, dix failles deliberees,
et la question posee — qu'est-ce qui empeche qu'elles reviennent ?
2-4 min la chaine : poste -> depot signe -> 5 jobs -> image durcie -> cluster
4-6 min JE POUSSE LA REGRESSION
git push origin demo/regression (VULN-01 reintroduite en une ligne)
j'ouvre la PR, JE LAISSE TOURNER, et je continue de parler
6-11 min DEMONSTRATION en direct
. curl de l'exploit VULN-01 sur localhost:5000 -> 401
. docker run --rm devsecops-lab:hardened id -> uid=10001
. kubectl apply d'un pod root -> rejete a l'admission
. kubectl exec + curl entre deux pods -> bloque
11-13 min JE REVIENS SUR L'ONGLET ACTIONS
. le job sast est ROUGE, la PR est bloquee par la protection de main
13-16 min trois choix expliques : le seuil de severite du gate, --no-git, Calico
16-18 min les limites : ce qui reste ouvert dans le rapport d'audit
18-20 min questionsVous n'attendez pas la fin du run. sast répond en quatre-vingt-dix secondes environ, et dès qu'il est rouge la fusion est bloquée par la protection de branche : la démonstration est faite. Les quatre autres jobs peuvent continuer de tourner à l'écran pendant que vous expliquez vos choix — cela donne même un fond visuel utile.
Trois règles
- Montrez, ne racontez pas. Sept minutes de manipulation en direct valent mieux que quinze de diapositives. Cinq diapositives au maximum.
- Assumez les manques. « Je ne l'ai pas testé » est une réponse recevable, surtout suivie de « voici comment je m'y prendrais ». Inventer ne l'est pas, et un jury technique le repère en une question de relance.
- Justifiez, ne décrivez pas. « J'ai mis
--severity HIGH,CRITICAL» n'apprend rien. « J'ai placé le seuil à HIGH parce qu'un gate qui échoue sur les MEDIUM aurait bloqué le build trois fois cette semaine sans qu'aucune ne soit exploitable ici » montre un ingénieur.
Le jury est à distance. Une police de terminal à 12 points est illisible à travers une compression vidéo : montez-la à 16 points au moins. Partagez une fenêtre, jamais l'écran entier — vos notifications ne regardent personne. Fermez tout ce qui n'entre pas dans le déroulé, et préparez les onglets du navigateur dans l'ordre où vous les montrerez.
Les questions à préparer
| Question probable | Ce qu'elle vérifie |
|---|---|
| Pourquoi le seuil du gate est-il à HIGH et pas à MEDIUM ? | Que le réglage est un arbitrage, pas un défaut recopié |
| Qu'est-ce qui vous avertirait si l'IDOR revenait ? | Que vous savez où votre dispositif ne voit rien |
Votre job secrets voit-il l'historique du dépôt ? | Que vous avez audité votre propre pipeline |
| Pourquoi Calico plutôt que le réseau par défaut de kind ? | Que la NetworkPolicy bloque vraiment, et que vous savez pourquoi |
| Ce pipeline tiendrait-il sur un dépôt de cent mille lignes ? | Que vous distinguez le mesuré de l'extrapolé |
| Un développeur contourne le pre-commit. Que se passe-t-il ? | Que vous savez qu'un hook local n'est pas un contrôle |
| Qu'est-ce que vous feriez différemment ? | Votre recul — c'est souvent la meilleure question |
« Qu'est-ce que vous feriez différemment ? » revient presque toujours. Préparez-la sérieusement : une réponse honnête et précise sur ce que vous avez appris en vous trompant vaut mieux que n'importe quelle démonstration réussie. Vous avez de la matière — quinze jours de journal-incidents.md.
Le parcours S4 s'achève. Le dépôt, le rapport de pentest et le rapport d'audit vous appartiennent : c'est le dossier sur lequel vous vous appuierez à votre prise de poste, et la matière avec laquelle vous outillerez les projets de Caplogy.
Intention — donner un déroulé qui absorbe la latence du pipeline, et convertir la liste des sept questions en travail de préparation plutôt qu'en trac. Quinze minutes juste avant le créneau de répétition : c'est un briefing, pas un cours.
Ce qui coince
- La démonstration qui attend au lieu de provoquer. C'est le défaut structurel des soutenances DevSecOps : le candidat pousse sa régression et se tait pendant six minutes. Le déroulé résout le problème, encore faut-il qu'il l'ait répété dans cet ordre — vérifiez-le au jalon 4, pas en soutenance.
- Le partage d'écran, découvert le jour même. Police minuscule, écran entier, notifications personnelles à l'écran. Dix minutes de préparation matérielle au jalon 4 évitent trois incidents.
- La question sur le pre-commit. Il répondra que le hook bloque le commit ; la réponse attendue est qu'un hook local se contourne avec
--no-verify, et que c'est précisément pour cela que les mêmes outils tournent aussi en CI, où ils ne se contournent pas. Cette question sépare « j'ai installé pre-commit » de « je comprends où vit un contrôle ». - Les réponses apprises par cœur. Signe en soutenance : la réponse est plus longue que la question et n'en traite pas le dernier tiers. Repérable dès la répétition — interrompez-le une fois pour le lui montrer.
Questions à anticiper
- « Et si le run n'est pas fini à la douzième minute ? » — le job
sastl'est, et c'est celui qui bloque la fusion. Faites-lui dire cette phrase à voix haute, elle lui servira telle quelle. - « J'ai le droit de dire que je ne sais pas ? » — oui, avec la suite : comment il s'y prendrait. C'est ce que la deuxième règle appelle assumer les manques.
- « Vous allez m'interrompre pendant la démonstration ? » — donnez le format : les questions viennent après, sauf s'il passe trop vite sur un point qui compte.
Ce qu'il faut exiger — leçon, rien à valider. En tant que jury, préparez deux questions dont vous connaissez déjà la réponse par son rapport : elles testent la cohérence entre ce qu'il a écrit à 14 h et ce qu'il affirme à 16 h 20. Et s'il décrit au lieu de justifier, ce n'est pas un défaut d'expression : c'est qu'il a repris un réglage d'un module sans se l'approprier, et la colonne « contrôle » de son rapport le confirmera en trente secondes.
Jalon 4 — Répétition chronométrée et plan de repli
Jour 1 · Auditer, prouver et soutenir · 55 min
Transformer une plateforme qui marche en une démonstration de vingt minutes qui tient, quoi qu'il arrive.
C'est la seconde qui manque presque toujours, et c'est elle qui porte trois critères ●●● de la grille : ils ne se constatent qu'en direct.
Cinquante-cinq minutes, découpées ainsi : dix minutes pour préparer la branche de régression et le poste, vingt minutes pour deux répétitions chronométrées, quinze minutes pour le plan de repli, dix minutes pour la fiche de questions.
- Préparez la branche de régression, sans la pousser. Une seule ligne change : la requête paramétrée redevient une concaténation. Vous la poussez à la sixième minute de la soutenance, pas maintenant.
cd ~/devsecops-lab git checkout main && git pull git checkout -b demo/regression # modifier la seule ligne de /login dans app.py : # q = "SELECT * FROM users WHERE user='%s' AND pwd='%s'" % (user, pwd) # row = db().execute(q).fetchone() git commit -am 'demo: reintroduction volontaire de VULN-01 (ne pas fusionner)' # PAS de push maintenant. La commande a taper en direct sera simplement : # git push -u origin demo/regression # le hook pre-commit va refuser ce commit : c'est normal et c'est meme un bon # moment de demonstration. Pour le preparer, passez-le en le disant au jury : # git commit -am '...' --no-verify - Préparez le poste. Police du terminal à 16 points minimum, une seule fenêtre partagée et non l'écran entier, notifications coupées, onglets du navigateur ouverts dans l'ordre du déroulé : la pull request, l'onglet Actions, l'onglet Security. Fermez tout le reste.
- Première répétition, chronomètre en main, en entier. Suivez le déroulé de la leçon sans sauter d'étape et sans vous arrêter pour corriger : vous notez, vous continuez. Relevez la durée de chaque segment, pas seulement le total — c'est le relevé par segment qui vous dira quoi couper.
- Regardez votre relevé. Si vous êtes au-delà de vingt minutes, décidez maintenant ce que vous coupez, et coupez dans la démonstration, jamais dans le segment 13-16 min. Ce segment est celui où vous justifiez vos choix : c'est un critère à trois points, il ne se sacrifie pas pour une manipulation qui en rapporte deux.
- Deuxième répétition, avec la coupe décidée. Celle-ci doit tenir. Si elle ne tient toujours pas, coupez la démonstration Kubernetes — c'est la plus longue et la plus fragile, et son contenu se raconte très bien avec une capture.
- Le plan de repli, maintenant et pas quand vous en aurez besoin. Trois pannes possibles, trois réponses écrites, aucune improvisation. Collez ces commandes dans un fichier
repli.mdque vous garderez ouvert dans un onglet.# 1. LE CLUSTER kind NE REPOND PAS (le plus frequent apres un redemarrage de Docker) kubectl get nodes # "connection refused", ou une attente qui ne finit pas docker start dso-lab-control-plane dso-lab-worker kind export kubeconfig --name dso-lab kubectl wait --for=condition=Ready node --all --timeout=120s # toujours mort au bout de 5 minutes -> on bascule sur la capture. On ne reconstruit PAS # un cluster en direct : kind create + Calico + manifestes, c'est 8 a 10 minutes. # 2. RESEAU COUPE OU GITHUB ACTIONS INDISPONIBLE act -j secrets # les deux jobs valides hors ligne des le 5 aout act -j sast # ne pas tenter dast ni image sous act pendant la soutenance : jamais repetes ainsi. # 3. UNE CIBLE NE REMONTE PAS docker ps -a --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}' docker start juice-shop devsecops-lab lsof -iTCP -sTCP:LISTEN -P -n | grep -E ':(3000|5000)' # le port est-il pris par autre chose ? # juice-shop met 30 a 60 s avant de repondre : on la demarre a 15 h 55, pas a 16 h 10. - Constituez le repli visuel : une capture d'écran de chaque étape du déroulé, rangée dans
artefacts/repli/et numérotée dans l'ordre. Cela prend dix minutes et cela vaut la démonstration entière. La règle en direct : annoncez la bascule au jury — « cette partie ne remonte pas, je vous montre la capture d'hier » — puis continuez. Le dire est professionnel ; rester bloqué trois minutes sur un terminal ne l'est pas, et cela se voit encore plus en visioconférence. - Écrivez enfin votre fiche de questions : les sept de la leçon, plus celles du quiz de ce matin que vous aviez manquées. Une réponse écrite en trois lignes chacune, pas un intitulé recopié. Vous ne la lirez pas pendant la soutenance ; l'avoir écrite suffit.
- Votre démonstration tient-elle en vingt minutes, chronomètre en main, coupe comprise ?
- Si le cluster ne répond plus à 16 h 05, quelle est votre première phrase au jury, et votre première commande ?
Une répétition mentale ne compte pas. Une répétition qui saute la partie « qui marche déjà » ne compte pas non plus : c'est justement là que se cachent les quatre-vingt-dix secondes imprévues — le temps que Juice Shop réponde, le temps que le navigateur vous redemande votre mot de passe GitHub, le temps de retrouver le bon onglet. Le chiffre typique est un écart de trois à cinq minutes entre le déroulé estimé et le premier chronométrage réel.
Et gardez le plan de repli pour ce qu'il est : une assurance, pas une prédiction. Il prend quinze minutes à constituer et il ne servira probablement pas. Les fois où il sert, il sauve la soutenance entière.
Intention — obtenir un chronométrage réel et un plan de repli constitué avant d'en avoir besoin. Le créneau est volontairement court : l'arbitrage de ce qu'on coupe fait partie de l'exercice, et c'est même le seul moment où il pratique la compétence qu'on lui demandera le plus souvent en poste.
Ce qui coince
- La répétition mentale. Il annoncera vingt minutes sans avoir chronométré ; en réel, vingt-quatre. Demandez le relevé par segment, jamais le total : le total se devine, le relevé par segment ne s'invente pas.
- Le hook pre-commit qui refuse le commit de régression. Il va le découvrir et croire sa préparation cassée. C'est au contraire une excellente nouvelle et un moment de démonstration à part entière :
--no-verifypasse outre, et c'est justement l'illustration de pourquoi les mêmes outils tournent aussi en CI. S'il ne fait pas le lien tout seul, c'est la relance à lui donner. - Le plan de repli repoussé « s'il reste du temps », donc jamais fait. C'est le poste le plus facile à sacrifier et le plus coûteux à ne pas avoir. Quinze minutes, pas négociables.
- La coupe faite dans le mauvais segment. Sous pression il rognera sur la justification des choix, qui est silencieuse et lui semble donc dispensable, et gardera la manipulation, qui est visible. C'est l'inverse du barème.
Questions à anticiper
- « Je peux préparer les terminaux à l'avance ? » — oui, le créneau de 16 h à 16 h 10 existe pour cela. Mais la séquence complète doit avoir été répétée, y compris le démarrage de Juice Shop.
- « Et si la régression est fusionnée par erreur ? » — elle ne peut pas l'être, la protection de branche l'interdit tant que
sastest rouge. C'est même le point de la démonstration ; faites-le lui reformuler. - « Combien de diapositives ? » — cinq au maximum, et le schéma de chaîne vaut mieux qu'une capture illisible en visioconférence.
Ce qu'il faut exiger — une répétition intégrale chronométrée avec les durées relevées segment par segment, et le répertoire artefacts/repli/ non vide. L'observable qui distingue « prêt » de « ça devrait passer » : il sait dire ce qu'il coupe s'il a cinq minutes de retard à la moitié. Sans ce plan de coupe, le débordement écrase mécaniquement le segment de justification, c'est-à-dire le seul critère ●●● que la démonstration ne couvre pas.
PFR · J1 — Cinq jobs verts, dix preuves rejouées, soutenance tenue
Jour 1 · Auditer, prouver et soutenir · 1 h
16 h 00 – 16 h 10 · dernière vérification. Vous démarrez Juice Shop maintenant — elle met une minute à répondre —, vous relancez la pile, vous vérifiez que kubectl get nodes répond, vous ouvrez vos onglets dans l'ordre et vous montez la police du terminal.
16 h 10 – 16 h 30 · soutenance, vingt minutes. 16 h 30 – 16 h 50 · retour du jury. 16 h 50 – 17 h 00 · clôture du parcours S4.
Si à 16 h 05 quelque chose ne remonte pas, vous ne déboguez pas : vous basculez sur le repli et la soutenance démarre à l'heure. C'est pour ce moment-là que vous avez passé quinze minutes sur repli.md.
Et rappelez-vous ce qui est évalué en premier : le pipeline refuse la faille, les dix preuves tiennent, et vous savez pourquoi vous avez réglé les choses ainsi. Le reste vient après.
Le critère qu'on coche à tort le plus souvent est le quatrième. Une ligne « Fermé » adossée à « Semgrep ne remonte plus rien » n'est pas fermée, elle est silencieuse — et c'est la première chose que le jury ira tester. Reprenez vos dix lignes et comptez combien portent une commande d'exploitation dans la colonne de preuve : si le compte n'est pas de dix, corrigez ce qui manque avant de cocher, cela prend deux minutes par ligne.
Même exigence sur le premier critère, qui attend un chiffre : « le run dure environ sept minutes, et dast en consomme cinq » se défend ; « c'est assez rapide » ne se défend pas.
Intention — ce n'est pas une auto-évaluation, c'est la grille de départ de la soutenance. Les onze critères se vérifient en moins de deux minutes chacun et constituent, dans l'ordre, l'ordre du jour du retour de jury. Le créneau couvre 16 h – 17 h : préparation, vingt minutes de soutenance à 16 h 10, retour, clôture du parcours.
Ce qui coince
- Le quatrième critère est le cœur de la journée et le plus facile à cocher à tort. Prenez vous-même deux lignes au hasard dans son tableau et faites rejouer les deux exploits devant vous. C'est la vérification qui teste tout le rapport en trois minutes.
- Le cinquième critère, « au moins un finding ouvert ». S'il n'en a aucun, il n'a pas regardé l'historique Git — ou il l'a regardé et l'a corrigé, ce qui est pire. Une seule question à poser : que voit le job
secretsavec--no-git? - Le critère
git ls-files. Il l'a vu le 3 août et le croit acquis une fois pour toutes ; or.env, les artefacts et les manifestes ont bougé pendant quinze jours. Faites-le lancer devant vous : cinq secondes, et c'est le seul critère du parcours qui, raté, compromettrait un vrai dépôt. - La branche
demo/regressiondéjà poussée « pour être sûr ». Elle ruine l'effet de la démonstration et laisse une pull request ouverte avec une faille dedans. Faites-lui vérifier, c'est ungit branch -r. - Le relevé par segment absent. Sans lui, il n'a pas de plan de coupe, et il n'y a plus de temps pour en fabriquer un.
Questions à anticiper
- « Un job est rouge pour une raison réseau, je coche quand même ? » — non, mais ce n'est pas éliminatoire : il coche à côté ce qui est rouge et pourquoi, et il l'annonce dans les deux premières minutes de la soutenance. Un problème annoncé cesse d'être un problème.
- « On peut décaler si la plateforme ne remonte pas ? » — non. Un report abîme plus qu'il n'aide, et le plan de repli existe exactement pour ce cas.
- « Qu'est-ce que je fais de tout ça après ? » — la clôture est prévue jusqu'à 17 h. Le dépôt, les deux rapports et le journal lui appartiennent et constituent son dossier de prise de poste.
Ce qu'il faut exiger — avant 16 h 10 : la plateforme tourne, les onglets sont ouverts, la police est lisible en partage d'écran. S'il débogue encore à 16 h 05, la soutenance démarre quand même à l'heure et il bascule sur le repli. La vérification qui départage, après la démonstration : prenez une ligne de son tableau de preuves et faites-la constater en direct. Concordance, il a mesuré ; écart inexpliqué, tout le tableau redevient douteux — et c'est aussi ce que ferait un client.