Mise en production : les trois écrans manquants, les documents d'épreuve, Trivy et l'IAM en Terraform #271
No reviewers
Labels
No labels
Compat/Breaking
EC01
EC02
EC03
EC04
EC05
EC06
Kind/BDD
Kind/Back
Kind/Bug
Kind/CICD
Kind/Cloud
Kind/Contenu
Kind/Data
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Front
Kind/IA
Kind/Infra
Kind/Monitoring
Kind/Security
Kind/Testing
Portée/Post-jury
Priority
Critical
Priority
High
Priority
Low
Priority
Medium
Reviewed
Confirmed
Reviewed
Duplicate
Reviewed
Invalid
Reviewed
Won't Fix
Status
Abandoned
Status
Blocked
Status
Need More Info
ops/alerte
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
g2/enervision!271
Loading…
Reference in a new issue
No description provided.
Delete branch "develop"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Ce que ça change
Mise en production de tout ce qui est entré dans
developdepuis la livraisondu 09/09 au soir (#259) : les trois écrans qui manquaient au tableau de bord
(administration des comptes, contact, note d'information RGPD), un document
d'entrée par épreuve pour le correcteur, Trivy dans la chaîne d'intégration,
l'attribution RBAC Azure sortie du script d'amorçage, et le correctif du
drapeau « reconstitué » qui hachurait des barres saines.
main=develop.Aucun ticket à fermer ici : chacun l'a été par sa propre demande de fusion.
Cette demande sert le gel de vendredi 9h00 et la soutenance EC02 du 11/09.
Preuve
Les demandes livrées :
Elles servent les tickets #16, #19, #20, #237, #265, #267 et #269 ; la #260
(rapport de sécurisation EC04) n'a pas de ticket, elle répond directement à
l'énoncé. Chacune est entrée dans
developavec ses six tâches de chaîne auvert et l'approbation d'un pair — sauf la #264, fusionnée sans revue
formelle (voir « Où regarder en priorité »). Aucune n'a été forcée.
La chaîne est au vert sur la tête de
develop(19efc19), les six tâches.Aucune migration dans cette livraison, et c'est ce qui la distingue de la
#252 :
db/migrations/s'arrête toujours à0022_cadence_dix_minutes.sql.Pas de nouvelle variable d'environnement, pas de changement de
compose,d'
infra/ansible/ni de rôle Ansible. Le retour arrière est donc ungit revert -m 1du commit de fusion, suivi du déploiement continu quirepart tout seul sur
main. Rien à défaire côté base ni côté Azure..forgejo/workflows/ci.ymlchange — Trivy entre dans la chaîne — mais sanscréer de nouveau contrôle requis : l'étape vit dans la tâche
« Python — qualité, tests et dépendances », déjà couverte par le motif
Intégration / *de la protection demain. Rien à retoucher dans laconfiguration de la branche avant de fusionner.
Ce qui change pour la démonstration
/administration(#16) liste les comptes triés par adresse avec leur étatet leur date de création, réservé au rôle
admin— le contrôle reste côtéAPI, la vue ne fait que l'annoncer ; l'API gagne
GET /auth/users, quicomplète les
POSTetPATCHdéjà en place et n'expose jamais le condensédu mot de passe.
/contact(#19) prépare un courriel et le remet au clientde messagerie du poste, l'API n'ayant aucune route de contact, avec
l'adresse de l'exploitant affichée en clair à côté pour le poste sans client
configuré.
/confidentialite(#20) porte la note d'information del'article 13 du RGPD. Les deux dernières sont lisibles sans session, depuis
le pied de la page de connexion et depuis le menu du compte.
« douze mois glissants » pour les journaux d'authentification quand l'API
purge à 90 jours (
AUDIT_RETENTION_DAYS). Sur une note article 13, c'estune inexactitude substantielle : la page dit désormais quatre-vingt-dix
jours, et une ligne « Sessions » distincte rappelle la session absolue de
trente jours et la purge à sept jours (
SESSION_RETENTION_DAYS). Un testverrouille la durée affichée.
(#267). Les trois requêtes de série posaient
imputeeavec unbool_orsurtout le seau : une minute interpolée sur 60 (barre horaire) ou sur 1 440
(barre journalière) hachurait la barre entière. SITE003 (data center) et
SITE005 (hôpital), seuls sites au régime « report » de l'ADR 0006,
ressortaient hachurés sur toutes leurs barres à 100 % de disponibilité.
Les requêtes remontent maintenant le nombre de minutes reconstituées et
tranchent sur la part (
SEUIL_SEAU_IMPUTE = 0.5). Décision produit prisedans le même fil : la courbe de la fiche site ne distingue plus visuellement
le mesuré du reconstitué, une seule teinte pour la consommation, seule la
prévision se détache. La méthode d'une valeur reste lisible au clic dans le
panneau de traçabilité, fenêtre 24 h. Connu et assumé : sur les fenêtres
7 j et 30 j, qui n'ont pas de traçabilité, la méthode n'apparaît plus nulle
part.
rapport de sécurisation EC04 et des documentations EC03 / EC05 / EC06 ;
la matière existait, éparpillée entre
docs/api/,docs/data/,docs/adr/,tests/ci/et les manuels, mais un correcteur qui cherchait ces livrablespar leur nom ne trouvait rien. Quatre documents les rassemblent :
RAPPORT-EC04-SECURISATION.md,EC03-INTEGRATION-CONTINUE.md,EC05-CHAINE-DE-DONNEES.md,EC06-MODELE-ET-PREVISION.md. Leursparagraphes « comment le vérifier » ont été rejoués sur le serveur, pas
seulement écrits.
vulnérabilités HIGH/CRITICAL sont bloquants ; les constats de configuration
sont journalisés et suivis par le #269, le temps de les traiter. La tâche ne
peut pas mentir sur son propre état : une panne d'outil — archive
indisponible, empreinte inattendue,
curlabsent de l'image — est déclaréeskippedoufailed, jamaispassed. C'est d'ailleurs ce qui s'est passéen cours de route : l'étape avait été écrite en croyant
curlprésent dansl'image
slim, elle n'analysait rien ; le correctif est dans le lot.L'unique droit que ce projet attribue lui-même — « Storage Blob Data
Contributor » sur le compte qui porte l'état Terraform — était posé par
bootstrap.shet invisible ailleurs. Il vit maintenant dansinfra/terraform/acces-etat.tf, adopté par import et non recréé : lescript reste l'amorçage, Terraform devient la référence lisible, et les deux
ne peuvent plus diverger sans qu'un
plan -refresh-onlyle montre.chargement zone or portait la journée
2026-09-03écrite en dur ; passé le10/09, le garde-fou de compression
controler_fenetre(sept jours) refusaitla journée et le job Python rendait 4 au lieu de 0. La date est devenue
glissante.
Si ça touche
infra/terraform/terraform plan -out=tfplan— fait avant la fusion dansdevelop,dans la #264 ; rien n'a touché
infra/terraform/depuis.terraform apply tfplan— sans objet. Cette livraison ne créeaucune ressource Azure : le seul changement d'état a été un
terraform import, joué et tracé dans la #264. Fusionner versmainnerejoue rien côté Azure, l'
applyn'étant pas automatisé (ADR 0007).Ce qui reste au plan, et pourquoi
Ces trois lignes n'appartiennent pas à cette livraison : ce sont les
ressources du #69, non applicables avec le rôle école
(
Microsoft.Insights/actionGroups/writeetmanagementPolicies/writesontrefusés). Voir les corrections datées du 10/09 sur les ADR 0007 et 0012.
azurerm_role_assignment.etat_donneesn'y figure pas : il est importé.Relecture
Ce qui suit le code
docs/runbooks/mis à jour —terraform-etat.md(manœuvre d'import,épinglage du principal, remède
RoleAssignmentExists, retour arrièrestate rm, piègeMSYS_NO_PATHCONV),stockage-secours.md(§3 corrigé :l'alerte de capacité qu'il décrivait comme active ne l'a jamais été,
403 AuthorizationFailedsurMicrosoft.Insights/actionGroups/write),ci.md(le motif d'une exception checkov, faux depuis le #69), et leREADME.mddes manuelsdocs/runbooks/ci.md, nidans le nouveau
docs/EC03-INTEGRATION-CONTINUE.md, dont le §2 énumèrepourtant « les six verrous ». Voir « Où regarder en priorité »
docs/adr/complété — ADR 0007 (listKeysest accordé) et ADR 0012(
Microsoft.Insights/*ne l'est pas ; l'alerte du #69 n'a jamais été enservice)
docs/journal.md— rien à consigner, aucun incident de production surla période
.env.exampleest inchangéOù regarder en priorité
developsans revue formelle. C'est la seuledu lot dans ce cas, et c'est celle qui touche Azure. Le changement est
pourtant le plus facile à vérifier : il n'ajoute aucune ressource, il en
adopte une qui existait déjà. La case « le pair a relu le plan » ci-dessus
reste à cocher : c'est le geste attendu sur cette demande-ci.
choix se défend — hachurer en permanence un hôpital faisait lire une
avarie qui n'existe pas — mais il retire une information de l'écran sur
deux fenêtres sur trois. À valider avant la démonstration, pas après : le
jury regarde l'EF-04.
document.
grep -ril trivy docs/ne rend rien : nirunbooks/ci.md, nile
EC03-INTEGRATION-CONTINUE.mdlivré par la même demande de fusion,dont le §2 énumère pourtant « les six verrous, et ce que chacun refuse ».
Un septième verrou peut désormais refuser une fusion sans qu'aucun manuel
dise ce qu'il contrôle ni quoi faire quand il rougit — et la base de
vulnérabilités bouge toute seule, donc il rougira un jour sur une demande
qui n'a rien changé. Le code fait déjà le bon geste, il distingue le
constat de la panne d'outil ; c'est la ligne du tableau qui manque. Petit
ticket à ouvrir, à faire avant le gel plutôt qu'après.
docs/EC0*.mdsont des livrables de jury, pas de la documentationinterne. Une relecture à voix haute vaut le coup : ce sont les quatre
fichiers que le correcteur ouvrira en premier.
LE DÉFAUT. La première version traitait tout code de retour non nul de Trivy comme « un défaut a été trouvé ». Or Trivy sort aussi en erreur quand il ne peut pas télécharger sa base de vulnérabilités : réseau coupé, quota, miroir indisponible. La chaîne aurait rougi sans qu'aucun défaut existe, et un rouge qui n'est pas une information finit par être ignoré — c'est exactement le reproche que test-hygiene-bancs.sh fait aux autres. LA FORME RETENUE. « --exit-code 0 » toujours, sortie JSON, et c'est le DÉCOMPTE lu dans le rapport qui décide. Pas de rapport exploitable, pas de verdict : l'étape se déclare sautée et laisse passer. .forgejo/scripts/trivy-compter.py rend le nombre de constats hauts et critiques, ou « ERREUR » si le fichier n'existe pas ou n'est pas du JSON. La distinction est le cœur du correctif : ERREUR n'est pas zéro. Le décompte est un script et non un heredoc dans le workflow, parce qu'un heredoc indenté dans un bloc YAML rend à Python des lignes à espaces de tête et meurt sur une IndentationError. ÉPROUVÉ, PAS SUPPOSÉ. L'étape a été extraite du YAML et rejouée sous dash, le shell du runner : - dépôt réel, empreinte juste .... code 0, vuln+secret 0 constat, misconfig 2 constats en warned - empreinte fausse .............. code 1, « on n'exécute pas un binaire non vérifié » - rapport illisible ou absent .... « ERREUR », étape sautée Bancs rejoués : test-hygiene-workflows.sh, test-hygiene-bancs.sh.