docs : un document d'entrée par épreuve, et Trivy dans la chaîne (#269) #270
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!270
Loading…
Reference in a new issue
No description provided.
Delete branch "lenaic/269-docs-epreuves-et-trivy"
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?
Deux sujets qui partent ensemble parce qu'ils sont tous les deux attendus au gel de vendredi 9h00.
1. Le nom que le correcteur cherche
L'énoncé demande « rapport de sécurisation EC04, documentations EC03/EC05/EC06 ». Le rapport EC04 porte déjà ce nom. Les trois autres n'existaient pas : la matière était là, répartie entre
docs/data/,docs/adr/,tests/ci/et les manuels, et il fallait la deviner.Trois documents d'entrée, sur le modèle du rapport EC04. Chacun dit ce qui tourne, où c'est dans le dépôt, comment le vérifier sans nous croire sur parole, et ce qui n'est pas livré :
docs/EC03-INTEGRATION-CONTINUE.mddocs/EC05-CHAINE-DE-DONNEES.mddocs/EC06-MODELE-ET-PREVISION.mdAucun fichier n'est renommé, aucun lien existant ne casse. Le README porte en plus une table « Documentation par épreuve », cinq lignes, qui donne le document d'entrée et ses renvois.
2. Trivy dans la chaîne
pip-auditcouvre les dépendances Python déclarées. Il ne voit ni un secret laissé dans un fichier, ni une image de base vulnérable, ni une ressource Terraform mal configurée. Trivy couvre ces trois-là.Deux passes, et leur sévérité diffère à dessein :
vuln,secretmisconfigRendre
misconfigbloquante ce soir arrêterait la chaîne sur un état connu, ce qui n'apprend rien à personne.L'archive est épinglée par version ET par empreinte, vérifiée contre le fichier de sommes publié avec la version. Comparer un numéro de version ne prouve rien : c'est l'empreinte qui lie l'octet au projet. C'est la leçon du
88d8330, où l'épinglage avait été vérifié contre le mauvais miroir.tests/ci/fixtures/est exclu, et cette exclusion est obligatoire : ces fichiers sont volontairement fautifs et servent à prouver que le garde Terraform et les bancs rougissent. Les scanner ferait échouer la chaîne sur ses propres cas d'essai.Preuve
Éprouvé avant d'être écrit, avec trivy 0.74.0 sur le dépôt :
Bancs rejoués en local :
Ce que la relecture doit regarder
misconfignon bloquante est un compromis assumé à J-1. Si tu préfères la rendre bloquante tout de suite, il faut d'abord fermer le #269.Correctif poussé après une remarque de Lénaïc : « on va valider une PR de CI qui bloquera ? »
Réponse sur le fond : non. La passe bloquante est
vuln,secret, jouée sur le dépôt avant d'être écrite, zéro constat. La passe qui trouve quelque chose (misconfig, deux constats) est journalisée. Merger cette demande ne fait pas rougir la chaîne.Mais la question a révélé un vrai défaut, corrigé en
c786d8b. La première version traitait tout code de retour non nul de Trivy comme « un défaut a été trouvé ». Trivy sort aussi en erreur quand il ne peut pas télécharger sa base de vulnérabilités : réseau, quota, miroir indisponible. La chaîne aurait rougi sans qu'aucun défaut existe — le reproche quetest-hygiene-bancs.shfait aux autres.La forme retenue :
--exit-code 0toujours, 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.ERREURn'est pas zéro, et c'est tout le correctif.Le décompte est un script (
.forgejo/scripts/trivy-compter.py) et non un heredoc dans le workflow : 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 :warnedERREUR· étape sautée, la chaîne passeUn point pour la relecture : sur
infra/terraform/stockage.tf, Trivy recouvre partiellement Checkov, dont le commentaire dans le fichier explique déjà pourquoi huit règles échouent. C'est noté dans le #269.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.Relu, et corrigé sur la branche plutôt qu'en aller-retour : le gel est demain 9 h 00. Trois commits ajoutés —
89f03ffpour la chaîne,c4eba2bet763bf7epour les documents. Ce que la relecture a trouvé, dans l'ordre de gravité.1. Trivy n'analysait rien, et la chaîne était verte
L'étape a été écrite en supposant
curlprésent dans l'image du job Python. Il ne l'est pas :python:3.12-slimle purge avec ses dépendances de construction. Vérifié en jouant l'image sur l'empreinte exacte que le job épingle —curl ABSENT,taretsha256sumprésents. Les jobsterraformetmetal'installent tous les deux, avec le commentaire « absents de l'image slim » ; celui-ci ne le faisait pas parce que rien n'en avait eu besoin avant.L'effet n'était pas un rouge, c'était pire :
if ! curlattrapait le code 127 comme un échec de téléchargement, l'étape rapportaitTrivy (secrets, vulnérabilités) | skipped | archive non téléchargeableet sortait à zéro. Exactement le vert non informatif que l'en-tête de l'étape dit vouloir éviter.Trois correctifs :
curlrejoint l'étape d'installation ; un gardecommand -v curlprécède le téléchargement et échoue (un outil absent n'est pas une panne de réseau, et sans ce garde la même faute repasserait en silence à la prochaine image) ; les exclusions voyagent en paramètres positionnels.2. La PR était rouge sur ses deux jobs
Deux causes, reproduites en local avant correction :
SC2086× 4 sur$exclus, confirmé en jouant actionlint + shellcheck sur le fichier d'avant. Le dépôt applique déjà cette règle — voir le# shellcheck disable=SC2086de ci.yml:1192.ruff format --checkrefusaittrivy-compter.py, rejoué avec ruff 0.16.5, la version épinglée.3. Les §5 « comment le vérifier » ne se rejouaient pas
C'est la section qu'un correcteur tape en premier. Jouées sur le serveur :
enervision. Elle n'existe pas sous ce nom — le serveur porteenervision_prodetenervision_preprod. Toutes les lignespsqld'EC05 et EC06 mouraient sur unFATAL : la base de données n'existe pas. Elles prennent la forme des manuels : conteneur, port 5433.valeur_kwn'existe pas, la colonne estvaleur_prevue_kw(migration 0011). Les deux commandesmlflowétaient des inventions —runs listprend--experiment-id, et l'accès par alias est une API Python, pas une sous-commande. Remplacées par l'API REST du serveur de suivi, qui ne demande rien à installer.mesure_horairen'a pas de colonnehorodatage, l'agrégat nomme son seauheure(migration 0016) ; etsilver.mesure_minuten'existe nulle part — la zone argent est en Parquet dans MinIO, pas en base. La requête porte maintenant surpublic.qualite_jour, qui est précisément la preuve annoncée au §3 : relevé du 09/09, sept sites, de 0 à 68 minutes non comblées sur 1 440.conclusion, le verdict est dansstatus; lejqimprimaitnullsur chaque ligne.end_offset => 1 hour). La fraîcheur du §2 se lit sur la série à la minute : 13 min 20 s au relevé du 10/09 à 17 h 02, dans la fenêtre annoncée de 6 à 15 min.4. Ta question 1 : le §6 d'EC06 était trop court
Relevé sur le registre, ce soir : la version qui porte l'alias
productionest la 6, entraînée le 08/09 et remise en place le 09/09 par le retour arrière de la recette #47. Son exécution portemodele_maemais nientrees_moyenne_kw, nientrees_ecart_type_kw, nientrees_n.reference_promue.lirerend doncNoneet la passe horaire publie une tentative sans mesure : la surveillance de dérive ne mesure rien aujourd'hui. Le §4 dit le mécanisme, le §6 dit le fait, daté. Ce qui manque n'est pas du code — il est en place et la passe l'appelle — mais un réentraînement postérieur au #117, puis sa promotion.5. Ta question 2 :
misconfignon bloquanteD'accord à J-1, à la condition que le #269 porte les deux constats avec leur date de bascule. Mesurés ici avec trivy 0.74.0 sur une extraction propre de la branche, puis confirmés par la chaîne :
infra/terraform/stockage.tfAZU-0012 CRITICAL etinfra/compose/postgres/DockerfileDS-0002 HIGH.Une correction de portée
Le corps de la PR et le commentaire de l'étape annonçaient que Trivy voit « une image de base vulnérable ». Non :
trivy fslit l'arbre du dépôt, les CVE d'une image construite demandenttrivy image. Laissé tel quel, cela aurait fait porter au rapport EC04 une couverture qu'il n'a pas. Le commentaire est corrigé ; le corps de la PR, lui, garde la phrase — à ajuster si tu republies le texte ailleurs.Ce que la chaîne rend maintenant
Les six tâches sont vertes sur
763bf7e, et le journal du run 753 montre que le vert a été gagné :Reste à faire, hors de cette PR
misconfigdans le #269 avec leur date de bascule en bloquant.--skip-dirs node_modulesne couvre pas lesnode_modulesimbriqués (Trivy compare le motif depuis la racine du scan). Sans effet ici — ce job n'en a pas — mais à savoir le jour où l'exclusion comptera.test-hygiene-workflows.sh: tout outil externe appelé dans unrun:doit être installé par le job. C'est ce qui aurait attrapé lecurltout seul.Réserve de forme : j'ai poussé trois commits sur cette branche, mon approbation porte donc en partie sur mon propre travail. L'auteur reste Lénaïc et le verrou tient formellement, mais une seconde paire d'yeux sur
89f03ffavant le gel ne serait pas du luxe.