From 5f232010754ab68785795a81ab059e68be32ec15 Mon Sep 17 00:00:00 2001 From: Daniel Allaire Date: Tue, 29 Sep 2026 18:37:00 -0400 Subject: [PATCH] frontal : page 404 du locataire pour les noms qu il ne publie pas Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 19 +++++++++++++++++++ roles/serveur_web_frontal/defaults/main.yml | 13 +++++++++++++ roles/serveur_web_frontal/tasks/main.yml | 18 ++++++++++++++++++ .../templates/frontal.conf.j2 | 16 ++++++++++++++++ 4 files changed, 66 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c43c8ab..447a026 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,24 @@ # CHANGELOG — Set-OPS +## 2026-09-29 (44) — La page du PSPBT devient la page 404 du frontal de Chezlepro + +Précision de l'exploitant sur (43) : c'est le **frontal** qui doit servir cette page, comme +**page 404 par défaut** — pas le dorsal comme page d'un site. + +- **Le rôle `serveur_web_frontal`** accepte une page 404 du locataire + (`serveur_web_frontal_page_404`, un chemin dans le dépôt du locataire) : le serveur par + défaut la sert, statut 404, à tout nom qu'il ne publie pas ; sans page déclarée, il ferme + toujours sans réponse (444). La page est `internal` (pas de lecture directe de + `/404.html` : 404 aussi), avec sa propre CSP (styles et scripts en ligne, rien d'extérieur). + Le nom inconnu n'obtient toujours aucun service. +- **Chezlepro** : `contenus/frontal-404.html` (le fichier `site web.html` de l'exploitant) ; + Technolibre garde le 444. +- **`essai.chezlepro.ca` revient à sa page de test**, CSP par défaut (la CSP propre au site, + posée en (43), est retirée). + +Éprouvé depuis l'Internet : `http://69.70.26.61/`, un chemin quelconque, `/404.html` et un nom +inconnu → 404 avec la page du PSPBT ; `essai.chezlepro.ca` → 200, la page de test. + ## 2026-09-29 (43) — `essai.chezlepro.ca` sert la page du « Parti de la Sainte-Paix et du Bon Temps » À la demande de l'exploitant : le fichier `site web.html` (le seul du dossier `parti politique diff --git a/roles/serveur_web_frontal/defaults/main.yml b/roles/serveur_web_frontal/defaults/main.yml index da83d0c..de88d40 100644 --- a/roles/serveur_web_frontal/defaults/main.yml +++ b/roles/serveur_web_frontal/defaults/main.yml @@ -38,3 +38,16 @@ serveur_web_frontal_taille_max_corps: "16m" # Un amont declare sur un de ces ports se parle en TLS (comme a l'edge). serveur_web_frontal_ports_tls: [443, 8443] + +# --- LA PAGE 404 DU FRONTAL (2026-09-29) ---------------------------------------------------- +# +# Ce que recoit une requete pour un nom que le frontal ne publie pas : une visite de l'adresse +# publique sans nom, un nom inconnu. Vide = la connexion est fermee sans reponse (444). Un +# chemin (sur le controleur, dans le depot du locataire) = cette page, avec le statut 404. +# C'est un CONTENU du locataire : il vit dans son depot, pas dans ce role. +serveur_web_frontal_page_404: "" +serveur_web_frontal_racine_404: "/var/www/setops-frontal" +# La page peut porter ses styles et scripts en ligne ; rien d'exterieur n'est autorise. +serveur_web_frontal_page_404_csp: >- + default-src 'self'; img-src 'self' data:; style-src 'self' 'unsafe-inline'; + script-src 'self' 'unsafe-inline'; object-src 'none'; base-uri 'self'; frame-ancestors 'self' diff --git a/roles/serveur_web_frontal/tasks/main.yml b/roles/serveur_web_frontal/tasks/main.yml index 18829ef..4946f4e 100644 --- a/roles/serveur_web_frontal/tasks/main.yml +++ b/roles/serveur_web_frontal/tasks/main.yml @@ -69,6 +69,24 @@ | expositions_des_applications({'domaines_publics': domaines_publics | default({})}, serveur_web_frontal_groupe) }} when: serveur_web_frontal_publier_expositions | bool +- name: Creer la racine de la page 404 + ansible.builtin.file: + path: "{{ serveur_web_frontal_racine_404 }}" + state: directory + owner: root + group: root + mode: "0755" + when: serveur_web_frontal_page_404 | length > 0 + +- name: Deposer la page 404 du locataire + ansible.builtin.copy: + src: "{{ serveur_web_frontal_page_404 }}" + dest: "{{ serveur_web_frontal_racine_404 }}/404.html" + owner: root + group: root + mode: "0644" + when: serveur_web_frontal_page_404 | length > 0 + - name: Deployer les vhosts du frontal (derives des expositions publiques) ansible.builtin.template: src: frontal.conf.j2 diff --git a/roles/serveur_web_frontal/templates/frontal.conf.j2 b/roles/serveur_web_frontal/templates/frontal.conf.j2 index b212f83..af67cd0 100644 --- a/roles/serveur_web_frontal/templates/frontal.conf.j2 +++ b/roles/serveur_web_frontal/templates/frontal.conf.j2 @@ -3,11 +3,27 @@ # LE SERVEUR PAR DEFAUT REFUSE TOUT NOM INCONNU (meme regle que l'edge) : sans lui, nginx # confie un nom inconnu au premier vhost, et un balayage de l'adresse publique recevrait un # service qu'il n'a pas nomme. +# +# LA PAGE 404 DU LOCATAIRE, s'il en declare une (`serveur_web_frontal_page_404`) : le nom +# inconnu recoit cette page, statut 404 — il n'obtient toujours aucun service. Sinon, 444. server { listen 80 default_server; listen [::]:80 default_server; server_name _; +{% if serveur_web_frontal_page_404 | length > 0 %} + root {{ serveur_web_frontal_racine_404 }}; + error_page 404 /404.html; + location = /404.html { + internal; + add_header Content-Security-Policy "{{ serveur_web_frontal_page_404_csp | trim }}" always; + add_header X-Content-Type-Options "nosniff" always; + } + location / { + return 404; + } +{% else %} return 444; +{% endif %} } {% for expo in serveur_web_frontal_expositions | default([]) %} {% if expo.hote in hostvars and hostvars[expo.hote].ansible_host is defined and expo.port %}