diff --git a/CHANGELOG.md b/CHANGELOG.md index 56c423a..b52111d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,49 @@ # CHANGELOG — Set-OPS +## 2026-09-16 (2) — Les responsabilites, deduites des pouvoirs + +Un partage de responsabilites se redige d'habitude en distribuant des devoirs. Celui-ci +les DEDUIT, et la regle tient en une ligne : + +> Qui peut, doit. Qui ne peut pas, ne peut pas etre tenu — et personne ne peut se +> decharger sur celui qui ne peut pas. + +`docs/responsabilites-locataire-hebergeur.md` part donc des trois portees qui existent +deja dans le moteur — *calculer*, *configurer*, *materialiser* — et en tire vingt lignes, +chacune citant le mecanisme qui la rend vraie : un role, une garde, une commande. + +### Les lignes qui ne se devinaient pas + +**Les sauvegardes se partagent en deux, et la coupure est nette.** L'hebergeur repond de +ce que sa sonde peut constater : le depot accepte-t-il encore une ecriture ? Il ne peut +pas juger un instantane — il heberge des octets chiffres qu'il ne peut pas ouvrir. « Cet +instantane est-il recent, complet, restaurable ? » se demande a qui detient la cle. *La +verification suit la cle.* + +**L'acces de secours est dit plutot que taire.** D-40 donne a l'hebergeur un `sudo` sur +les machines qu'il exploite : exploiter, c'est pouvoir tout lire. La charte l'ecrit, et +enchaine sur sa consequence — c'est la raison d'etre du second temps de la remise, et de +sa DATE. + +**Une ligne sans vis-a-vis est un trou, pas une zone partagee.** C'est la garde de lecture +du tableau : le silence n'a jamais cree de responsabilite. + +### Le PDF LIT la doctrine, il n'en porte pas de copie + +Les chartes remises a Chezlepro et a TechnoLibre sont engendrees depuis le tableau du +depot, entre ses ancres. Deux textes qui diraient deux choses differentes seraient pires +que l'absence de charte : chacun aurait raison de croire le sien. Le generateur REFUSE de +rendre si l'ancre a disparu, plutot que de livrer une charte tronquee. + +Au passage, les deux generateurs partagent desormais `commun.py` — la liste des +locataires et la feuille de style existaient en double. + +### Ce qui n'est pas tranche est nomme + +Le recouvrement de la cle du responsable designe, le changement de responsable, et la +duree de retention avant purge. Une ligne rassurante sans mecanisme derriere vaut moins +qu'un point ouvert ecrit. + ## 2026-09-16 (1) — Remettre un ecosysteme : une procedure, un outil, une garde Livrer se terminait par une phrase : *« tes cles te seront remises separement »*. Ce qui diff --git a/docs/audit/preuve-2026-09-16.md b/docs/audit/preuve-2026-09-16.md index 60a4c12..a36680b 100644 --- a/docs/audit/preuve-2026-09-16.md +++ b/docs/audit/preuve-2026-09-16.md @@ -46,7 +46,7 @@ | P31 | Documentation : tout ce que le depot FAIT est nomme | — | ✅ OK | 68 scripts expliques et atteignables, 128 cibles make documentees, 68 roles avec README. | | P32 | Intrants exiges par les roles : tous fournis | — | ✅ OK | CONFORME : 36 exigence(s) de role, toutes satisfaites (144 cle(s) declaree(s) par l'instance). | | P33 | Aucune collision de port entre roles co-localises | — | ✅ OK | CONFORME : 36 revendication(s) de port, aucune collision entre roles co-localises (35 groupes). | -| P34 | Chaque document declare son lecteur | — | ✅ OK | 47 document(s) declarent leur lecteur (41 genere(s) exempte(s)). | +| P34 | Chaque document declare son lecteur | — | ✅ OK | 48 document(s) declarent leur lecteur (42 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. | diff --git a/docs/carte-set-ops.md b/docs/carte-set-ops.md index b41c6b0..33e7e6b 100644 --- a/docs/carte-set-ops.md +++ b/docs/carte-set-ops.md @@ -25,7 +25,7 @@ README de rôles). Cette page comble ces deux trous. |---|---|---| | rôles | 68 | `roles/*/` | | README de rôles | 68 | `roles/*/README.md` — l'écart avec la ligne au-dessus est la dette | -| documents | 43 | `docs/*.md` | +| documents | 44 | `docs/*.md` | | pièces d'audit | 47 | `docs/audit/*` | | unités de wiki | 27 | `wiki/*.md` | | décisions en vigueur | 85 | lignes `\| **D-nn** \|` de `decisions-architecture.md` | diff --git a/docs/responsabilites-locataire-hebergeur.md b/docs/responsabilites-locataire-hebergeur.md new file mode 100644 index 0000000..3b71b32 --- /dev/null +++ b/docs/responsabilites-locataire-hebergeur.md @@ -0,0 +1,118 @@ +> **Pour qui :** le locataire **et** l'hébergeur — les deux lisent le même texte, et c'est +> le but. Un partage de responsabilités dont chaque partie aurait sa version est un +> désaccord qui attend son incident. + +# Responsabilités du locataire et de l'hébergeur + +## 1. Le principe : une responsabilité est la conséquence d'un pouvoir + +Ce document ne distribue pas des devoirs par bonne volonté. Il les **dérive** : + +> **Qui peut, doit. Qui ne peut pas, ne peut pas être tenu — et personne ne peut se +> décharger sur celui qui ne peut pas.** + +Trois règles en découlent, et elles décident de tout le reste : + +1. **À chaque pouvoir sa responsabilité.** Un pouvoir sans devoir correspondant est une + prise sur autrui ; un devoir sans pouvoir correspondant est un piège. +2. **Une responsabilité sans mécanisme est un vœu.** Chaque ligne du tableau nomme + l'endroit du système qui la rend vraie — un rôle, une garde, une commande. Ce qui n'a + pas de mécanisme est écrit au §5, parmi les points non tranchés, plutôt que promis. +3. **Le silence ne crée pas de responsabilité.** Si une ligne n'a pas de vis-à-vis, ce + n'est pas une zone partagée : c'est un trou, et il se voit. + +## 2. La ligne de partage : trois portées, et aucun pouvoir total + +C'est la structure même du moteur, pas une convention de contrat +(`roles/serveur_ops_tenant/README.md`) : + +``` +calculer plan → inventaire aucune voûte n'importe quel runner +configurer des rôles sur ses machines voûte du TENANT le runner du locataire +matérialiser créer / détruire des VM voûte du SITE le runner de l'hébergeur +``` + +**Aucun runner n'est omnipotent.** Celui de l'hébergeur matérialise le terrain et n'entre +jamais chez un locataire ; celui du locataire configure son écosystème et ne touche jamais +la fabric. Tout ce qui suit découle de cette coupure. + +## 3. Le tableau + + + +| Le pouvoir | Qui le détient | La responsabilité qui en découle | Ce que l'autre ne peut donc pas faire à sa place | +|---|---|---|---| +| **Créer et détruire les machines** (`raser`, `site-raser`, clonage du gabarit) | l'hébergeur | Que les machines existent, démarrent et tiennent ; qu'aucune destruction n'ait lieu sans confirmation explicite ni sans sauvegarde hors du site au préalable | Le locataire ne peut pas garantir l'existence de ses machines, ni se les rendre lui-même | +| **Le réseau, la frontière et le stockage** (SDN, VLAN, OPNsense, Ceph) | l'hébergeur | Que le chemin existe et que la bordure refuse ce qui n'est pas déclaré ; prévenir avant toute coupure planifiée | Le locataire ne peut pas ouvrir un flux vers l'extérieur sans que l'hébergeur l'applique | +| **Déclarer ses flux** (`roles/*/meta/flux.yml`, pare-feu d'hôte) | le locataire | Déclarer ce que ses services ont besoin d'échanger ; ce qui n'est pas déclaré est refusé, et c'est voulu | L'hébergeur ne peut pas deviner un flux applicatif ; il n'ouvrira rien « au cas où » | +| **Configurer les services** (son runner, sa voûte) | le locataire | L'état de ses services : ce qui est déployé, à jour, et conforme à son plan | L'hébergeur ne peut pas configurer un service du locataire : il n'a pas sa voûte | +| **L'annuaire et l'entrée unique** (LDAP, Keycloak) | le locataire | Qui entre, qui sort, et **quand** — créer, désactiver, révoquer sans attendre personne | L'hébergeur ne peut retirer l'accès de personne : mutualiser l'annuaire serait lui confier ses gens | +| **Les habilitations** (appartenance aux groupes, D-66/D-67) | le locataire | Tenir ses groupes à jour. Le moteur amorce **un** accès puis se retire : il ne réconcilie jamais les appartenances | Ni l'hébergeur ni l'outillage ne corrigeront un groupe : un redéploiement n'efface pas le compte créé la veille | +| **Son autorité de certification** (step-ca, D-87) | le locataire | Renouveler ses certificats, et **recharger** les services qui les servent — un certificat renouvelé sur disque reste servi périmé en mémoire | L'hébergeur ne peut pas émettre de certificat au nom du locataire, et c'est délibéré : il pourrait sinon se faire passer pour n'importe lequel de ses services | +| **Ses journaux** (Loki, D-87) | le locataire | Les lire, les conserver, et les fournir s'il demande de l'aide | L'hébergeur ne voit pas les journaux du locataire : il ne peut donc pas diagnostiquer un incident applicatif à sa place | +| **La disponibilité de la fabric** (une VM est-elle debout ?) | l'hébergeur | Constater qu'une machine est tombée et le dire — c'est sa fabric | Le locataire n'a pas de vue sur l'hyperviseur qui porte ses VM | +| **Les métriques d'hébergement** (charge, disque) | l'hébergeur, **avec réserve** | S'en servir pour dimensionner et prévenir, pas pour lire l'activité d'une organisation — elles disent *quand* et *combien* | — (elles ne disent pas *quoi* : le contenu reste hors de portée) | +| **Le dépôt de sauvegarde** (`serveur_backup`, chiffré côté client) | l'hébergeur | Que le dépôt **accepte encore une écriture** : espace, droits, système de fichiers en lecture seule. Sa sonde constate l'endroit, jamais le contenu | L'hébergeur **ne peut pas** juger un instantané : il héberge des octets qu'il ne peut pas ouvrir | +| **La clé de ses sauvegardes** (restic) | le locataire | Juger que ses instantanés sont **récents, complets et restaurables**, et éprouver une restauration. *La vérification suit la clé* | Personne ne peut vérifier une sauvegarde à la place de qui détient la clé — et sa perte les rend définitivement illisibles | +| **Sa voûte et ses secrets** (jamais mutualisée) | le locataire | Garder sa clé hors de l'infrastructure qu'elle ouvre, en double, et faire tourner ses secrets | L'hébergeur ne peut pas recouvrer une clé de voûte perdue : il n'en a aucune copie, par construction | +| **Le courriel** (relais à la bordure) | partagé | L'**enveloppe** transite chez l'hébergeur, qui en répond ; le **contenu** appartient au locataire, qui en répond | L'hébergeur ne lit pas le contenu ; le locataire ne tient pas la réputation de la bordure | +| **La forge du génome** (D-81) | l'hébergeur | Tenir l'autorité du génome disponible : c'est de là qu'un écosystème se reproduit | Le locataire ne dépend pas d'elle pour **vivre** — seulement pour se reconstruire ; il peut en garder son propre miroir | +| **L'accès de secours par `sudo`** (D-40) | l'hébergeur, **tant qu'il exploite** | Le dire plutôt que de le taire : exploiter une machine, c'est pouvoir tout y lire. C'est la raison d'être du second temps de la remise, et de sa date | Le locataire ne peut pas le supprimer sans reprendre lui-même l'exploitation — d'où une **échéance écrite**, pas une confiance indéfinie | +| **La remise des clés** (`make remise-*`, garde **P80**) | l'hébergeur remet, le locataire reçoit | Remettre en deux temps : l'identité le jour de la livraison, la machine à l'échéance — sa clé entre, la nôtre sort, la voûte est re-clétée | Un accès qu'on oublie de rendre ne devient pas légitime en vieillissant : la garde signale tout retard | +| **Nommer le responsable désigné** (D-18, `remise.yml`) | le locataire | Nommer la personne qui engage l'organisation, et la maintenir à jour | L'hébergeur ne peut pas la désigner : ce serait choisir qui a le droit de le quitter | +| **Décider de partir** (migration, émancipation) | le locataire | Mandater, et emporter ce qui est à lui : son plan, ses données, sa voûte, ses domaines | L'hébergeur ne peut ni retenir ni décider à sa place ; la machine **instruit**, l'humain décide | +| **Libérer un partant** (`migration-tenant.md` §6) | l'hébergeur | **Révoquer, pas transmettre** : ses accès tombent, puis rétention convenue, puis purge | Le locataire ne peut pas vérifier lui-même la purge ; elle est un engagement daté, pas une mesure | + + + +## 4. Ce que personne ne peut déléguer + +Trois choses ne se confient à aucune des deux parties, parce que les confier les annule : + +- **La phrase de passe d'un paquet de remise** ne voyage jamais avec le support qu'elle + ouvre. Séparés, ils ne valent rien l'un sans l'autre ; ensemble, ils valent l'écosystème. +- **La seconde copie** d'une clé, dans un autre lieu physique. Un support unique dans un + tiroir unique n'est pas une sauvegarde, c'est le même risque déplacé de quelques mètres. +- **La comparaison d'une empreinte** avant d'installer une autorité de certification. + Installer une AC, c'est lui donner le droit de signer n'importe quel nom : la + comparaison est ce qui distingue sa racine d'une racine interceptée. + +## 5. Ce qui n'est pas tranché — et qui reste donc à convenir + +Nommer un point ouvert vaut mieux qu'une ligne rassurante sans mécanisme derrière. + +- **Le recouvrement de la clé du responsable désigné.** Elle se perd, se compromet, ou la + personne quitte l'organisation. Sans procédure, un locataire devient *inmigrable* : + captif non par contrat mais par accident. Piste retenue : un **contact de secours nommé + en même temps que le responsable**, tant que personne n'est en situation d'urgence. +- **Comment on change de responsable désigné** — acte au moins aussi sensible que la + migration, puisqu'il décide qui pourra la mandater ensuite. +- **La durée de rétention** avant purge chez un hébergeur sortant : elle se convient, elle + ne se dérive pas. +- **La preuve que l'hébergeur ne peut plus entrer.** Le plan déclare la révocation et le + déploiement l'applique ; le vérifier depuis l'extérieur demande d'essayer d'entrer, donc + une machine vivante (`make emancipation-prouver`). + +## 6. Comment chaque ligne se vérifie + +Aucune de ces responsabilités n'est laissée à la parole : + +``` +make prouver le dépôt est-il cohérent avec lui-même (80 preuves, zéro réseau) +make remise-verifier le second temps de la remise est-il fait, ou en retard ? (P80) +make certificats-plan ce que le disque porte contre ce que la mémoire sert +make expositions-plan chaque service publié répond-il, et depuis où +make identite-plan royaume, fédération, politique de mot de passe, comptes +make emancipation-prouver un lien d'hébergement est-il réellement coupé +``` + +`make deployer` **répare**, les devis **constatent** : les confondre fait perdre +l'information au moment où elle sert. + +--- + +*Le partage décrit ici n'est pas une politique commerciale : c'est la forme du système. +Chaque fois qu'il a été possible de donner un pouvoir au locataire, il lui a été donné — +et chaque fois que l'hébergeur a conservé un pouvoir, c'est parce que quelqu'un doit porter +la fabric, et cela s'écrit ici plutôt que de se découvrir le jour d'un incident.*