ssh : retirer les drop-ins d'une nomenclature abandonnee

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 <noreply@anthropic.com>
This commit is contained in:
Daniel Allaire 2026-08-25 03:40:24 -04:00
parent 6715f0d5c5
commit 0b6c036f8c
5 changed files with 83 additions and 0 deletions

View file

@ -1,5 +1,36 @@
# CHANGELOG — Set-OPS # 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 ## 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` Toutes les VM naissaient jusqu'ici sur le nœud du gabarit, puis migraient. `site-cache-01`

View file

@ -26,3 +26,16 @@ ssh_baseline_pubkey_authentication: "yes"
# etat: present # `absent` pour revoquer # etat: present # `absent` pour revoquer
ssh_baseline_admin_user: "{{ sudo_ansible_admin_user | default('ansible') }}" ssh_baseline_admin_user: "{{ sudo_ansible_admin_user | default('ansible') }}"
ssh_baseline_cles_admin: [] 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

View file

@ -12,6 +12,25 @@
group: root group: root
mode: "0755" 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 - name: Déployer la configuration SSH Set-OPS
ansible.builtin.template: ansible.builtin.template:
src: 10-setops.conf.j2 src: 10-setops.conf.j2

View file

@ -28,3 +28,13 @@ ssh_hardening_login_grace_time: "20s"
# dans `ansible.cfg`) : ces valeurs sont la marge, pas la contrainte. # dans `ansible.cfg`) : ces valeurs sont la marge, pas la contrainte.
ssh_hardening_max_startups: "10:30:60" ssh_hardening_max_startups: "10:30:60"
ssh_hardening_max_sessions: 10 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

View file

@ -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 - name: Déployer le hardening SSH additionnel
ansible.builtin.template: ansible.builtin.template:
src: 20-setops-hardening.conf.j2 src: 20-setops-hardening.conf.j2