From 0529951381c4abf77df20baafeba303faf31dc92 Mon Sep 17 00:00:00 2001 From: Daniel Allaire Date: Tue, 15 Sep 2026 10:32:48 -0400 Subject: [PATCH] la console d exploitation est allumee, et publiee par l edge MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q --- CHANGELOG.md | 46 +++++++++++++++++++++++++++++++++ docs/audit/preuve-2026-09-15.md | 6 ++--- scripts/site_inventaire.py | 13 ++++++++++ 3 files changed, 62 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3e0e31b..3c664d8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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 diff --git a/docs/audit/preuve-2026-09-15.md b/docs/audit/preuve-2026-09-15.md index d4e0c12..9b8c3f5 100644 --- a/docs/audit/preuve-2026-09-15.md +++ b/docs/audit/preuve-2026-09-15.md @@ -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. | diff --git a/scripts/site_inventaire.py b/scripts/site_inventaire.py index f702d08..4da52c9 100755 --- a/scripts/site_inventaire.py +++ b/scripts/site_inventaire.py @@ -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