la console d exploitation est allumee, et publiee par l edge

console.genese.internal : 401 sans justificatif, la console avec. Le site est le
premier ecosysteme a servir son GUI par un nom, en TLS verifie.

Le vestibule reste, et c est le contraire d une contradiction avec la veille :
Icinga Web 2 a une page de connexion, donc on lui a retire le sien ; le GUI de
Set-OPS sert sa page a qui la demande, jeton inclus, donc le vestibule EST sa
seule serrure. Verifie sur la machine : le GUI n ecoute que 127.0.0.1:8765, seul
le 8090 du vestibule est publie.

Controle dans les deux sens — une serrure ne se prouve qu en la forcant et en
l ouvrant. Et la sonde console-ops exige un REFUS sur une requete anonyme, parce
qu un 200 y serait la pire des reponses.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
This commit is contained in:
Daniel Allaire 2026-09-15 10:32:48 -04:00
parent 504840f378
commit 0529951381
3 changed files with 62 additions and 3 deletions

View file

@ -1,5 +1,51 @@
# CHANGELOG — Set-OPS
## 2026-09-15 (4) — La console d'exploitation est allumee, et publiee par l'edge
https://console.genese.internal/ 401 sans justificatif, la console avec
Le site est le premier ecosysteme a servir son GUI par un nom, en TLS verifie. Il a fallu
qu'il ait un edge pour que ce soit possible.
### Le vestibule reste, et c'est le contraire d'une contradiction
La veille, on RETIRAIT le vestibule de la vigie : Icinga Web 2 sait s'authentifier, en
poser un devant reinventait sa page de connexion. Ici on en GARDE un, et la difference est
tout le sujet :
Icinga Web 2 a une page de connexion, des comptes, des groupes -> pas de vestibule
GUI Set-OPS `GET /` sert la page A QUI LA DEMANDE, jeton inclus -> le vestibule EST
sa seule serrure
Le jeton du GUI garde contre le CSRF, pas contre un visiteur. Ce qui protege la fabric,
c'est que le service n'ecoute que `127.0.0.1` — verifie sur la machine :
LISTEN 127.0.0.1:8765 <- le GUI, joignable de nulle part ailleurs
LISTEN 0.0.0.0:8090 <- le vestibule, seul publie
`locale` (HTTP Basic) parce qu'un site n'a ni annuaire ni Keycloak. Chez un locataire ce
sera `oidc`, derriere oauth2-proxy — et c'est la que l'integration a sa place.
### Controle dans les deux sens
Une serrure ne se prouve qu'en la forcant ET en l'ouvrant :
sans justificatif HTTP 401
avec 152 805 octets — « Set-OPS · Votre artisan numerique »
182 vues du GUI, le jeton injecte dans la page
Et la sonde `console-ops` mesure exactement ca — elle exige un REFUS sur une requete
anonyme, parce qu'un 200 y serait la pire des reponses :
site-ops-01 | console-ops | OK | Console vivante, vestibule (locale) en place :
une requete anonyme rend HTTP 401.
### Le mot de passe le plus lourd de la voute
48 caracteres la ou les autres en ont 32 ou 40. Il n'ouvre pas une console de lecture : il
ouvre `deployer`, `creer`, `instance-utiliser` et l'edition du plan. Le cout d'un caractere
de plus est nul ; celui d'une console forcee ne l'est pas.
## 2026-09-15 (3) — Le charabia de la console : deux bases confondues, et un etat sans domicile
L'exploitant, apres s'etre connecte : *« icingaweb2 affiche un tas de charabia quand

View file

@ -55,14 +55,14 @@
| P40 | Parente : l'ecosysteme sait de quoi il descend | — | ✅ OK | Parente coherente : 4 depot(s), tous retrouves, tous porteurs d'un remote. |
| P41 | Resolution d'instance : une seule, partagee | — | ✅ OK | Resolution unique : 63 script(s) passent par `inventory_rules`, 3 exemption(s) nommee(s). |
| P42 | L'edge porte les noms qu'il publie | — | ✅ OK | 5 edge(s) emettent un certificat portant les noms publies (instance-ci-1646753/production, OPS-Chezlepro-lab/principal, OPS-Chezlepro/principal, OPS-Technolibre |
| P43 | Frontiere : le devis voit les machines du site | — | ✅ OK | Devis de la frontiere : 8 machine(s) du plan retrouvees, 181 regle(s) du site. |
| P43 | Frontiere : le devis voit les machines du site | — | ✅ OK | Devis de la frontiere : 8 machine(s) du plan retrouvees, 182 regle(s) du site. |
| P44 | Integrations : le serveur avant ses clients | — | ✅ OK | 5 integration(s) appliquent leur serveur avant leurs clients. |
| P45 | Pare-feu Proxmox : arme sur les VNet SDN, jamais ailleurs | — | ✅ OK | Le pare-feu Proxmox ne s'arme que sur un VNet SDN (4 cas evalues, dont un qui doit rendre VRAI). |
| P46 | Plancher /etc/hosts : un seul role en decide | — | ✅ OK | Un seul maitre du plancher — roles/hosts_statiques/tasks/main.yml : manage_etc_hosts: false ; et le gabarit maitre est pose (roles/hosts_statiques/templates/hos |
| P47 | Zones inverses : couvrir l'occupe, et rien de plus | — | ✅ OK | Les zones inverses couvrent l'occupe et rien de plus (5 cas evalues, dont un site a quatre zones et un tenant a une). |
| P48 | La carte d'orientation designe ce qui existe, et compte juste | — | ✅ OK | La carte designe 92 chemin(s) qui existent, et ses 7 chiffres correspondent a la mesure. |
| P49 | Registre des flux : la matrice d'audit est a jour | — | ✅ OK | Le registre des flux reproduit exactement ce que les `meta/flux.yml` declarent (129 lignes). |
| P50 | Silences : un refus muet est declare, place en dernier, et motive | — | ✅ OK | 2 silence(s) declare(s), tous en sequence > 1 (la plus haute des 271 regles `pass`), tous non consignes et tous motives. |
| P50 | Silences : un refus muet est declare, place en dernier, et motive | — | ✅ OK | 2 silence(s) declare(s), tous en sequence > 1 (la plus haute des 272 regles `pass`), tous non consignes et tous motives. |
| P51 | Collections : toutes declarees, toutes epinglees | — | ✅ OK | 3 collection(s) et 2 bibliotheque(s) Python declarees et epinglees : ansible.posix==1.6.2, community.general==10.3.0, community.postgresql==3.10.2 |
| P52 | Materialiser n'exige pas d'entrer dans le tenant | — | ✅ OK | `creer-vm` confirme par l'agent invite (API des hyperviseurs, deja utilisee pour creer), sans exiger d'entrer dans le tenant. |
| P53 | L'interne refuse a voix haute, la bordure se tait | — | ✅ OK | L'interne parle, la bordure se tait — 13 ruleset(s) nftables refusent a voix haute ; pare-feu est-ouest en REJECT, source unique ; frontiere muette (actions : b |
@ -79,7 +79,7 @@
| P64 | Sondes de supervision : declarees ET deposees | — | ✅ OK | 40 sonde(s) declaree(s) ET deposee(s), chacune avec sa raison et son `ttl` : client_journal/journaux, client_metrique/metriques, client_pki/certificat, serveur_ |
| P65 | Depots tiers : demandes au cache, jamais en HTTPS direct | — | ✅ OK | 4 depot(s) tiers relaye(s) par le cache, aucun role ne les vise en https:// ecrit en dur. |
| P66 | Clients OIDC : chaque URI vise un nom que le plan expose | — | ✅ OK | 3 client(s) OIDC, toutes leurs URI visent un FQDN que le plan expose (5 exposition(s)). |
| P67 | Nom public : le service porte celui du plan, pas celui du role | — | ✅ OK | 11 service(s) expose(s) portent le nom du plan, sur 2 inventaire(s) : instance, SITE. |
| P67 | Nom public : le service porte celui du plan, pas celui du role | — | ✅ OK | 12 service(s) expose(s) portent le nom du plan, sur 2 inventaire(s) : instance, SITE. |
| P68 | Cle de depot telechargee : mesuree avant d'etre utilisee | — | ✅ OK | 5 role(s) telechargent une cle de depot, tous la mesurent avant de s'en servir. |
| P69 | Amorcage d'un tenant : l'adresse designe le site REEL | — | ✅ OK | 2 adresse(s) d'amorcage designent bien une machine du site. |
| P70 | Depot de binaires : il tient tout ce que les roles vont chercher | — | ✅ OK | 6 artefact(s) direct(s) tenus par le depot du site. |

View file

@ -685,6 +685,19 @@ def inventaire() -> dict:
# `auth_basic` nginx devant — un vestibule devant une application qui sait
# deja s'authentifier (corrige le 2026-09-15).
"serveur_icingaweb2_auth": "db",
# LA CONSOLE D'EXPLOITATION DU SITE, ALLUMEE (2026-09-15).
#
# `locale` ET PAS `oidc`, ET LA DIFFERENCE AVEC LA VIGIE EST TOUT LE SUJET.
# Icinga Web 2 sait s'authentifier : on lui a RETIRE son vestibule. Le GUI de
# Set-OPS, lui, n'a AUCUNE authentification — `GET /` sert la page a qui la
# demande, avec son jeton dedans. Le vestibule est donc sa seule serrure, et
# non une couche de trop.
#
# Un site n'a ni annuaire ni Keycloak : `locale` est le repli, et il est
# declare comme tel dans le role. Chez un locataire, ce sera `oidc`.
"serveur_ops_gui_actif": True,
"serveur_ops_gui_auth": "locale",
"serveur_ops_gui_admin_motdepasse": "{{ vault_setops_gui_admin | default('') }}",
# L'EDGE SERT LE CERTIFICAT DE L'AC INTERNE, PAS LE BOUCHON DE DEBIAN.
#
# `serveur_nginx` a pour DEFAUT `ssl-cert-snakeoil.pem`, avec un commentaire