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
47 lines
1.7 KiB
Django/Jinja
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
|