Set-OPS-Public/docs/remise-au-client.md

134 lines
7.3 KiB
Markdown
Raw Normal View History

> **Pour qui :** l'hébergeur, le jour où il remet un écosystème à celui qui en est le
> propriétaire. À lire **avant** de fabriquer le paquet, pas pendant.
# Remettre un écosystème à son propriétaire
## 1. Le problème que ce document ferme
La livraison se terminait par une phrase : *« tes clés te seront remises séparément »*.
Ce qui se passait ensuite n'était écrit nulle part — ni ce qu'on remet, ni dans quel
ordre, ni **ce qu'on garde**. Le geste qui donne le contrôle d'une organisation était le
seul geste lourd du dépôt sans procédure, sans outil et sans garde.
Et il portait une faute silencieuse : les clés vivent toutes dans le même dossier
(`~/.config/setops-vault-*`). Remettre « les clés » d'un revers de main, c'est remettre
celles du site et celles des autres locataires. Personne ne s'en apercevrait — ni celui
qui donne, ni celui qui reçoit.
## 2. Les deux temps, et pourquoi ils ne se confondent pas
> **Temps 1 — l'identité.** Le client reçoit de quoi gouverner **ses gens** tout de suite.
> **Temps 2 — la machine.** À une date convenue, il reçoit le pouvoir sur **ses serveurs**,
> et l'hébergeur le perd.
Ce découpage n'est pas une précaution d'hébergeur : c'est ce qui rend les deux gestes
honnêtes.
| | Temps 1 | Temps 2 |
|---|---|---|
| Ce qui passe | la clé de **sa** voûte, sa voûte chiffrée, la racine de **son** AC | sa clé SSH entre, celle de l'hébergeur sort, la voûte change de mot de passe, les secrets tournent |
| Ce que le client peut | créer, retirer, habiliter des personnes — sans nous | tout, y compris se passer de nous |
| Ce que l'hébergeur garde | l'accès **machine**, parce qu'il exploite encore | rien qui ne lui soit redonné |
| Quand | le jour de la livraison | à l'échéance inscrite (30 jours par défaut) |
Le second temps applique à une livraison ce que
[`migration-tenant.md`](migration-tenant.md) §6 étape 8 applique déjà à un départ :
**révoquer, pas transmettre**. Sans lui, l'hébergeur garde **à vie** l'accès aux secrets
d'un client qui se croit chez lui — et aucune procédure ne rattrape ça après coup.
## 3. Temps 1 — le paquet
```
make ca-racine # la racine de SON AC, et son empreinte
make ca-empreinte # la même, lue SUR l'AC : le témoin à comparer
make remise-recenser # ce qui partirait, sans rien écrire
make remise-paquet VERS=/media/…/CLE
make remise-inscrire RECU_PAR="Prénom Nom" COURRIEL="…"
```
**Lance `remise-paquet` toi-même**, dans ton terminal : `gpg` demande une phrase de passe,
et elle ne doit passer ni par un journal, ni par le contexte d'un assistant.
L'outil **refuse** quatre choses, et chacune ferme une faute réelle :
- **une destination dans l'infrastructure** — le dépôt de sauvegarde est chiffré par un
mot de passe qui vit dans la voûte que ce paquet ouvre ; l'y déposer ferait un coffre
dont la clé est à l'intérieur ;
- **écraser un paquet existant** — c'est peut-être celui qu'on vient de vérifier ;
- **partir sans la racine de l'AC** — sans elle, le client apprend à cliquer sur
« continuer quand même », ce qui vaut pire que pas de TLS du tout ;
- **un paquet qu'il n'arrive pas à rouvrir** — il est alors supprimé. Un paquet de remise
qu'on ne sait pas rouvrir donne le sentiment d'avoir remis.
Il n'emporte **que l'écosystème monté** : la clé du site et celles des autres locataires
vivent dans le même dossier, et c'est une seule ligne de code qui les en écarte
(`remise.py:_cle_de_voute`). Il n'affiche jamais le contenu d'un secret — noms, tailles,
empreintes SHA256, rien d'autre.
**Deux gestes restent, et ils n'ont pas d'outil :** transmettre la phrase de passe par un
**autre canal** que le support, et transmettre l'empreinte de l'AC de la même façon.
Séparés, le support et la phrase ne valent rien l'un sans l'autre.
## 4. Temps 2 — le re-clé
**L'ordre ne se permute pas.** Retirer sa propre clé avant que celle du client soit posée
ferme l'écosystème à tout le monde, et le seul moyen de le réparer est justement celui
qu'on vient de retirer.
1. **La clé du client entre** — son entrée dans `ssh_baseline_cles_admin`, `etat: present`.
2. **Celle de l'hébergeur sort** — `etat: absent` sur son entrée. On ne la supprime pas du
plan : une entrée retirée n'est plus appliquée, donc la clé **resterait** sur les
machines. `absent` la fait *retirer*.
3. **Déployer**, pour que le plan devienne l'état des machines.
4. **La voûte change de mot de passe** — `ansible-vault rekey`, la nouvelle clé étant
choisie par le client. Le mot de passe de l'hébergeur ne se *communique* pas.
5. **Les secrets applicatifs tournent** — `voute.py saisir --remplacer`, sans écho, puis
déploiement.
6. **Estampiller** : `make remise-recleer CONFIRMER=true`.
`remise-recleer` **mesure avant d'estampiller**, et refuse si l'un des trois faits manque :
une clé présente, une clé révoquée, une clé de voûte différente de celle remise au temps 1.
Un registre qui dirait « révoqué » pendant que le plan garde la clé de l'hébergeur serait
le seul mensonge que ce fichier puisse porter sans que personne ne s'en aperçoive — parce
qu'il flatte tout le monde.
## 5. Le registre — `remise.yml` chez le locataire
Généré, versionné, dans le dépôt du locataire, à côté de `parente.yml` : *de qui il
descend* d'un côté, *à qui il appartient* de l'autre.
Il porte l'organisation, la date du temps 1, qui a remis, **qui a reçu**, les empreintes
SHA256 des pièces remises, l'échéance du temps 2 et son constat. **Aucun secret**, par
construction : une empreinte prouve qu'on a remis *ce fichier-là* sans rien révéler de son
contenu.
> **Il déclare enfin le responsable désigné.** D-18 décide depuis longtemps que chaque
> locataire en a un ; `migration-tenant.md` §9 laissait ouverte la question « **où est-il
> déclaré ?** ». La réponse est ici, et elle est la seule qui ne devine rien : c'est la
> personne qui **reçoit**.
## 6. La garde
**P80** lit les registres de tous les écosystèmes et refuse trois états :
- un registre incomplet — remis à personne, ou sans échéance ;
- un temps 2 **échu** et non fait : l'hébergeur garde l'accès machine d'un client qui se
croit chez lui, et le silence le laisserait devenir un état de fait ;
- un temps 2 déclaré fait pendant que le plan ne révoque **aucune** clé.
Elle ne juge **pas** un écosystème sans registre : tous ne sont pas remis, et beaucoup ne
le seront jamais — le lab, l'écosystème de l'hébergeur lui-même.
## 7. Ce que cette procédure ne couvre pas
- **Ce que le client fait de son paquet.** Une clé remise sur un support qu'il laisse
dans un tiroir déverrouillé n'est plus notre affaire, et le LISEZ-MOI le lui dit.
- **La rotation des secrets applicatifs**, qui reste un geste humain : `voute.py` ne
génère pas les valeurs, il les reçoit sans écho. Un script qui engendrerait et écrirait
tout seul connaîtrait ce qu'il écrit.
- **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. C'est le même partage que partout ici : le dépôt prouve ce
qu'il a **demandé**, `make emancipation-prouver` prouve ce qui **tient**.