Set-OPS-Public/docs/audit/preuve-2026-09-10.md
Daniel Allaire a60b69f072 un fichier vide existe, et une sonde pour les correctifs
LA GARDE FICHIER ENTIER, en deux corrections. Un telechargement
interrompu laisse un fichier de zero octet QUI EXISTE, et toutes les gardes
demandaient seulement s il etait la. infra-mail-01 a garde une cle
smallstep de 0 octet apres l epreuve hors ligne.

La premiere correction n a pas suffi. Ajouter le controle de taille faisait
bien s executer la tache - et le fichier faisait toujours 0 octet au
passage suivant. get_url sur une destination existante emet une requete
CONDITIONNELLE : l amont repond non modifie, le module rend ok, la ruine
reste. Le play etait vert et ne reparait rien. Il faut effacer avant de
redemander.

Controle negatif : 0 -> 1022 octets, 0 erreur apt. Cinq roles.

LA SONDE CORRECTIFS, 23e. Set-OPS desarme unattended-upgrades et applique
les correctifs au deploiement - choix defendable, le verrou dpkg a fait
decrocher une machine d une reconstruction entiere le matin meme. Mais rien
ne disait QUAND le geste etait du : une flotte pouvait deriver des mois en
restant verte.

Elle mesure les paquets de securite en attente ET depuis quand. Elle ne
lance pas apt-get update - une sonde qui rafraichit l index toutes les
quinze minutes deviendrait la cause de la panne qu elle surveille. Et le
seuil de 72 h est un choix d exploitation, pas une derivation : le
mecanisme qui applique les correctifs est un geste humain.

P64 REFUSAIT UNE DECLARATION CORRECTE. serveur_debian et serveur_durci sont
des roles de declaration pure, sans une tache ; le travail est fait par les
roles que leur playbook applique. La preuve exigeait declaration et depot
dans le meme role - vrai des vingt-deux premieres sondes, faux des qu une
sonde appartient au socle. Une garde qui force a contourner ce qu elle
protege est un defaut. Elle suit desormais le playbook du groupe.

Mesure : 21/21 machines vertes, 65 preuves, 23 sondes, 0 echec.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
2026-09-10 17:26:35 -04:00

12 KiB
Raw Blame History

Preuve de conformite — Set-OPS — 2026-09-10

Genere par make prouver (scripts/prouver.py). Rejouable : relancer reproduit ce rapport. Chaque preuve rejoue l'outillage existant du depot ; aucune validation n'est reimplementee ici. Voir le mode d'emploi : docs/audit/README.md, et le registre trace : docs/audit/affirmations.md.

  • Instance : /home/danallaire/Espace Chezlepro/DépôtsSurForge/Set-OPS-public/instance — inventaire /home/danallaire/Espace Chezlepro/DépôtsSurForge/Set-OPS-public/instance/inventories/principal/hosts.yml
  • Verdict : ✅ CONFORME (65 OK · 0 echec · 0 saute)

Preuves

# Preuve Affirmations Statut Detail
P01 Lint (ansible-lint) AFF-006 ✅ OK 
P02 Tests unitaires (inventaire, raser, ecritures du plan, rendu du GUI) — ✅ OK OK
P03 Diff-vide du plan — TOUTES les instances AFF-001, AFF-004, AFF-030, AFF-031, AFF-032 ✅ OK 4 instance(s) verifiee(s) — OPS-Chezlepro-lab, OPS-Chezlepro, OPS-Technolibre, OPS-Patient0 : plan et inventaire applique coincident.
P04 Groupes <-> playbooks homonymes AFF-008 ✅ OK
P05 Dependances causales de groupes AFF-009, AFF-084 ✅ OK
P06 Validateurs de registres (serveurs/apps/bases/domaines) AFF-003 ✅ OK Registre des domaines valide.
P07 GUI (node --check) AFF-033 ✅ OK JS du GUI : syntaxe valide (node --check), 1 nom(s) surveille(s) sans reference orpheline.
P08 Orchestration (couches + graphe) AFF-070 ✅ OK Orchestration coherente : 41 groupes classes, aucun cycle, aucune arete en arriere.
P09 Flux reseau (schema + matrice) AFF-071 ✅ OK Flux coherents : 39 rôles, 103 flux, schéma + matrice OK.
P10 Handlers <-> notify AFF-034, AFF-035 ✅ OK Tout notify pointe vers un handler du meme role (49 roles).
P11 Syntaxe des playbooks (--syntax-check) AFF-083 ✅ OK serveur_resolveur_site
P12 Existence des runbooks cites AFF-010, AFF-011, AFF-012, AFF-083 ✅ OK 17/17 runbooks/registres cites presents.
P13 Invariants structurels/doctrinaux AFF-015, AFF-022, AFF-037, AFF-038, AFF-062 ✅ OK LICENSE, socle dossier, pas de couches paralleles, SSH clef-only, nftables off : OK.
P14 Pas de chemin lab/ code en dur AFF-097 ✅ OK Aucun chemin instance/inventories/lab/group_vars code en dur.
P15 Modele public socle valide AFF-022, AFF-099 ✅ OK Modele public socle : domaines/serveurs/applications/bases valides.
P16 Inventaire Ansible complet (--list) AFF-030 ✅ OK 14 hotes, 34 groupes (inventaire dechiffre et parse).
P17 Tous les modeles valident (registres + underlay) AFF-022, AFF-099 ✅ OK Les 1 modele(s) decouvert(s) valident.
P18 Gabarit de voute complet AFF-026 ✅ OK Gabarit de voute complet : 23 secret(s) exige(s), tous presents. (Voute reelle non lisible ici : verification sautee.)
P19 Le GUI couvre le schema du plan AFF-002, AFF-095 ✅ OK GUI : les 29 champ(s) des plans reels sont editables (2 plan(s) inspecte(s)), registres toleres : nomenclature.
P20 Adressage 100% derive du seed (aucun stocke) AFF-001, AFF-003 ✅ OK 2 nomenclature(s) : adressage 100% derive du seed index.
P21 Federation : aucun index en collision AFF-102 ✅ OK Federation coherente : 3 instance(s) federee(s), aucun index en collision.
P22 Plan de recette a jour (genere du wiki) AFF-002 ✅ OK Plan de recette à jour (22 sections).
P23 Underlay sans collision avec la plage tenant AFF-103 ✅ OK Underlay conforme : 13 reseau(x), aucune collision avec la plage tenant.
P24 Frontiere nord/sud : acces d'administration declare AFF-104 ✅ OK note : serveur_powerdns declare un port derive que le plan du site ne resout pas — aucune regle emise.
P25 Pare-feu Proxmox : est-ouest intra-tenant derive AFF-107 ✅ OK CONFORME : pare-feu Proxmox, 3 tenant(s), 49 groupe(s), 81 regle(s).
P26 Integrations universelles : aucun hote laisse de cote AFF-108 ✅ OK 14 hote(s) x 6 integration(s) universelle(s) : aucune lacune, aucune recopie (0 exemption(s) derivee(s) du service rendu).
P27 Propriete des intrants : hebergeur et tenant separes AFF-109 ✅ OK 8 cle(s) de cluster chez l'hebergeur, aucune recopiee dans les group_vars du tenant.
P28 Pools Proxmox : un par tenant, sans collision AFF-110 ✅ OK CONFORME : 3 pool(s) Proxmox, 34 VM placee(s), aucun nom ni VMID en collision.
P29 Authentification : chaque role declare sa position AFF-111 ✅ OK 32 role(s) serveur declares (interne-sans-auth 2, ldap-direct 2, sans-auth-humaine 21, socle-identite 2, web-sso 5) ; 2 lacune(s) nommee(s) : serveur_loki, serv
P30 SDN EVPN : zones, VNets et sous-reseaux derives AFF-112 ✅ OK CONFORME : SDN EVPN, 3 zone(s), 15 VNet(s), 15 sous-reseau(x), aucune collision.
P31 Documentation : tout ce que le depot FAIT est nomme — ✅ OK 58 scripts expliques et atteignables, 115 cibles make documentees, 67 roles avec README.
P32 Intrants exiges par les roles : tous fournis — ✅ OK CONFORME : 38 exigence(s) de role, toutes satisfaites (132 cle(s) declaree(s) par l'instance).
P33 Aucune collision de port entre roles co-localises — ✅ OK CONFORME : 33 revendication(s) de port, aucune collision entre roles co-localises (36 groupes).
P34 Chaque document declare son lecteur — ✅ OK 44 document(s) declarent leur lecteur (36 genere(s) exempte(s)).
P35 Toute application exigeant une base en a une au plan — ✅ OK 5 application(s) exigeant une base l'ont toutes (4 entree(s) au registre).
P36 Tout detenteur d'etat porte une sauvegarde — ✅ OK 9 hote(s) de l'ecosysteme et 3 du site detiennent de l'etat, tous porteurs de client_backup (9 groupe(s) au catalogue).
P37 Le placement du tenant existe chez son hebergeur — ✅ OK placement confronte a l'hebergeur monte (SITE-Chezlepro) : noeud, stockage, pont — tous offerts.
P38 Catalogue des services : la carte dit ce que le moteur fait — ✅ OK Catalogue a jour : 40 role(s) serveur/client tous nommes, 41 groupe(s) cite(s) en table existent tous.
P39 Glossaire : tout mot employe est enseigne — ✅ OK Glossaire complet : 81 terme(s) du jargon expliques, 15 lien(s) valides, 27 page(s) de wiki toutes atteignables.
P40 Parente : l'ecosysteme sait de quoi il descend — ✅ OK Parente coherente : 4 depot(s), tous retrouves, tous porteurs d'un remote.
P41 Resolution d'instance : une seule, partagee — ✅ OK Resolution unique : 54 script(s) passent par inventory_rules, 3 exemption(s) nommee(s).
P42 L'edge porte les noms qu'il publie — ✅ OK 4 edge(s) emettent un certificat portant les noms publies (OPS-Chezlepro-lab/principal, OPS-Chezlepro/principal, OPS-Technolibre/principal, OPS-Patient0/product
P43 Frontiere : le devis voit les machines du site — ✅ OK Devis de la frontiere : 7 machine(s) du plan retrouvees, 151 regle(s) du site.
P44 Integrations : le serveur avant ses clients — ✅ OK 5 integration(s) appliquent leur serveur avant leurs clients.
P45 Pare-feu Proxmox : arme sur les VNet SDN, jamais ailleurs — ✅ OK Le pare-feu Proxmox ne s'arme que sur un VNet SDN (4 cas evalues, dont un qui doit rendre VRAI).
P46 Plancher /etc/hosts : un seul role en decide — ✅ OK Un seul maitre du plancher — roles/hosts_statiques/tasks/main.yml : manage_etc_hosts: false ; et le gabarit maitre est pose (roles/hosts_statiques/templates/hos
P47 Zones inverses : couvrir l'occupe, et rien de plus — ✅ OK Les zones inverses couvrent l'occupe et rien de plus (5 cas evalues, dont un site a quatre zones et un tenant a une).
P48 La carte d'orientation designe ce qui existe, et compte juste — ✅ OK La carte designe 89 chemin(s) qui existent, et ses 7 chiffres correspondent a la mesure.
P49 Registre des flux : la matrice d'audit est a jour — ✅ OK Le registre des flux reproduit exactement ce que les meta/flux.yml declarent (121 lignes).
P50 Silences : un refus muet est declare, place en dernier, et motive — ✅ OK 2 silence(s) declare(s), tous en sequence > 1 (la plus haute des 213 regles pass), tous non consignes et tous motives.
P51 Collections : toutes declarees, toutes epinglees — ✅ OK 3 collection(s) et 2 bibliotheque(s) Python declarees et epinglees : ansible.posix==1.6.2, community.general==10.3.0, community.postgresql==3.10.2
P52 Materialiser n'exige pas d'entrer dans le tenant — ✅ OK creer-vm confirme par l'agent invite (API des hyperviseurs, deja utilisee pour creer), sans exiger d'entrer dans le tenant.
P53 L'interne refuse a voix haute, la bordure se tait — ✅ OK L'interne parle, la bordure se tait — 15 ruleset(s) nftables refusent a voix haute ; pare-feu est-ouest en REJECT, source unique ; frontiere muette (actions : b
P54 L'insemination ne reclame aucun secret du tenant — ✅ OK 2 couche(s) d'insemination (serveur_debian, serveur_ops), 9 role(s) applique(s), aucun secret de tenant reclame.
P55 La cle du SITE ne nait que sur le runner d'un tenant — ✅ OK 14 hote(s) : la cle du SITE ne nait que sur 1 runner(s) de tenant, celle du tenant sur 14.
P56 Gabarit minimal, et rien de retire n'est perdu — ✅ OK Gabarit minimal : 4 role(s), tous indispensables au premier demarrage ; 14 role(s) retire(s), tous repris par le socle ou le durcissement.
P57 Comptes en prose : les chiffres du depot sur lui-meme — ✅ OK Les comptes ecrits en prose correspondent a la mesure (65 preuves, 67 roles, 41 groupes).
P58 Habilitations : chaque service dit a quel GROUPE, et par quoi — ✅ OK 8 habilitation(s) declarees, toutes nommant un groupe, un mecanisme connu et une raison ; les role-realm sont projetees.
P59 Enumerations annoncees : le nombre correspond a ce qui suit — ✅ OK 2 enumeration(s) annoncee(s) correspondent a ce qu'elles annoncent (formes non ambigues seulement).
P60 Wiki publie : la forge sert ce que le depot dit AFF-002 ✅ OK Le wiki publie correspond au depot : wiki/ n'a pas bouge depuis 2d9dc86 (publie le 2026-09-09).
P61 Schema du plan : il decrit tout ce que les plans contiennent AFF-033 ✅ OK Le schema decrit 47 champ(s) sur 6 registres ; il couvre tout ce que les plans reels contiennent, et la FORME de chaque champ (scalaire / objet / table) corresp
P62 Schema du plan : il decrit tout ce que le MOTEUR accepte AFF-033 ✅ OK Les 4 validateurs n'acceptent aucun champ que le schema ignore (applications:8, bases_donnees:4, domaines_publics:5, serveurs:3 champ(s) lus par validateur).
P63 cloud-init nait avec la VM et ne lui survit pas — ✅ OK cloud-init est au gabarit (la premiere seconde), absent du socle (pas de va-et-vient), et retire par le durcissement — avec la garde qui verifie que le reseau s
P64 Sondes de supervision : declarees ET deposees — ✅ OK 23 sonde(s) declaree(s) ET deposee(s), chacune avec sa raison et son ttl : client_journal/journaux, client_metrique/metriques, client_pki/certificat, serveur_
P65 Depots tiers : demandes au cache, jamais en HTTPS direct — ✅ OK 4 depot(s) tiers relaye(s) par le cache, aucun role ne les vise en https:// ecrit en dur.

Couverture des affirmations ✅ du registre

Chaque affirmation ✅ automatisable est couverte par la preuve indiquee ci-dessus. Les ✅ structurelles/doctrinales non rejouables par une commande (ex. AFF-005 make=aide, AFF-014 ciblage groupe, AFF-024 instancier-appliquer, AFF-051 autorite d'AGENTS.md, AFF-073/075 gardes make, AFF-090 wiki) ont ete verifiees a l'audit ; elles restent hors du harnais recurrent (rien d'executable a rejouer).

Declarations d'intention (⚪ invérifiables localement — assumees)

Ces affirmations ne sont pas rejouables hors production ; elles sont assumees comme declarations d'intention, non comme preuves :

  • AFF-036 — « testables avec --check autant que possible » : verifiable seulement contre une flotte vivante.
  • AFF-091 — contenu pedagogique du wiki : affirmations conceptuelles.
  • AFF-096 — « GUI 100 % francais » : revue exhaustive des libelles rendus, non automatisee.
  • AFF-007 — hote d'exemple web-frontal-01 : placeholder assume.

Rapport genere le 2026-09-10.