From 80bd8e88acefbdad063d8ef51769f72c184b5d06 Mon Sep 17 00:00:00 2001 From: Daniel Allaire Date: Tue, 29 Sep 2026 17:34:44 -0400 Subject: [PATCH] dorsal : confiance limitee a la forge du site ; chemin public eprouve de bout en bout Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 32 +++++++++++++++++++++ roles/serveur_web_dorsal/defaults/main.yml | 15 ++++++++++ roles/serveur_web_dorsal/tasks/main.yml | 33 ++++++++++++++++++++++ 3 files changed, 80 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0ff0fc2..fbfdb99 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,37 @@ # CHANGELOG — Set-OPS +## 2026-09-29 (41) — Le chemin public éprouvé de bout en bout : Internet → `.61` → WAF → dorsal → forge du site + +**Le contenu vient de la forge du site.** Organisation `essais` (distincte du génome), dépôt +public `essai-web` et sa page `public/index.html`, créés par l'API de la forge depuis le runner +du site ; lecture anonyme vérifiée. + +**Le dorsal fait confiance à la forge du site, et à elle seule.** Comme le runner : la racine +de l'AC du site n'entre pas dans le magasin système, `git config http..sslCAInfo` la +limite à l'adresse de la forge. L'adresse et la racine sont LUES chez le runner du locataire +(`serveur_ops_forge_amont`, `serveur_ops_forge_amont_ac`) — pas de seconde copie. Premier +passage : le répertoire de la racine manquait (créé désormais). Posé aussi chez Technolibre. + +**Déclaré au plan de Chezlepro** : application `essai_web` (dorsal, port 80, +`expose: essai.chezlepro.ca`) et le site `essai` du dorsal ; inventaire régénéré (`make +instancier`, écart relu : `serveur_web_dorsal_hostname` et `sans_exposition` du frontal — une +variable que seul l'edge lit ; le certificat interne du frontal passe par `client_pki`, filtré). + +**Éprouvé depuis l'Internet** (le wifi du poste sort par un autre accès) : +- le DNS public du site répond `essai.chezlepro.ca → 69.70.26.61` — la zone du locataire, + notifiée et transférée ; +- la page est servie : `.61` → frontal → dorsal ; +- une injection SQL est journalisée par le WAF (942100, 949110) et passe (200) : mode + détection, comme prévu ; +- un nom inconnu sur `.61` est refusé. + +Sondes : `sites-servis` « 1 servi », `frontal` « 1 exposition publique servie, WAF CRS en +DetectionOnly ». + +**Reste** : Let's Encrypt (le 443 attend son certificat) ; passer le WAF en blocage après +lecture de son journal ; le plancher `/etc/hosts` de Chezlepro n'a pas encore la ligne +`essai.chezlepro.ca` (sans effet sur la sonde `plancher`, qui ne compte que le domaine interne). + ## 2026-09-29 (40) — Le domaine public désigne le frontal ; les noms publics pointent vers l'adresse du locataire ; le dorsal refuse les inconnus **Point 3.** `domaines.yml` des deux locataires : le domaine public (`chezlepro.ca`, diff --git a/roles/serveur_web_dorsal/defaults/main.yml b/roles/serveur_web_dorsal/defaults/main.yml index d28a688..ee11113 100644 --- a/roles/serveur_web_dorsal/defaults/main.yml +++ b/roles/serveur_web_dorsal/defaults/main.yml @@ -56,3 +56,18 @@ serveur_web_dorsal_sites: [] # l'edge, pour un nom interne) qui les recoit et les relaie. La sonde mesure ce qu'il ira # chercher — si le frontal est vert et le site muet, la panne est ici. serveur_web_dorsal_sites_port: 80 + +# --- LA FORGE DU SITE, SOURCE DES SITES ET DES APPLICATIONS (2026-09-29) ------------------- +# +# Les locataires n'ont plus de forge a eux : le contenu vient de celle du SITE, jointe par +# son adresse et signee par l'AC du site. On ne pose pas cette racine dans le magasin +# systeme : `git config http..sslCAInfo` ne l'applique qu'a CETTE forge — le patron du +# runner (`serveur_ops`). L'adresse et la racine sont LUES chez le runner du locataire, +# qui les declare deja : une seconde copie prendrait du retard. +serveur_web_dorsal_forge_site: >- + {{ (hostvars[groups['serveur_ops'][0]].serveur_ops_forge_amont | default('')) + if (groups.get('serveur_ops') or []) else '' }} +serveur_web_dorsal_forge_site_ac: >- + {{ (hostvars[groups['serveur_ops'][0]].serveur_ops_forge_amont_ac | default('')) + if (groups.get('serveur_ops') or []) else '' }} +serveur_web_dorsal_forge_site_ac_depot: "/usr/local/share/setops/ac-forge-site.crt" diff --git a/roles/serveur_web_dorsal/tasks/main.yml b/roles/serveur_web_dorsal/tasks/main.yml index 803b602..4e71f81 100644 --- a/roles/serveur_web_dorsal/tasks/main.yml +++ b/roles/serveur_web_dorsal/tasks/main.yml @@ -26,6 +26,39 @@ group: root mode: "0755" +# LA CONFIANCE AVANT LE CLONE, LIMITEE A LA FORGE DU SITE (voir defaults/main.yml). +- name: Creer le repertoire de la racine de la forge du site + ansible.builtin.file: + path: "{{ serveur_web_dorsal_forge_site_ac_depot | dirname }}" + state: directory + owner: root + group: root + mode: "0755" + when: + - serveur_web_dorsal_forge_site | trim | length > 0 + - serveur_web_dorsal_forge_site_ac | trim | length > 0 + +- name: Deposer la racine de la forge du site + ansible.builtin.copy: + src: "{{ serveur_web_dorsal_forge_site_ac | trim }}" + dest: "{{ serveur_web_dorsal_forge_site_ac_depot }}" + owner: root + group: root + mode: "0644" + when: + - serveur_web_dorsal_forge_site | trim | length > 0 + - serveur_web_dorsal_forge_site_ac | trim | length > 0 + +- name: Limiter cette confiance a la forge du site, et a elle seule + community.general.git_config: + name: "http.{{ serveur_web_dorsal_forge_site | trim }}/.sslCAInfo" + scope: global + value: "{{ serveur_web_dorsal_forge_site_ac_depot }}" + when: + - serveur_web_dorsal_forge_site | trim | length > 0 + - serveur_web_dorsal_forge_site_ac | trim | length > 0 + - not ansible_check_mode + - name: Cloner / mettre a jour chaque app (clone superficiel) ansible.builtin.git: repo: "{{ item.depot }}"