Set-OPS-Public/docs/audit/preuve-2026-08-27.md
Daniel Allaire 3b65384b0f frontiere : le devis sait desormais refuser SANS consigner
L'outil ne savait qu'AUTORISER — `"action": "pass"` etait en dur dans l'emetteur.
Une regle de silence ne pouvait donc pas naitre du depot, et j'en avais pose deux
a la main sur le boitier : exactement ce que ce projet refuse.

CE QUI L'A MOTIVE. Le journal de la frontiere ecrivait 982 000 entrees par jour,
dont 82 % un balayage Internet contre le port VNC et le reste du bavardage de
decouverte du reseau local. Sa fenetre utile etait tombee a QUARANTE-QUATRE
SECONDES. J'y ai cherche la trace d'un flux du site vers les hyperviseurs, je n'ai
rien trouve, et j'en ai conclu a tort qu'aucune regle ne bloquait. Un journal noye
ment aussi surement qu'un journal mort. Mesure apres declaration : ~20 700/jour.

Une regle de silence ne change AUCUN comportement : ce qu'elle vise etait deja
refuse par le defaut. Elle ne supprime qu'une trace que personne ne lira.

TROIS PIECES.

`cle_regle` accepte une action sans changer d'un octet la cle des regles `pass`
deja posees. L'ajout naif d'un champ les aurait toutes detruites pour les recreer
a l'identique, sur la frontiere, en production. Le plan l'a confirme : 7 a creer,
0 a retirer, 121 inchangees.

`_corps_regle` lit l'action, la consignation et la SEQUENCE depuis le devis. La
sequence est ce qui rend un `block` sur : OPNsense evalue en `quick`, donc un
blocage large emis avant les `pass` fermerait courrier, web et acces distant.

`devis_opnsense` lit `opnsense_silences` et en fabrique regles et alias, motif
compris — une regle `block` muette sans raison ecrite est indiscernable d'un oubli.

P50 garde ces deux dangers. Controles negatifs verifies : un silence en sequence 1
echoue, un silence sans motif echoue.

Carte : 28 pieces d'audit (P48 l'avait vu juste).

make prouver : CONFORME, 50 OK, 0 echec.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-27 18:10:39 -04:00

9.2 KiB
Raw Blame History

Preuve de conformite — Set-OPS — 2026-08-27

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/production/hosts.yml
  • Verdict : ✅ CONFORME (50 OK · 0 echec · 0 saute)

Preuves

# Preuve Affirmations Statut Detail
P01 Lint (ansible-lint) AFF-006 ✅ OK 
P02 Tests unitaires (inventory_host) — ✅ OK >>> le verrou tient : aucune VM n'aurait ete touchee
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).
P08 Orchestration (couches + graphe) AFF-070 ✅ OK Orchestration coherente : 37 groupes classes, aucun cycle, aucune arete en arriere.
P09 Flux reseau (schema + matrice) AFF-071 ✅ OK Flux coherents : 35 rôles, 92 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_oauth2_proxy
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 5 hotes, 14 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 : 18 secret(s) exige(s), tous presents. Voute reelle : 21 cle(s), aucun manque.
P19 Le GUI couvre le schema du plan AFF-002, AFF-095 ✅ OK GUI : les 14 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 : 11 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), 50 groupe(s), 79 regle(s).
P26 Integrations universelles : aucun hote laisse de cote AFF-108 ✅ OK 5 hote(s) x 5 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, 35 VM placee(s), aucun nom ni VMID en collision.
P29 Authentification : chaque role declare sa position AFF-111 ✅ OK 29 role(s) serveur declares (interne-sans-auth 2, ldap-direct 2, sans-auth-humaine 18, 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 50 scripts expliques et atteignables, 104 cibles make documentees, 61 roles avec README.
P32 Intrants exiges par les roles : tous fournis — ✅ OK CONFORME : 14 exigence(s) de role, toutes satisfaites (39 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 (16 groupes).
P34 Chaque document declare son lecteur — ✅ OK 42 document(s) declarent leur lecteur (25 genere(s) exempte(s)).
P35 Toute application exigeant une base en a une au plan — ✅ OK 0 application(s) exigeant une base l'ont toutes (0 entree(s) au registre).
P36 Tout detenteur d'etat porte une sauvegarde — ✅ OK 2 hote(s) 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 : 36 role(s) serveur/client tous nommes, 37 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 : 46 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 : 5 machine(s) du plan retrouvees, 56 regle(s) du site.
P44 Integrations : le serveur avant ses clients — ✅ OK 4 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 84 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 (110 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 121 regles pass), tous non consignes et tous motives.

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-08-27.