Constat de l'exploitant : « ca fait beaucoup de trucs incoherents qu'on debusque ensemble ». Il y a une raison mesurable — les 30 preuves de prouver.py sont STATIQUES (0 appel reseau, 0 ssh, 0 ansible). Elles montrent que le depot est coherent avec lui-meme ; aucune ne demande au systeme deploye s'il ressemble a ce que le depot annonce. Les quatre defauts du jour vivaient tous la. La classe statique est presque epuisee : recensement des motifs « cree mais ne reconcilie jamais » -> amorcage_acces (delibere, D-67), serveur_openldap (corrige le matin), et un seul reste reel (rbac-oidc.yml). Une preuve statique de plus aurait rapporte une ligne. Le patron devis/applicateur (D-23/D-24) existait deja pour les quatre pare-feu, jamais pour les services. make identite-plan l'y porte : - playbooks/maintenance/devis-identite.yml RELEVE le declare et le reel - scripts/devis_identite.py COMPARE (le raisonnement n'a rien a faire en Jinja ; le depot a deja cette forme pour les devis reseau) - le declare n'est jamais recopie : defauts du role + resolveurs. Un devis qui redeclare ce qu'il verifie ne verifie rien. Verifie dans les deux sens : CONFORME sur le systeme reel ; sur un releve ou les quatre defauts du jour sont rejoues plus deux regressions, 6 divergences listees et code de sortie 1. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
52 lines
2.3 KiB
Markdown
52 lines
2.3 KiB
Markdown
# Le devis d'identité : ce qui tourne correspond-il à ce qui est déclaré ?
|
|
|
|
> **Instrument ajouté le 2026-08-08**, après une série de défauts qu'aucun test n'avait
|
|
> signalés. Lecture seule — il ne modifie rien.
|
|
|
|
```
|
|
make identite-plan
|
|
```
|
|
|
|
## Le trou qu'il comble
|
|
|
|
`scripts/prouver.py` porte 30 preuves. Elles sont toutes **statiques** : elles lisent le
|
|
dépôt. Zéro appel réseau, zéro SSH, zéro `ansible`. Elles établissent que le dépôt est
|
|
cohérent **avec lui-même** — que les handlers existent, que les intrants ont un
|
|
propriétaire, que rien n'est codé en dur.
|
|
|
|
Aucune ne demande au système déployé s'il ressemble à ce que le dépôt annonce.
|
|
|
|
Les quatre défauts du 2026-08-08 vivaient tous dans cet angle :
|
|
|
|
| Défaut | Le dépôt disait | La machine portait |
|
|
|---|---|---|
|
|
| politique de mot de passe | `length(12)…` | *aucune* — `abcd` accepté |
|
|
| entrée `ppolicy` figée | `pwdMustChange: TRUE` | `FALSE` |
|
|
| fédération en écriture | comptes écrits dans LDAP | `syncRegistrations` absent |
|
|
| prénom | `givenName` | `cn` (le nom complet) |
|
|
|
|
Chacun a été trouvé en relisant après avoir écrit. Aucun n'a été signalé.
|
|
|
|
## Ce qu'il vérifie
|
|
|
|
Le playbook `playbooks/maintenance/devis-identite.yml` **relève** deux dictionnaires — le
|
|
déclaré et le réel — et les dépose en JSON. `scripts/devis_identite.py` **compare**. La
|
|
séparation est délibérée : la comparaison en Jinja est illisible, et le dépôt a déjà cette
|
|
forme pour les devis réseau (Python raisonne, Ansible relève).
|
|
|
|
- **realm** — politique de mot de passe, anti-force-brute, « mot de passe oublié », relais SMTP
|
|
- **fédération** — mode d'écriture et les six clés de durcissement
|
|
- **mappeurs** — chaque attribut LDAP projeté
|
|
- **annuaire** — l'entrée `pwdPolicy`, attribut par attribut
|
|
- **comptes** — ceux qui n'ont pas d'adresse, pour qui « mot de passe oublié » ne mène nulle part
|
|
|
|
Le déclaré n'est jamais recopié ici : le playbook charge les défauts du rôle et appelle les
|
|
résolveurs. **Un devis qui redéclare ce qu'il vérifie ne vérifie rien.**
|
|
|
|
## Ce qu'il ne fait pas
|
|
|
|
Il ne corrige pas — c'est `make deployer` qui réconcilie. Il répond à l'autre question, et
|
|
sort en code 1 s'il y a un écart.
|
|
|
|
Il ne couvre que l'identité. Les autres services attendent le même traitement ; le patron
|
|
est là pour être repris.
|