Set-OPS-Public/docs/pouvoirs-set-ops.md
Daniel Allaire 5bc3bceac1
Some checks failed
verifier / verifier (push) Has been cancelled
documentation : la tournee des 74 documents, parce qu un balayage ne lit pas
La revision a commence par un balayage par motifs — chemins morts, cibles make
absentes, comptes derives. Il a trouve une trentaine d ecarts et rate presque
tout le reste : un motif ne voit que ce qui s exprime en motif.

make hote-planifier en est l exemple. La cible EXISTE, donc le controle passait
au vert. C est une cible depreciee qui refuse et sort en 2, recommandee par
AGENTS.md, et qui contredit la REGLE D OR du meme fichier trois ecrans plus
haut. Il fallait lire pour la voir.

74 documents lus un par un. 66 corriges, 8 exacts.

CE QUI ETAIT FRANCHEMENT FAUX

AGENTS.md, la source d autorite, annoncait la flotte pas encore executee contre
des VM reelles. Elle a ete rasee et remontee depuis zero trois fois.
ecosysteme-chezlepro.md, le document montre a un client, portait la meme
phrase : il se sous-vendait gravement.

courriel-conception.md s ouvrait sur aucun role n est encore ecrit, au-dessus de
son propre paragraphe 1 qui les nomme. autorisation.md se terminait sur rien n
est construit alors qu il rapporte des mesures datees du role en fonctionnement.
hebergeur-exploitation.md disait rien n est fait d un depot qui existe.
filiation-emancipation.md se contredisait a deux ecrans de distance.

DES MODELES DECRITS D APRES UN MONDE ANTERIEUR

Le resolveur : cinq documents decrivaient un Unbound par VM en opt-in, trois le
donnaient en exemple d integration FACULTATIVE — il est universel depuis le
2026-08-24. L adressage de nomenclature-vm.md : reseau unique, VLAN 11-15, VMID
a cinq chiffres. Le nommage SDN de sdn-evpn.md contre le code : c est le wiki
qui avait raison.

CE QUI CASSE AU PREMIER ESSAI

Le nom du gabarit dore etait faux a quatre endroits, dont la procedure qui le
FABRIQUE et le critere R2 de l epreuve d operateur independant.
preparer-un-site-hebergeur.md avertissait qu une VM faite a la main serait
detruite : raser derive du plan, il ne la detruira jamais — le risque est l
inverse. Un mot de passe d essai en clair dans un depot public.

DEUX PREUVES ETENDUES, ET UNE QUI SE TROMPAIT ELLE-MEME

P57 couvre les groupes : elle a signale aussitot 29 groupes annonces au-dessus d
un tableau qui en cite 40. P29 confronte le tableau de authentification.md aux
declarations reelles : 12 annonces, 21 reels.

Et P57 imposait un chiffre faux — 56 preuves alors que le depot en porte 57, la
conditionnelle vivant hors de tout comptage. Un garde-fou qui fait respecter une
erreur ajoute l assurance a l erreur.

CE QUI RESTE, ET QU AUCUNE PREUVE NE TIENT

Deux comptes trouves a la main. Et une lacune reelle : rien ne garde les
meta/acces.yml — ni qu un service web-sso en porte un, ni que le groupe qu il
nomme existe. P29 tient les positions d authentification, personne ne tient les
habilitations.

make prouver : CONFORME, 56 OK, 0 echec, 1 saute. 0 lien mort.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
2026-09-06 16:18:23 -04:00

169 lines
10 KiB
Markdown

# Les pouvoirs de Set-OPS
> **Pour qui :** qui **évalue le moteur** — ce qu'il sait faire, et ce qu'il ne sait pas encore.
> Bilan des capacités du moteur. Établi le 2026-07-02, **revu le 2026-09-06** : la
> frontière ⭐/🔧 avait cessé de dire vrai — deux reconstructions depuis zéro (2026-08-13,
> puis 2026-09-02) ont fait passer côté ⭐ presque tout ce que le §5 annonçait « à
> éprouver ». Fondé sur l'état réel du dépôt (≈65 rôles, ≈60 playbooks, le moteur de plan,
> la GUI). **Le détail rôle par rôle vit dans [`catalogue-services.md`](catalogue-services.md)** ;
> ici on ne garde que le bilan.
>
> Deux niveaux de maturité sont distingués honnêtement :
> - **⭐ Prouvé** — déployé et vérifié de bout en bout sur cluster Proxmox réel.
> - **🔧 Outillé** — le rôle existe et est câblable par le plan, mais n'a pas (encore) été éprouvé
> en déploiement réel. À valider avant de le déclarer « prouvé » (cf. la méthode
> « éprouver l'outil avant le rôle »).
---
## En une phrase
**Set-OPS est un moteur souverain qui transforme un plan déclaratif en écosystème numérique
complet — PKI, identité, DNS, web, courriel — cloné depuis un golden template durci, piloté par
une GUI utilisable sans IA, en multi-tenant, tout en logiciel libre.**
Le cœur d'infrastructure **et** la couche des services applicatifs (SSO, données, forge,
observabilité, supervision, collaboration) sont **prouvés de bout en bout** : la flotte a
été rasée puis remontée d'un seul trait, deux fois, sans échec.
---
## 1. Le moteur — transformer une intention en écosystème
Pouvoir central : **plan déclaratif → écosystème vivant**. On décrit *quoi* (des fichiers
`plan/*.yml`), Set-OPS fait *comment*.
- **`scripts/instancier.py`** — lit `nomenclature / serveurs / applications / bases-donnees.yml`
et **dérive** tout : VMID, IP, groupes d'inventaire, dimensionnement. ⭐
- **Nomenclature fédérée** — le seul champ saisi est l'**`index`** ; supernet, VLAN, IP,
passerelle et **VMID** en dérivent, sans collision possible entre instances. Le VMID est le
**miroir de l'adresse** sur neuf chiffres — `<VLAN><octet d'hôte><rang>`, soit `117602101`
pour `1176` · `021` · `01` : on retrouve la VM depuis son adresse, et l'inverse, sans
registre. **P20** interdit d'écrire un adressage au plan. ⭐
- **Dimensionnement automatique** — chaque rôle porte une `meta/empreinte.yml`
(cœurs / RAM / disque) ; l'outil **somme les empreintes et taille la VM** hôte. ⭐
- **Multi-instance = multi-tenant** — le symlink `instance/` pointe vers un dépôt par écosystème,
avec voûte et identité propres. Lab et prod ne sont qu'un cas particulier. ⭐
- **Cycle de vie complet** (cibles `make`) :
`preparer-modele → instancier → creer-vm → deployer → verifier`. ⭐
## 2. Le plan de contrôle — exploitable sans IA
Impératif fondateur : un sysadmin exploite l'outil **sans IA** ; l'IA n'assiste que le mainteneur.
- **GUI souveraine** (`scripts/inventory_gui.py`, stdlib pure, aucune dépendance) : visualise le
plan, **bouton « Pousser »** (crée la VM pour un serveur / déploie pour une app ou une base),
**sonde de vivacité**, passage auto en « actif », jeton d'authentification. ⭐
- **Voûte au déploiement** — secrets chiffrés par Ansible Vault, **jamais en clair** dans la
GUI, qui n'en montre que les *noms*. **Une voûte, une clé** (2026-08-28) : chaque dépôt a la
sienne, et le `Makefile` les rassemble tout seul (`scripts/voutes.py`), sans rien exporter
ni rendre l'exécution interactive. ⭐
- **Validation intégrée** — `syntax-check`, `ansible-lint` (profil *production*), `verifier`. ⭐
## 3. Le socle — un golden template durci
**⭐ Prouvé** : clone + application du socle de bout en bout sur le cluster Proxmox.
- **Base** : `common_packages`, `chrony`, `qemu_guest_agent`, `cloud_init`, `motd`,
`hosts_statiques` (plancher de résolution, indépendant du DNS), `sudo_ansible`,
`template_cleanup`.
- **SSH** : `ssh_baseline` puis `ssh_hardening` (bascule mot de passe → clé, seulement après
validation de l'accès par clé).
- **Durcissement** — les **dix** rôles que compose le groupe `serveur_durci` :
`hardening_packages`, `sysctl_hardening`, `core_dumps`, `unattended_upgrades`, `apparmor`,
`auditd`, `fail2ban_ssh`, `journald`, `ssh_hardening`,
`nftables_baseline` (**éteint dans le rôle, armé par le plan** : `hotes_actifs` le met à
`true`, le gabarit doré le laisse à `false` — le pare-feu n'est pas une propriété du rôle,
c'est une décision de l'instance). Le jeu de règles n'est pas écrit à la main : il est
**dérivé du registre des flux** (`meta/flux.yml` → `scripts/resoudre_flux.py`).
- **Proxmox** : clonage depuis le golden template + redimensionnement disque (grow-only).
> Séparation nette : **Proxmox + cloud-init** donnent l'identité initiale de la VM ;
> **Set-OPS + Ansible** font la configuration réelle du serveur.
## 4. Les piliers d'infrastructure — tous prouvés ⭐
| Domaine | Rôle(s) | Preuve |
|---|---|---|
| **PKI** | `serveur_step_ca` + `client_pki` | AC interne + **mTLS avec SAN**, empreinte racine câblée |
| **Identité** | `serveur_openldap` | **LDAPS** réel sur certificat step_ca |
| **DNS interne** | `serveur_powerdns` | résolution interne |
| **Reverse-proxy** | `serveur_nginx` | frontal web |
| **Courriel (Étape A)** | `serveur_dovecot` + `serveur_postfix` + `serveur_rspamd` | **flux complet** : SMTP → validation LDAP → LMTP → boîte → **lecture IMAP** + antispam + **signature DKIM** |
La messagerie interne est un service souverain complet : réception SMTP, validation des boîtes
par annuaire LDAP, remise LMTP réseau chiffrée step_ca vers le stockage, accès IMAP authentifié
LDAP, filtrage antispam et signature DKIM en milter. Topologie **MTA dédié en périphérie /
boîtes à l'intérieur** (défense en profondeur).
## 5. Les services applicatifs — prouvés depuis ⭐
Ce paragraphe annonçait, jusqu'au 2026-09-06, des rôles « construits mais à éprouver ».
Ils l'ont été : **la reconstruction depuis zéro les a tous repris sur machine nue**
(2026-08-13, puis 15/15 et 14/14 hôtes le 2026-09-02, `make valider` à 0 échec).
- **SSO web** : `serveur_keycloak` — OpenLDAP source de vérité, fédération LDAP automatisée,
courriel en bind LDAP direct. ⭐
- **Passerelle SSO** : `serveur_oauth2_proxy` — met au SSO une application sans OIDC natif
(éprouvé devant Icinga Web 2). ⭐
- **Données** : `serveur_postgresql`, `serveur_redis` — bases et comptes dérivés du registre,
TLS `verify-full` de bout en bout. ⭐
- **Forge logicielle** : `serveur_forgejo` — Git + PostgreSQL + SSO OIDC. ⭐
- **Observabilité** : `serveur_prometheus`, `serveur_grafana`, `serveur_loki`, avec les clients
`client_metrique` et `client_journal`. ⭐
- **Supervision** : `serveur_icinga`, `serveur_icingaweb2` — Icinga 2 + IcingaDB + Web 2 + BPM.
**Sans agent sur les hôtes** : contrôles actifs depuis le cœur, résultats passifs poussés par
l'API. ⭐
- **Sauvegardes** : `serveur_backup`, `client_backup` — restic hors-nœud, chaque nœud vérifiant
son **propre dépôt distant**, restauration éprouvée. ⭐
- **Plateforme webapp** : `serveur_web_frontal`, `serveur_web_dorsal` — statique et natif
(venv + systemd + nginx), zéro conteneur. ⭐
- **Intégrations transverses** : `client_pki`, `client_backup`, `client_smtp`, `client_metrique`,
`client_journal`, `client_resolveur`, `client_artefacts`. ⭐
Reste **🔧 outillé** — déployé, mais dont l'*usage* n'est pas consigné comme preuve :
- **Collaboration** : `serveur_nextcloud`, `serveur_collabora` (natif, plus de conteneur). Base
et client OIDC dérivés du plan, posés par la reconstruction ; le dépôt d'un fichier et
l'édition partagée à deux, eux, n'ont pas été consignés. 🔧
> Deux noms ont été retirés de ce paragraphe parce qu'ils n'ont jamais existé :
> `client_supervision` (la supervision est sans agent — cf. `catalogue-services.md`) et les
> « méta-rôles d'agrégation » `identity` / `storage`. La conformité passe par
> `playbooks/groupes/`, un playbook par groupe ; les répertoires `playbooks/applications/`,
> `database/`, `web/`, `monitoring/`, `backup/` ne contiennent qu'un README d'espace réservé.
## 6. Les patrons d'ingénierie — la valeur invisible ⭐
- **Pont de certificat** step_ca → service, avec **resynchronisation au renouvellement** (unité
systemd `.path`). Réutilisé par openldap, dovecot, postfix.
- **Ordonnancement socle-first** — le plancher `/etc/hosts` est posé avant les clients qui en
dépendent (ex. `client_pki` sur un nœud neuf).
- **Sûreté en check-mode** — `when: not ansible_check_mode` sur les tâches de service, pour un
dry-run fiable même quand le service n'est pas encore installé.
- **Idempotence** — `changed=0` au redéploiement (prouvé).
- **Méthode « éprouver l'outil avant le rôle »** — inspecter empiriquement le vrai binaire avant
d'écrire le rôle qui l'enveloppe. A évité les bugs de premier déploiement (rspamd : zéro bug ;
pivot Stalwart → Postfix/Dovecot/rspamd décidé sur preuve).
- **Machine d'épreuve jetable** (`make cloner-vm`) — l'**instrument** de la méthode ci-dessus :
une Debian issue du gabarit doré, sur le réseau choisi, en deux minutes, **hors du plan**. Le
moteur ne la connaît pas — donc aucune politique, aucun certificat, aucune sauvegarde, et
`make raser` ne la détruira jamais. À détruire à la main. Voir `vm-lifecycle.md` §4bis.
---
## Prochaines frontières
- **Consigner l'usage** de la collaboration (dépôt de fichier, édition partagée) — le seul
🔧 qui reste.
- **Courriel Étape B** (public) : DNS public (MX, SPF, **DKIM** — clé `setops._domainkey` déjà
générée, DMARC), MX externe et réputation, PTR / FCrDNS.
- **Les équipements de l'hébergeur** — hyperviseurs, commutateurs, frontière : ni inventaire,
ni sauvegarde de configuration, ni supervision. Les *VM* du site en ont depuis le 2026-09-02,
les *équipements* non (cf. `hebergeur-exploitation.md`).
- **Seuils d'adoption** d'outils tiers (NetBox, AWX) plutôt que de réimplémenter le plan de
contrôle maison, qui reste volontairement gelé.
> Principe fondateur : **tout est libre**. L'univers numérique (Alliance Boréale / Chezlepro /
> Set-OPS) se construit exclusivement avec du logiciel libre.