Set-OPS-Public/roles/serveur_ops/templates/setops-gui.service.j2
Daniel Allaire 627ef00ec7 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

47 lines
1.7 KiB
Django/Jinja

# GENERE par Set-OPS (role serveur_ops). Ne pas editer a la main.
#
# LA CONSOLE D'EXPLOITATION DE CET ECOSYSTEME.
#
# ELLE N'ECOUTE QUE SA PROPRE MACHINE, et ce n'est pas un reglage : c'est SA SEULE
# SERRURE. Le GUI sert sa page a qui la demande, avec son jeton ecrit dedans — le jeton
# garde contre le CSRF, pas contre un visiteur. Ce qui protege la fabric, c'est que
# personne d'autre que `127.0.0.1` ne peut frapper.
#
# Ce qui est publie est le nginx local, qui authentifie d'abord.
[Unit]
Description=Console d'exploitation Set-OPS ({{ setops_instance | default('instance') }})
Documentation=file://{{ serveur_ops_racine }}/{{ serveur_ops_depot_moteur }}/docs/carte-set-ops.md
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User={{ serveur_ops_utilisateur }}
Group={{ serveur_ops_utilisateur }}
WorkingDirectory={{ serveur_ops_racine }}/{{ serveur_ops_depot_moteur }}
# LE PYTHON DE L'ENVIRONNEMENT ISOLE, pas celui du systeme : le GUI importe `yaml` et
# les modules du moteur, et c'est cet environnement-la qui les porte.
ExecStart={{ serveur_ops_venv }}/bin/python3 scripts/inventory_gui.py \
--hote {{ serveur_ops_gui_ecoute }} --port {{ serveur_ops_gui_port }}
Restart=on-failure
RestartSec=5
# CE QU'ELLE PEUT FAIRE, ET CE QU'ON LUI RETIRE. La console LANCE des deploiements : on
# ne peut donc pas la priver d'executables ni de reseau. Ce qu'on peut lui retirer sans
# la casser, on le retire — un service qui deploie merite plus de soin que les autres,
# pas moins.
NoNewPrivileges=yes
PrivateTmp=yes
ProtectHome=read-only
ProtectSystem=full
ProtectKernelTunables=yes
ProtectKernelModules=yes
ProtectControlGroups=yes
RestrictSUIDSGID=yes
RemoveIPC=yes
LockPersonality=yes
[Install]
WantedBy=multi-user.target