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