Set-OPS-Public/scripts
Daniel Allaire b4e3520561 annuaire : un compte de service par consommateur, et la porte se ferme
Keycloak, Dovecot, Postfix et Icinga Web 2 se liaient TOUS avec cn=admin, le compte
d administration de la base. C est le rootDN : slapd lui fait contourner toutes les
ACL. Un seul secret, quatre services, tous les droits sur l arbre — pour ce qui est,
trois fois sur quatre, une simple lecture.

Et les droits livres par Debian etaient intacts : `to * by * read`. Sur ldap://, sans
s authentifier, une machine du reseau enumerait tous les comptes et toutes les
adresses. Des comptes a droits mesures n auraient rien valu tant que cette ligne
restait : on aurait ferme la porte en laissant la fenetre.

L indice etait deja dans le depot. `validatePasswordPolicy` existe parce que slapd
n applique pas ses controles de qualite au rootDN : la consequence etait compensee,
la cause intacte.

- ou=services, un compte par consommateur, secret propre en voute
- sept regles d acces posees EN ENTIER (state: exact) : l ordre est la regle, et
  inserer c est parier sur ce que le paquet aura mis avant nous
- amorcage_acces garde le compte d administration, NOMME comme l exception : il ne
  consomme pas l annuaire, il le provisionne depuis la socket locale
- la sonde passe de -x a -Y EXTERNAL : elle lisait en anonyme et aurait annonce un
  annuaire VIDE sur un annuaire parfaitement sain
- la rotation du compte d administration devient possible (elle n etait posee qu a
  l installation, par debconf : la voute et slapd divergeaient en silence)

Quatre marches payees en chemin :
1. un cinquieme appelant oublie, dont l echec etait masque par no_log — la garde
   refuse desormais SANS no_log : elle nomme la cle absente, jamais son contenu
2. la federation Keycloak ne reecrivait son bindDn que si l URL ou le mode changeaient
   — nouveau secret, ancien nom, error code 49
3. la rotation placee APRES les taches qui se lient en administrateur
4. ansible-vault et son tube : sortie non bloquante = echec silencieux, la voute
   paraissait tournee et etait identique a l octet

P72 exige que tout role incluant resoudre_annuaire NOMME son compte, et qu aucun sauf
amorcage_acces ne nomme admin. Eprouvee dans les deux sens.

Verifie sur l infrastructure : chaque compte lit ce qu il doit, aucun ne voit les
autres, la lecture anonyme rend 0 entree, et les quatre services repondent (doveadm
user, postmap -q, decouverte OIDC 200, portier SSO 200).

vault_openldap_admin et vault_ldap_bind_postfix renouveles : les deux avaient transite
en clair par une session d exploitation. Les anciennes valeurs rendent Invalid
credentials (49).

make prouver : 71 OK, 0 echec, 1 saute. ansible-lint : 0 failure, profil production.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
2026-09-13 13:36:38 -04:00
..
tests GUI : les six registres ont un formulaire genere, et la sauvegarde aussi 2026-09-08 18:26:33 -04:00
applications.py plan : l ecriture des registres devient atomique — tout, ou rien 2026-09-08 14:57:57 -04:00
appliquer_opnsense.py supervision du site, et la panne qui dormait dans un mot 2026-09-02 17:34:01 -04:00
appliquer_proxmox_fw.py flux : l interne refuse a voix haute, la bordure se tait (P53) 2026-08-28 16:43:22 -04:00
appliquer_sdn.py frontiere : lire ses reglages a la racine du depot de site 2026-08-23 00:47:32 -04:00
attendre_materialisation.py creer-vm : prouver la materialisation sans entrer chez le tenant 2026-08-27 22:48:49 -04:00
bases_donnees.py plan : l ecriture des registres devient atomique — tout, ou rien 2026-09-08 14:57:57 -04:00
cacher_paquets.py paquets tiers : passer par le cache du controleur, plus par Internet 2026-09-05 08:22:14 -04:00
config_proxmox.py plan : l ecriture des registres devient atomique — tout, ou rien 2026-09-08 14:57:57 -04:00
couverture_gui.py GUI : le formulaire des bases est GENERE depuis le schema 2026-09-08 15:30:08 -04:00
devis_certificats.py resolution d'instance : une seule, partagee — au lieu de neuf copies 2026-08-22 14:19:55 -04:00
devis_courriel.py resolution d'instance : une seule, partagee — au lieu de neuf copies 2026-08-22 14:19:55 -04:00
devis_expositions.py resolution d'instance : une seule, partagee — au lieu de neuf copies 2026-08-22 14:19:55 -04:00
devis_frontiere.py resolution d'instance : une seule, partagee — au lieu de neuf copies 2026-08-22 14:19:55 -04:00
devis_identite.py resolution d'instance : une seule, partagee — au lieu de neuf copies 2026-08-22 14:19:55 -04:00
devis_mtu.py resolution d'instance : une seule, partagee — au lieu de neuf copies 2026-08-22 14:19:55 -04:00
devis_opnsense.py le site reconstruit depuis zero : 7/7, 0 echec, et seize corrections 2026-09-12 19:08:31 -04:00
devis_placement.py resolution d'instance : une seule, partagee — au lieu de neuf copies 2026-08-22 14:19:55 -04:00
devis_postgresql.py resolution d'instance : une seule, partagee — au lieu de neuf copies 2026-08-22 14:19:55 -04:00
devis_proxmox_fw.py flux : l interne refuse a voix haute, la bordure se tait (P53) 2026-08-28 16:43:22 -04:00
devis_proxmox_pools.py pools : le genome ne nait plus chez un locataire 2026-09-13 04:12:27 -04:00
devis_reseau.py devis reseau : un segment non etiquete n'appartient a aucune fabric de switch 2026-08-25 09:51:57 -04:00
devis_sdn.py sdn : le puits avalait le plan d administration — une route, et le chemin existe 2026-08-28 17:46:40 -04:00
devis_underlay.py underlay : la frontiere entre les deux mondes, et l'instrument qui la mesure 2026-08-22 16:31:35 -04:00
devis_versions.py devis : make versions-mesurer — l'ecart avec l'amont devient lisible 2026-08-10 23:02:16 -04:00
domaines.py resolution d'instance : une seule, partagee — au lieu de neuf copies 2026-08-22 14:19:55 -04:00
exporter_cles.py pools nommes comme les depots, et les cles sortent du poste 2026-09-12 21:37:28 -04:00
expositions_etat.py expositions-etat : le certificat SERVI, pas celui du disque 2026-09-11 10:21:19 -04:00
forge_amorcer.py trois reconstructions : trouver, verifier, prouver — 37 min 24 au tour 3 2026-09-12 20:55:59 -04:00
gabarit_etat.py D-86 mis a l epreuve : Chezlepro rasee et refaite depuis zero 2026-09-10 13:06:45 -04:00
genome.py plan : l ecriture des registres devient atomique — tout, ou rien 2026-09-08 14:57:57 -04:00
genome_colis.py genome : la forge du SITE fait autorite (D-81), et make genome-etat le verifie 2026-08-26 09:17:24 -04:00
instance_creer.py Créer une instance depuis un modèle (CLI + GUI) 2026-07-23 14:13:36 -04:00
instances.py un site prend son propre index, et la garde les compte enfin 2026-09-12 14:31:51 -04:00
instancier.py l heure vient de la frontiere : la derniere dependance vivante tombe 2026-09-11 12:08:13 -04:00
inventory_gui.py GUI : les six registres ont un formulaire genere, et la sauvegarde aussi 2026-09-08 18:26:33 -04:00
inventory_host.py plan : l ecriture des registres devient atomique — tout, ou rien 2026-09-08 14:57:57 -04:00
inventory_rules.py pools nommes comme les depots, et les cles sortent du poste 2026-09-12 21:37:28 -04:00
model_creer.py gabarit : modeleChezlepro -> modeleSetOPS, et une porte pour l'hebergeur 2026-08-12 14:36:44 -04:00
modeles.py modèles : l'underlay devient modélisable, et P17 le valide 2026-08-02 17:11:18 -04:00
orchestrer.py Mise en conformité prouvable : registre d'affirmations + make prouver 2026-07-20 19:53:18 -04:00
plan_recette.py documentation : la tournee des 74 documents, parce qu un balayage ne lit pas 2026-09-06 16:18:23 -04:00
prouver.py annuaire : un compte de service par consommateur, et la porte se ferme 2026-09-13 13:36:38 -04:00
proxmox_api.py voutes : le monde physique a la sienne, les tenants n'en portent plus les cles 2026-08-22 17:13:48 -04:00
raser.py resolution d'instance : une seule, partagee — au lieu de neuf copies 2026-08-22 14:19:55 -04:00
resoudre_flux.py l heure vient de la frontiere : la derniere dependance vivante tombe 2026-09-11 12:08:13 -04:00
restaurer_cles.py cles : la cle USB se suffit a elle-meme, et la restauration est prouvee 2026-09-05 13:33:31 -04:00
routes_fabric_etat.py le site surveille enfin sa fabric 2026-09-10 18:50:43 -04:00
schema_plan.py GUI : les six registres ont un formulaire genere, et la sauvegarde aussi 2026-09-08 18:26:33 -04:00
serveurs.py plan : l ecriture des registres devient atomique — tout, ou rien 2026-09-08 14:57:57 -04:00
site_inventaire.py depot de binaires : le site tient ce que les runners allaient chercher 2026-09-12 23:45:00 -04:00
site_machines.py site : un SITE a bien un plan — et huit defauts que lui seul pouvait reveler 2026-08-25 13:15:34 -04:00
site_raser.py le site prend l index 37, et la capacite de le raser existe enfin 2026-09-12 16:32:06 -04:00
socle_amorcage.py resolution d'instance : une seule, partagee — au lieu de neuf copies 2026-08-22 14:19:55 -04:00
sonde_tcp.py frontiere : etanche — CONFORME sur 56 lignes, dans les deux sens 2026-08-09 21:33:04 -04:00
sonder.py sonder : rapporter ce qui distingue, au lieu d un echec 2026-08-28 17:02:20 -04:00
underlay.py D-86 mis a l epreuve : Chezlepro rasee et refaite depuis zero 2026-09-10 13:06:45 -04:00
verifier_gui.py GUI : les six registres ont un formulaire genere, et la sauvegarde aussi 2026-09-08 18:26:33 -04:00
verifier_intrants.py resolution d'instance : une seule, partagee — au lieu de neuf copies 2026-08-22 14:19:55 -04:00
verifier_ports.py resolution d'instance : une seule, partagee — au lieu de neuf copies 2026-08-22 14:19:55 -04:00
verifier_signature.py forgejo : epingle 16.0.2, et le verificateur accepte la cle PRIMAIRE 2026-08-11 01:04:16 -04:00
voute.py collabora : en natif, la derniere exception conteneurisee tombe 2026-08-24 16:23:35 -04:00
voutes.py voutes : une cle absente n est pas une faute — elle est souvent la bonne reponse 2026-08-28 18:41:21 -04:00