2026-06-30 15:42:12 -04:00
|
|
|
---
|
|
|
|
|
# Voûte UNIQUE de l'instance — TOUS les secrets, un seul fichier, un seul mot de passe.
|
|
|
|
|
#
|
Mise en conformité prouvable : registre d'affirmations + make prouver
Le dépôt fait / explique / prouve ce qu'il affirme, vérifiable en une commande.
- Phase 1 : docs/audit/affirmations.md — 54 affirmations publiques tracées vers
une commande de preuve et un statut (✅/🟡/❌/⚪).
- Phase 2 : CLAUDE.md réduit à un pointeur mince ; contradiction SSH levée (le
code applique déjà PasswordAuthentication no + AuthenticationMethods publickey,
conforme à AGENTS.md) ; section AGENTS « Codex » → « agents IA ».
- Phase 3 : parcours démarrage réparé (QUICKSTART renvoyait à un modèle absent,
chemins de voûte faux, commandes make périmées) ; make verifier vert
(ansible-lint 33 → 0 : site.yml généré nommé, pipefail, name[template]) ;
voûte Proxmox unifiée lue par le clonage (all/vault.yml).
- Phase 4 : make prouver → docs/audit/preuve-<date>.md, harnais rejouable qui
rappelle l'outillage existant (aucune validation réimplémentée).
- Phase 5 : parcours QUICKSTART prouvé hors-ligne sur le socle ; modèle socle
rendu valide (autorite interne → auto-heberge) ; split-brain d'inventaire
corrigé (repli sur le répertoire existant, pas principal/).
make prouver : 15 OK, 0 échec, 1 sautée (voûte). ansible-lint : 0 failure.
Écarts découverts en cours de traitement (AFF-097..100) : tous résolus.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 19:53:18 -04:00
|
|
|
# Installation (un seul inventaire par instance : « production » dans le modèle socle) :
|
|
|
|
|
# 1. Copier ce gabarit vers la voûte de l'instance :
|
|
|
|
|
# cp exemples/vault.exemple.yml instance/inventories/production/group_vars/all/vault.yml
|
2026-06-30 15:42:12 -04:00
|
|
|
# 2. Renseigner les valeurs, puis chiffrer :
|
Mise en conformité prouvable : registre d'affirmations + make prouver
Le dépôt fait / explique / prouve ce qu'il affirme, vérifiable en une commande.
- Phase 1 : docs/audit/affirmations.md — 54 affirmations publiques tracées vers
une commande de preuve et un statut (✅/🟡/❌/⚪).
- Phase 2 : CLAUDE.md réduit à un pointeur mince ; contradiction SSH levée (le
code applique déjà PasswordAuthentication no + AuthenticationMethods publickey,
conforme à AGENTS.md) ; section AGENTS « Codex » → « agents IA ».
- Phase 3 : parcours démarrage réparé (QUICKSTART renvoyait à un modèle absent,
chemins de voûte faux, commandes make périmées) ; make verifier vert
(ansible-lint 33 → 0 : site.yml généré nommé, pipefail, name[template]) ;
voûte Proxmox unifiée lue par le clonage (all/vault.yml).
- Phase 4 : make prouver → docs/audit/preuve-<date>.md, harnais rejouable qui
rappelle l'outillage existant (aucune validation réimplémentée).
- Phase 5 : parcours QUICKSTART prouvé hors-ligne sur le socle ; modèle socle
rendu valide (autorite interne → auto-heberge) ; split-brain d'inventaire
corrigé (repli sur le répertoire existant, pas principal/).
make prouver : 15 OK, 0 échec, 1 sautée (voûte). ansible-lint : 0 failure.
Écarts découverts en cours de traitement (AFF-097..100) : tous résolus.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 19:53:18 -04:00
|
|
|
# ansible-vault encrypt instance/inventories/production/group_vars/all/vault.yml
|
2026-06-30 15:42:12 -04:00
|
|
|
# 3. Éditer ensuite sans jamais déchiffrer sur disque :
|
Mise en conformité prouvable : registre d'affirmations + make prouver
Le dépôt fait / explique / prouve ce qu'il affirme, vérifiable en une commande.
- Phase 1 : docs/audit/affirmations.md — 54 affirmations publiques tracées vers
une commande de preuve et un statut (✅/🟡/❌/⚪).
- Phase 2 : CLAUDE.md réduit à un pointeur mince ; contradiction SSH levée (le
code applique déjà PasswordAuthentication no + AuthenticationMethods publickey,
conforme à AGENTS.md) ; section AGENTS « Codex » → « agents IA ».
- Phase 3 : parcours démarrage réparé (QUICKSTART renvoyait à un modèle absent,
chemins de voûte faux, commandes make périmées) ; make verifier vert
(ansible-lint 33 → 0 : site.yml généré nommé, pipefail, name[template]) ;
voûte Proxmox unifiée lue par le clonage (all/vault.yml).
- Phase 4 : make prouver → docs/audit/preuve-<date>.md, harnais rejouable qui
rappelle l'outillage existant (aucune validation réimplémentée).
- Phase 5 : parcours QUICKSTART prouvé hors-ligne sur le socle ; modèle socle
rendu valide (autorite interne → auto-heberge) ; split-brain d'inventaire
corrigé (repli sur le répertoire existant, pas principal/).
make prouver : 15 OK, 0 échec, 1 sautée (voûte). ansible-lint : 0 failure.
Écarts découverts en cours de traitement (AFF-097..100) : tous résolus.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 19:53:18 -04:00
|
|
|
# ansible-vault edit instance/inventories/production/group_vars/all/vault.yml
|
2026-06-30 15:42:12 -04:00
|
|
|
#
|
|
|
|
|
# Ne JAMAIS versionner le fichier vault.yml (couvert par .gitignore).
|
|
|
|
|
# Le GUI ne stocke ni n'affiche ces valeurs : il n'en montre que les NOMS
|
|
|
|
|
# (panneau « Intrants de base »). Le mot de passe du vault est saisi au déploiement.
|
|
|
|
|
|
|
|
|
|
# --- Accès API Proxmox (clonage des VM) ---
|
|
|
|
|
proxmox_api_token_id: ""
|
|
|
|
|
proxmox_api_token_secret: ""
|
|
|
|
|
|
|
|
|
|
# --- AC / PKI interne (step-ca) ---
|
|
|
|
|
vault_step_ca_password: ""
|
|
|
|
|
vault_step_ca_fingerprint: ""
|
|
|
|
|
vault_step_ca_provisioner_password: ""
|
|
|
|
|
|
|
|
|
|
# --- Identité (LDAP / SSO) ---
|
|
|
|
|
vault_openldap_admin: ""
|
|
|
|
|
vault_ldap_sssd: ""
|
|
|
|
|
vault_keycloak_admin: ""
|
|
|
|
|
|
|
|
|
|
# --- Bases de données ---
|
|
|
|
|
vault_postgresql_keycloak: ""
|
|
|
|
|
vault_bd_keycloak: ""
|
|
|
|
|
vault_bd_forgejo: ""
|
|
|
|
|
vault_bd_icingadb: ""
|
2026-09-15 08:49:32 -04:00
|
|
|
# La base des COMPTES de la console (mode `db`) — distincte de celle du moteur.
|
|
|
|
|
vault_bd_icingaweb2: ""
|
2026-06-30 15:42:12 -04:00
|
|
|
|
|
|
|
|
# --- Forge (Forgejo) ---
|
|
|
|
|
vault_forgejo_admin: ""
|
|
|
|
|
vault_forgejo_secret_key: ""
|
|
|
|
|
vault_forgejo_internal_token: ""
|
|
|
|
|
|
|
|
|
|
# --- Observabilité / divers ---
|
|
|
|
|
vault_grafana_admin: ""
|
|
|
|
|
vault_redis: ""
|
2026-09-14 11:35:14 -04:00
|
|
|
|
une console pour le site, et un repli qui ouvrait vers l Internet
Icinga Web 2 gagne un troisieme mode, locale : nginx authentifie en HTTP Basic
et pose REMOTE_USER, l application le croit. Un SITE n a ni annuaire ni Keycloak
— ce sont des services d ecosysteme. Ni backend LDAP ni backend de groupes : un
backend qui vise une ressource inexistante fait echouer chaque ouverture de
session. L habilitation nomme alors une personne, entorse a D-66 ecrite plutot
que contournee.
Deux pieges en chemin : resoudre_annuaire etait appele sans condition et tombait
sur NoneType has no len (default sans son second argument ne remplace pas None),
et le flux du role ne nommait que l edge — le site n en a pas, donc personne ne
pouvait entrer. serveur_grafana portait deja la reponse.
LE DEFAUT DU DEVIS : une sortie vers un role ABSENT de l ecosysteme retombait
sur !SETOPS_INTERNES, la forme de vers l Internet. La frontiere aurait autorise
la console a parler LDAPS a n importe quelle machine du monde, pour joindre un
annuaire qui n existe pas. C est une source vide ouvre le port, cote
destination. Trois regles du meme defaut etaient DEJA posees pour postfix.
La frontiere n est pas ecrite : elle porte la production, et le devis attend un
mot.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 19:11:22 -04:00
|
|
|
# LA CONSOLE DE SUPERVISION, QUAND ELLE S'AUTHENTIFIE SEULE.
|
|
|
|
|
#
|
2026-09-15 08:49:32 -04:00
|
|
|
# `serveur_icingaweb2_auth: db` — le mode d'un SITE, qui n'a ni annuaire ni Keycloak.
|
|
|
|
|
# Icinga Web 2 gère ses comptes nativement ; ce mot de passe est celui du compte
|
|
|
|
|
# D'AMORÇAGE, celui qui permet d'entrer la première fois pour créer les autres dans
|
|
|
|
|
# l'interface. Inutile en mode `ldap` ou `external`.
|
une console pour le site, et un repli qui ouvrait vers l Internet
Icinga Web 2 gagne un troisieme mode, locale : nginx authentifie en HTTP Basic
et pose REMOTE_USER, l application le croit. Un SITE n a ni annuaire ni Keycloak
— ce sont des services d ecosysteme. Ni backend LDAP ni backend de groupes : un
backend qui vise une ressource inexistante fait echouer chaque ouverture de
session. L habilitation nomme alors une personne, entorse a D-66 ecrite plutot
que contournee.
Deux pieges en chemin : resoudre_annuaire etait appele sans condition et tombait
sur NoneType has no len (default sans son second argument ne remplace pas None),
et le flux du role ne nommait que l edge — le site n en a pas, donc personne ne
pouvait entrer. serveur_grafana portait deja la reponse.
LE DEFAUT DU DEVIS : une sortie vers un role ABSENT de l ecosysteme retombait
sur !SETOPS_INTERNES, la forme de vers l Internet. La frontiere aurait autorise
la console a parler LDAPS a n importe quelle machine du monde, pour joindre un
annuaire qui n existe pas. C est une source vide ouvre le port, cote
destination. Trois regles du meme defaut etaient DEJA posees pour postfix.
La frontiere n est pas ecrite : elle porte la production, et le devis attend un
mot.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 19:11:22 -04:00
|
|
|
vault_icingaweb2_admin: ""
|
|
|
|
|
|
la console d exploitation devient un service, et elle n avait aucune serrure
Le GUI n a aucune authentification : GET / sert la page a qui la demande, jeton
ecrit dedans, et POST /api exige ce jeton que la page vient de donner. Le jeton
garde contre le CSRF, pas contre un visiteur — la seule serrure est
--hote 127.0.0.1. Ce qu il offre a qui entre : deployer, creer, raser, editer le
plan. La fabric entiere.
Le service reste donc sur la boucle locale. Ce qui est publie est un nginx local
qui authentifie d abord : oidc par defaut (oauth2-proxy, donc un groupe
d annuaire qu on revoque sans deploiement), locale en repli pour un ecosysteme
sans annuaire. L authentification est posee au niveau du server, pas d un
location.
La sonde console-ops mesure une SERRURE : une requete anonyme doit etre REFUSEE.
Un 200 y est la pire des reponses, et il ne fait echouer personne.
P54 a attrape une contrainte ratee : serveur_ops est insemine par le SITE, qui
ne detient pas la voute du locataire. Le role ne nomme donc aucune voute — il
declare un parametre, et la couche qui detient le secret le remplit.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
2026-09-14 19:27:28 -04:00
|
|
|
# LA CONSOLE D'EXPLOITATION, QUAND ELLE S'AUTHENTIFIE SEULE.
|
|
|
|
|
#
|
|
|
|
|
# `serveur_ops_gui_auth: locale` — le repli d'un ecosysteme SANS annuaire (un SITE).
|
|
|
|
|
# Un ecosysteme qui a Keycloak reste en `oidc` et laisse cette cle VIDE : la console
|
|
|
|
|
# lance des deploiements et peut raser, un mot de passe partage devant ce pouvoir est un
|
|
|
|
|
# accident qui attend.
|
|
|
|
|
vault_setops_gui_admin: ""
|
|
|
|
|
|
2026-09-15 11:47:50 -04:00
|
|
|
# LE SECRET OIDC DE LA CONSOLE D'EXPLOITATION (mode `oidc`).
|
|
|
|
|
#
|
|
|
|
|
# Le GUI de Set-OPS n'a aucune authentification a lui : la passerelle est sa seule
|
|
|
|
|
# serrure, et ce secret est ce qui la lie a Keycloak. Vide chez un ecosysteme sans
|
|
|
|
|
# annuaire — un SITE — qui emploie alors le vestibule local.
|
|
|
|
|
vault_setops_console_oidc: ""
|
|
|
|
|
|
|
|
|
|
|
la console d exploitation devient un service, et elle n avait aucune serrure
Le GUI n a aucune authentification : GET / sert la page a qui la demande, jeton
ecrit dedans, et POST /api exige ce jeton que la page vient de donner. Le jeton
garde contre le CSRF, pas contre un visiteur — la seule serrure est
--hote 127.0.0.1. Ce qu il offre a qui entre : deployer, creer, raser, editer le
plan. La fabric entiere.
Le service reste donc sur la boucle locale. Ce qui est publie est un nginx local
qui authentifie d abord : oidc par defaut (oauth2-proxy, donc un groupe
d annuaire qu on revoque sans deploiement), locale en repli pour un ecosysteme
sans annuaire. L authentification est posee au niveau du server, pas d un
location.
La sonde console-ops mesure une SERRURE : une requete anonyme doit etre REFUSEE.
Un 200 y est la pire des reponses, et il ne fait echouer personne.
P54 a attrape une contrainte ratee : serveur_ops est insemine par le SITE, qui
ne detient pas la voute du locataire. Le role ne nomme donc aucune voute — il
declare un parametre, et la couche qui detient le secret le remplit.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
2026-09-14 19:27:28 -04:00
|
|
|
|
2026-09-14 11:35:14 -04:00
|
|
|
# LE COMPTE DE METRIQUES DE POSTGRESQL — lecture seule, role `pg_monitor`.
|
|
|
|
|
#
|
|
|
|
|
# Il ne lit que les vues de statistiques : pas une ligne de donnee applicative. Faire
|
|
|
|
|
# tourner l'exportateur en `postgres` serait donner les cles de la base pour lire des
|
|
|
|
|
# compteurs.
|
|
|
|
|
#
|
|
|
|
|
# VIDE = PAS D'EXPORTATEUR DU TOUT. Le role ne le pose pas, ne cree pas le compte, et
|
|
|
|
|
# Prometheus ne derive aucune cible. Degrader, jamais deviner — et surtout jamais un mot
|
|
|
|
|
# de passe par defaut.
|
|
|
|
|
vault_pg_exportateur: ""
|