From 0b6c036f8cba511c0257aa9e21b18061dde35b56 Mon Sep 17 00:00:00 2001 From: Daniel Allaire Date: Tue, 25 Aug 2026 03:40:24 -0400 Subject: [PATCH] ssh : retirer les drop-ins d'une nomenclature abandonnee MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Mesure sur forge-01 (par l'agent invite, sans dependre du reseau) : quatre drop-ins SSH coexistent la ou il devrait y en avoir deux. Les roles se sont appeles `chezlepro` avant de porter le nom du moteur ; le renommage a change le fichier DEPOSE sans retirer le precedent. Et les paires divergent : MaxSessions 2 contre 10, MaxStartups 5:30:20 contre 10:30:60. sshd retient la PREMIERE valeur rencontree pour chaque mot-cle et lit les drop-ins dans l'ordre lexical — c'est donc l'ANCIEN fichier qui gagne. Une configuration qu'on croit avoir remplacee reste aux commandes, en silence. ssh_baseline et ssh_hardening retirent chacun le fichier de la nomenclature qu'ils ont abandonnee, AVANT de deposer le leur, et notifient la meme validation. La liste est declarative et ne contient que des noms reellement deposes un jour : supprimer un fichier qu'on n'a jamais ecrit serait effacer la configuration d'un autre. PAS ENCORE EPROUVE : les seules machines portant les anciens fichiers sont celles de patient 0, hors d'atteinte depuis le poste. Ecrit, linte, reste a le voir agir. 42 preuves vertes, ansible-lint profil production. Co-Authored-By: Claude Opus 5 --- CHANGELOG.md | 31 +++++++++++++++++++++++++++ roles/ssh_baseline/defaults/main.yml | 13 +++++++++++ roles/ssh_baseline/tasks/main.yml | 19 ++++++++++++++++ roles/ssh_hardening/defaults/main.yml | 10 +++++++++ roles/ssh_hardening/tasks/main.yml | 10 +++++++++ 5 files changed, 83 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ebaa46a..0e5bcf0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,36 @@ # CHANGELOG — Set-OPS +## 2026-08-25 — Un renommage de rôle laissait son ancien fichier aux commandes + +Mesuré sur `forge-01`, par l'agent invité — donc sans dépendre du réseau. Quatre +drop-ins SSH coexistent là où il devrait y en avoir deux : + +``` +10-chezlepro.conf 10-setops.conf +20-chezlepro-hardening.conf 20-setops-hardening.conf +``` + +Les rôles se sont appelés `chezlepro` avant de porter le nom du moteur. Le renommage a +changé le fichier **déposé** sans retirer le précédent. Et les paires ne disent pas la même +chose : `MaxSessions 2` contre `10`, `MaxStartups 5:30:20` contre `10:30:60`. + +**C'est l'ancien qui gagne.** `sshd` retient la *première* valeur rencontrée pour chaque +mot-clé, et lit les drop-ins dans l'ordre lexical : `20-chezlepro-hardening.conf` passe +avant `20-setops-hardening.conf`. Une configuration qu'on croit avoir remplacée reste donc +aux commandes, en silence — et sa trace se lirait un jour comme une lenteur inexplicable +pendant un déploiement parallèle, cherchée partout sauf là. + +`ssh_baseline` et `ssh_hardening` retirent désormais chacun le fichier de la nomenclature +qu'il a abandonnée, **avant** de déposer le sien, et notifient la même validation. La liste +est déclarative (`ssh_baseline_fichiers_perimes`, `ssh_hardening_fichiers_perimes`) et ne +contient que des noms qu'on a réellement déposés un jour : supprimer un fichier qu'on n'a +jamais écrit serait effacer la configuration de quelqu'un d'autre. + +**Pas encore éprouvé.** Les seules machines portant les anciens fichiers sont celles de +patient 0, actuellement hors d'atteinte depuis le poste — leur écosystème est sain, c'est +le chemin d'entrée qui est coupé. Le correctif est écrit et validé, il reste à le voir +retirer un fichier pour de vrai. + ## 2026-08-25 — Le clonage inter-nœuds : quatre défauts que la première VM ailleurs a révélés Toutes les VM naissaient jusqu'ici sur le nœud du gabarit, puis migraient. `site-cache-01` diff --git a/roles/ssh_baseline/defaults/main.yml b/roles/ssh_baseline/defaults/main.yml index f8922d1..b991897 100644 --- a/roles/ssh_baseline/defaults/main.yml +++ b/roles/ssh_baseline/defaults/main.yml @@ -26,3 +26,16 @@ ssh_baseline_pubkey_authentication: "yes" # etat: present # `absent` pour revoquer ssh_baseline_admin_user: "{{ sudo_ansible_admin_user | default('ansible') }}" ssh_baseline_cles_admin: [] + +# LES FICHIERS QU'UNE NOMENCLATURE ABANDONNEE A LAISSES DERRIERE ELLE. +# +# Ce role a porte le nom `chezlepro` avant de porter celui du moteur. Le renommage a +# change le fichier DEPOSE sans retirer le precedent : les deux coexistent sur toute +# machine anterieure au changement, et sshd retient la PREMIERE valeur qu'il rencontre — +# donc l'ancienne, l'ordre lexical la placant devant. +# +# Cette liste est le registre de ces mues. On n'y ajoute que des noms qu'on a REELLEMENT +# deposes un jour : retirer un fichier qu'on n'a jamais ecrit serait s'arroger le droit de +# supprimer la configuration de quelqu'un d'autre. +ssh_baseline_fichiers_perimes: + - 10-chezlepro.conf diff --git a/roles/ssh_baseline/tasks/main.yml b/roles/ssh_baseline/tasks/main.yml index cd002bb..a674421 100644 --- a/roles/ssh_baseline/tasks/main.yml +++ b/roles/ssh_baseline/tasks/main.yml @@ -12,6 +12,25 @@ group: root mode: "0755" +# UN RENOMMAGE DE ROLE LAISSE SON ANCIEN FICHIER EN VIGUEUR (2026-08-25). +# +# Ce role s'appelait `chezlepro` et deposait `10-chezlepro.conf`. Renomme en `setops`, il +# depose `10-setops.conf` — et l'ancien EST RESTE. Mesure sur forge-01 : les deux paires +# coexistent, et elles ne disent pas la meme chose (`MaxSessions 2` contre `10`). +# +# sshd retient LA PREMIERE valeur rencontree pour chaque mot-cle, et lit les drop-ins dans +# l'ordre lexical : c'est donc l'ANCIEN fichier qui gagne. Une configuration qu'on croit +# avoir remplacee reste aux commandes, en silence, et sa trace se lira un jour comme une +# lenteur inexplicable pendant un deploiement parallele. +# +# Retirer un fichier qu'on ne depose plus fait partie du travail de le deposer. +- name: Retirer les configurations SSH d'une nomenclature abandonnee + ansible.builtin.file: + path: "/etc/ssh/sshd_config.d/{{ item }}" + state: absent + loop: "{{ ssh_baseline_fichiers_perimes }}" + notify: Validate and reload ssh + - name: Déployer la configuration SSH Set-OPS ansible.builtin.template: src: 10-setops.conf.j2 diff --git a/roles/ssh_hardening/defaults/main.yml b/roles/ssh_hardening/defaults/main.yml index c422c9a..f7a97db 100644 --- a/roles/ssh_hardening/defaults/main.yml +++ b/roles/ssh_hardening/defaults/main.yml @@ -28,3 +28,13 @@ ssh_hardening_login_grace_time: "20s" # dans `ansible.cfg`) : ces valeurs sont la marge, pas la contrainte. ssh_hardening_max_startups: "10:30:60" ssh_hardening_max_sessions: 10 + +# MEME MUE, MEME DETTE : ce role a depose `20-chezlepro-hardening.conf` avant de porter le +# nom du moteur. L'ancien fichier survit au renommage et, l'ordre lexical le placant +# devant, c'est LUI que sshd retient pour chaque mot-cle en double. Mesure sur forge-01 : +# `MaxSessions 2` (ancien) l'emportait sur `MaxSessions 10` (courant). +# +# On n'y liste que des noms qu'on a reellement deposes : supprimer un fichier qu'on n'a +# jamais ecrit serait effacer la configuration d'un autre. +ssh_hardening_fichiers_perimes: + - 20-chezlepro-hardening.conf diff --git a/roles/ssh_hardening/tasks/main.yml b/roles/ssh_hardening/tasks/main.yml index b83de74..2c6498a 100644 --- a/roles/ssh_hardening/tasks/main.yml +++ b/roles/ssh_hardening/tasks/main.yml @@ -1,4 +1,14 @@ --- +# VOIR defaults/main.yml : un renommage de role laisse son ancien fichier EN VIGUEUR, et +# l'ordre lexical le place devant le nouveau. Retirer ce qu'on ne depose plus fait partie +# du travail de deposer. +- name: Retirer le hardening SSH d'une nomenclature abandonnee + ansible.builtin.file: + path: "/etc/ssh/sshd_config.d/{{ item }}" + state: absent + loop: "{{ ssh_hardening_fichiers_perimes }}" + notify: Validate and reload ssh + - name: Déployer le hardening SSH additionnel ansible.builtin.template: src: 20-setops-hardening.conf.j2