Set-OPS-Public/docs/audit/preuve-2026-09-17.md
Daniel Allaire be8c3917e5 acces d'administration : un tunnel par locataire, declare par lui, borne a lui
plan/acces.yml chez le locataire (cles publiques), reseau/port/instance derives de l'index.
La garde du devis refuse qu'un tunnel de locataire vise autre chose que son supernet : sans
elle, un ecosysteme s'ouvrirait un acces chez un voisin depuis son propre plan.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 16:01:54 -04:00

15 KiB

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

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 : instance — inventaire instance/inventories/principal/hosts.yml
  • Verdict : ✅ CONFORME (82 OK · 0 echec · 0 saute)

Preuves

# Preuve Affirmations Statut Detail
P01 Lint (ansible-lint) AFF-006 ✅ OK } | to_nice_json }}`.
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 5 instance(s) verifiee(s) — instance-ci-1646753, 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 : 42 groupes classes, aucun cycle, aucune arete en arriere ; playbooks/site.yml a jour.
P09 Flux reseau (schema + matrice) AFF-071 ✅ OK Flux coherents : 40 rôles, 120 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 13 hotes, 33 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 : 33 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 30 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 : 6 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 : 14 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, 4 tenant(s), 56 groupe(s), 104 regle(s).
P26 Integrations universelles : aucun hote laisse de cote AFF-108 ✅ OK 13 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 : 5 pool(s) Proxmox, 44 VM placee(s), aucun nom ni VMID en collision.
P29 Authentification : chaque role declare sa position AFF-111 ✅ OK 34 role(s) serveur declares (interne-sans-auth 2, ldap-direct 2, sans-auth-humaine 23, 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 72 scripts expliques et atteignables, 133 cibles make documentees, 69 roles avec README.
P32 Intrants exiges par les roles : tous fournis — ✅ OK CONFORME : 37 exigence(s) de role, toutes satisfaites (147 cle(s) declaree(s) par l'instance).
P33 Aucune collision de port entre roles co-localises — ✅ OK CONFORME : 42 revendication(s) de port, aucune collision entre roles co-localises (35 groupes).
P34 Chaque document declare son lecteur — ✅ OK 49 document(s) declarent leur lecteur (43 genere(s) exempte(s)).
P35 Toute application exigeant une base en a une au plan — ✅ OK 4 application(s) exigeant une base l'ont toutes (3 entree(s) au registre).
P36 Tout detenteur d'etat porte une sauvegarde — ✅ OK 8 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 : 42 role(s) serveur/client tous nommes, 42 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, 96 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 : 68 script(s) passent par inventory_rules, 3 exemption(s) nommee(s).
P42 L'edge porte les noms qu'il publie — ✅ OK 5 edge(s) emettent un certificat portant les noms publies (instance-ci-1646753/production, OPS-Chezlepro-lab/principal, OPS-Chezlepro/principal, OPS-Technolibre
P43 Frontiere : le devis voit les machines du site — ✅ OK Devis de la frontiere : 9 machine(s) du plan retrouvees, 200 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 101 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 (138 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 305 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 — 13 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 13 hote(s) : la cle du SITE ne nait que sur 1 runner(s) de tenant, celle du tenant sur 13.
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 (82 preuves, 69 roles, 42 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 392da4d (publie le 2026-09-14).
P61 Schema du plan : il decrit tout ce que les plans contiennent AFF-033 ✅ OK Le schema decrit 55 champ(s) sur 7 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:8, 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 41 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.
P66 Clients OIDC : chaque URI vise un nom que le plan expose — ✅ OK 4 client(s) OIDC, toutes leurs URI visent un FQDN que le plan expose (6 exposition(s)).
P67 Nom public : le service porte celui du plan, pas celui du role — ✅ OK 13 service(s) expose(s) portent le nom du plan, sur 2 inventaire(s) : instance, SITE.
P68 Cle de depot telechargee : mesuree avant d'etre utilisee — ✅ OK 5 role(s) telechargent une cle de depot, tous la mesurent avant de s'en servir.
P69 Amorcage d'un tenant : l'adresse designe le site REEL — ✅ OK 2 adresse(s) d'amorcage designent bien une machine du site.
P70 Depot de binaires : il tient tout ce que les roles vont chercher — ✅ OK 6 artefact(s) direct(s) tenus par le depot du site.
P71 Pool du site : le genome ne nait pas chez un tenant — ✅ OK site-creer nomme --pool-site ; le pool du genome ne peut plus etre celui d'un tenant.
P72 Annuaire : aucun service ne se lie avec le compte du maitre — ✅ OK 5 role(s) consultent l'annuaire, chacun avec SON compte de service ; seul amorcage_acces garde celui d'administration, et il provisionne au lieu de consommer.
P73 Le locataire designe les services de son site REEL — ✅ OK CONFORME : 9 intrant(s) du locataire concordent avec ce que le site expose (1 non declare(s), donc derive(s) ou non utilise(s)).
P74 Gabarit dore : une seule declaration, au plan du site — ✅ OK Gabarit declare une seule fois : VMID 9006 « modeleSetOPS-minimal », precedent 99998.
P75 Les parametres de clonage traversent les trois maillons — ✅ OK 14 parametre(s) de clonage, tous emis par l'inventaire.
P76 Tout gabarit de role se rend vraiment — ✅ OK 165 gabarits de role : tous se rendent.
P77 Panneaux declares : assemblables, et gradues — ✅ OK 8 panneau(x) declare(s) dans 2 role(s), tous avec titre, expression, raison et une unite que la table sait traduire.
P78 Un consommateur de base suit le verrou TLS de son serveur — ✅ OK 3 consommateur(s) suivent la posture de leur serveur ; 2 sans reglage TLS (serveur_icingaweb2, serveur_nextcloud).
P79 Replis silencieux : une derivation vide ne passe pas pour un succes — ✅ OK 6 ecosysteme(s) (instance-ci-1646753, OPS-Chezlepro-lab, OPS-Chezlepro, OPS-Technolibre, OPS-Patient0, SITE-Chezlepro) : pattes, edges, certificats, rechargemen
P80 Remise au client : inscrite, nommee, et son second temps a l'heure — ✅ OK Aucun ecosysteme remis a un client : rien a tenir.
P81 La console dit sa portee, et ne sert pas un inventaire vide en silence — ✅ OK Portee poste derivee des symlinks, source d'inventaire instance, et 14 route(s) POST exigent toutes un pouvoir.
P82 DNS public : les zones publiees sont servies, signees avant d'etre exposees — ✅ OK 2 zone(s) publique(s) declaree(s), toutes servies par le site ; 2 replication(s) declaree(s) des deux cotes ; transfert ouvert a la cle seule ; aucune expositio

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-17.