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>
59 lines
2.1 KiB
YAML
59 lines
2.1 KiB
YAML
---
|
|
- name: Installer openssh-server
|
|
ansible.builtin.apt:
|
|
name: openssh-server
|
|
state: present
|
|
|
|
- name: Créer le répertoire sshd_config.d
|
|
ansible.builtin.file:
|
|
path: /etc/ssh/sshd_config.d
|
|
state: directory
|
|
owner: root
|
|
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
|
|
dest: /etc/ssh/sshd_config.d/10-setops.conf
|
|
owner: root
|
|
group: root
|
|
mode: "0644"
|
|
notify: Validate and reload ssh
|
|
|
|
- name: Activer et démarrer SSH
|
|
ansible.builtin.systemd:
|
|
name: ssh
|
|
enabled: true
|
|
state: started
|
|
|
|
# Voir defaults/main.yml pour le raisonnement (etat par entree, pas d'`exclusive`).
|
|
- name: Autoriser — ou révoquer — les clés d'administration déclarées au plan
|
|
ansible.posix.authorized_key:
|
|
user: "{{ ssh_baseline_admin_user }}"
|
|
key: "{{ item.cle }}"
|
|
state: "{{ item.etat | default('present') }}"
|
|
comment: "{{ item.pourquoi | default(omit) }}"
|
|
loop: "{{ ssh_baseline_cles_admin }}"
|
|
loop_control:
|
|
label: "{{ item.pourquoi | default(item.cle[:40]) }} → {{ item.etat | default('present') }}"
|
|
when: not ansible_check_mode
|