diff --git a/CHANGELOG.md b/CHANGELOG.md index 31a777c..0ff0fc2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,33 @@ # CHANGELOG — Set-OPS +## 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`, +`technolibre.ca`) désigne `serveur_web_frontal` — l'edge garde les noms internes. Aucun nom +public n'est encore exposé : rien de visible ne change avant le premier site. + +**Les noms exposés d'une zone publique pointent vers l'adresse DU LOCATAIRE.** Ils +pointaient vers `ip_publique_site` (`.62`), l'adresse du site — donc vers son DNS public, pas +vers le frontal du locataire. `serveur_powerdns_ip_expositions` = `ip_publique` (repli +`ip_publique_site`) ; les serveurs de noms (`dns1`) restent à l'adresse du site. + +**Le DNS public, confirmé tel que l'exploitant le décrit** : chaque locataire tient sa zone +sur son PowerDNS (instance publique, signée) ; le DNS public du site (`site-dnspub-01`, joint +par `.62:53`) la reçoit par NOTIFY + transfert TSIG ; le registraire désignera ce serveur. +Éprouvé à l'instant : le retrait de `git.chezlepro.ca` (entrée 35) déployé chez Chezlepro, le +site a pris le nouveau numéro de série et ne sert plus ce nom. + +**`client_pki` ne demande à l'AC interne que le domaine interne.** step-ca n'a aucune +politique de noms : il aurait signé les noms publics du frontal, qui relèvent de Let's Encrypt. +Filtre sur le champ `domaine` de l'exposition. Un premier essai par expression régulière +vidait la liste de l'edge (l'échappement de `\.` ne passe pas de la même façon dans un bloc +YAML replié) : vu au rendu, avant tout déploiement. Vérifié ensuite : l'edge garde ses six +noms, chaque service du site le sien, le frontal le seul sien. + +**Le dorsal refuse les noms inconnus** (444, comme l'edge et le frontal) ; le site Debian par +défaut est retiré. Posé chez les deux locataires : sondes `sites-servis` et `apps-servies` +saines (elles interrogent par nom et par port d'application, pas par le défaut). + ## 2026-09-29 (39) — Le web frontal devient reverse proxy + WAF ; le dorsal porte les sites **L'architecture, précisée par l'exploitant** : le web **dorsal** est le serveur des sites ; diff --git a/roles/client_pki/defaults/main.yml b/roles/client_pki/defaults/main.yml index 6f5b788..7f7b478 100644 --- a/roles/client_pki/defaults/main.yml +++ b/roles/client_pki/defaults/main.yml @@ -44,6 +44,10 @@ client_pki_cle: "{{ client_pki_steppath }}/certs/{{ client_pki_nom_cert }}.key" # service, et l'hote doit en faire partie. Un certificat qui revendiquerait le nom d'un # service rendu ailleurs serait une usurpation, pas une commodite. # +# L'AC INTERNE NE SIGNE QUE LE DOMAINE INTERNE (2026-09-29). Le web frontal sert les noms +# PUBLICS du locataire : ils relevent de Let's Encrypt. step-ca n'a aucune politique de noms +# et les aurait signes — sans danger (personne dehors ne lui fait confiance), mais sans objet. +# # ET LE SERVICE LUI-MEME, QUAND LES MACHINES Y VONT DIRECTEMENT (2026-09-29). Avec # `resolution_interne: service` (le site), le plancher et la zone menent le nom au service, # pas a l'edge : c'est lui qui doit le porter. Sans cela, une reconstruction de @@ -58,6 +62,8 @@ client_pki_sans: >- | selectattr('edge', 'defined') | selectattr('fqdn', 'defined') | selectattr('edge', 'in', group_names) + | selectattr('domaine', 'defined') + | selectattr('domaine', 'equalto', domaine_interne | default('')) | map(attribute='fqdn') | list) + (client_pki_expositions | selectattr('fqdn', 'defined') diff --git a/roles/serveur_powerdns/defaults/main.yml b/roles/serveur_powerdns/defaults/main.yml index 259e762..6fcbbaf 100644 --- a/roles/serveur_powerdns/defaults/main.yml +++ b/roles/serveur_powerdns/defaults/main.yml @@ -96,6 +96,10 @@ serveur_powerdns_sonde_tolerance: 900 # recopie pas — il les recoit, comme ses adresses d'amorcage. serveur_powerdns_dns_public_site: "{{ dns_public_site | default('') }}" serveur_powerdns_ip_publique: "{{ ip_publique_site | default('') }}" +# L'ADRESSE DES NOMS EXPOSES : celle DU LOCATAIRE (2026-09-29), que le site lui attribue et +# que la frontiere redirige vers son web frontal. `ip_publique_site` ne porte plus que les +# serveurs de noms (le DNS public du site). Repli sur elle si aucune n'est attribuee. +serveur_powerdns_ip_expositions: "{{ ip_publique | default(ip_publique_site) | default('') }}" # Le nom du serveur de noms du site (contrat du site) : NS et SOA de chaque zone publique. serveur_powerdns_dns_public_nom: "{{ dns_public_nom | default('') }}" # Le NOM de la cle TSIG, identique des deux cotes — derive du nom du depot du locataire, diff --git a/roles/serveur_powerdns/templates/zone-publique.db.j2 b/roles/serveur_powerdns/templates/zone-publique.db.j2 index a53da73..048e642 100644 --- a/roles/serveur_powerdns/templates/zone-publique.db.j2 +++ b/roles/serveur_powerdns/templates/zone-publique.db.j2 @@ -28,11 +28,12 @@ $TTL {{ serveur_powerdns_ttl }} {# UNE ZONE PUBLIQUE NE PORTE QUE DES ADRESSES PUBLIQUES. - Un nom expose sous ce domaine resout vers l'adresse publique du site — la frontiere le - relaie ensuite a l'edge. Jamais vers l'adresse interne de l'edge : elle ne resoudrait - pour personne dehors, et renseignerait sur le reseau dedans. #} + Un nom expose sous ce domaine resout vers l'adresse publique DU LOCATAIRE (2026-09-29) — + la frontiere la redirige vers son web frontal. Jamais vers une adresse interne : elle ne + resoudrait pour personne dehors, et renseignerait sur le reseau dedans. Les serveurs de + noms, eux, restent a l'adresse du site (ci-dessus). #} {% for expo in serveur_powerdns_expositions | default([]) if expo.domaine == zone_publique %} -{{ expo.fqdn[:-(zone_publique | length + 1)] if expo.fqdn != zone_publique else '@' }} IN A {{ serveur_powerdns_ip_publique }} +{{ expo.fqdn[:-(zone_publique | length + 1)] if expo.fqdn != zone_publique else '@' }} IN A {{ serveur_powerdns_ip_expositions }} {% endfor %} {# LES ENREGISTREMENTS DECLARES AU PLAN : courriel, verifications, noms historiques. diff --git a/roles/serveur_web_dorsal/tasks/main.yml b/roles/serveur_web_dorsal/tasks/main.yml index ebc56c2..803b602 100644 --- a/roles/serveur_web_dorsal/tasks/main.yml +++ b/roles/serveur_web_dorsal/tasks/main.yml @@ -107,6 +107,30 @@ label: "{{ item.nom }}" when: not ansible_check_mode +# LE SERVEUR PAR DEFAUT REFUSE TOUT NOM INCONNU (2026-09-29) — a la place du site Debian. +- name: Retirer le site nginx par defaut de Debian + ansible.builtin.file: + path: /etc/nginx/sites-enabled/default + state: absent + notify: Recharger nginx serveur_web_dorsal + +- name: Deployer le serveur par defaut de Set-OPS + ansible.builtin.template: + src: defaut.conf.j2 + dest: /etc/nginx/sites-available/000-defaut.conf + owner: root + group: root + mode: "0644" + notify: Recharger nginx serveur_web_dorsal + +- name: Activer le serveur par defaut de Set-OPS + ansible.builtin.file: + src: /etc/nginx/sites-available/000-defaut.conf + dest: /etc/nginx/sites-enabled/000-defaut.conf + state: link + force: "{{ ansible_check_mode }}" + notify: Recharger nginx serveur_web_dorsal + # LES SITES STATIQUES (2026-09-29) — repris du web frontal, qui ne sert plus rien lui-meme. - name: Creer la racine des sites statiques ansible.builtin.file: diff --git a/roles/serveur_web_dorsal/templates/defaut.conf.j2 b/roles/serveur_web_dorsal/templates/defaut.conf.j2 new file mode 100644 index 0000000..2428fc7 --- /dev/null +++ b/roles/serveur_web_dorsal/templates/defaut.conf.j2 @@ -0,0 +1,12 @@ +# Gere par Set-OPS (role serveur_web_dorsal). Ne pas editer a la main. +# +# UN NOM INCONNU N'OBTIENT RIEN (2026-09-29), comme a l'edge et au frontal. Le dorsal sert +# la page d'accueil de Debian a tout nom qu'il ne porte pas : une requete mal adressee par +# une des deux portes aurait recu une page au lieu d'un refus, et la sonde `sites-servis` +# aurait pu prendre un site disparu pour un site servi. +server { + listen 80 default_server; + listen [::]:80 default_server; + server_name _; + return 444; +}