ANSIBLE · SSH · HARDENING
Quand je parle de hardening SSH avec Ansible, mon objectif n’est pas de cocher une checklist théorique. Je veux surtout sécuriser l’accès d’administration d’un serveur Linux sans me retrouver dehors après un reload de sshd. Dans cet article, je montre d’abord la méthode manuelle, le pourquoi de chaque réglage, l’ordre sûr d’application, puis la façon dont je l’industrialise avec mon rôle Ansible.
📋 Au programme
Réponse rapide
Pour faire du hardening ssh ansible proprement, je procède toujours dans le même ordre : je vérifie qu’un utilisateur d’administration existe, que sa clé SSH fonctionne, que sudo marche, je sauvegarde la configuration actuelle, je modifie sshd_config, je valide avec sshd -t, puis je recharge le service et je teste une nouvelle session avant de couper définitivement les méthodes risquées comme l’authentification par mot de passe.
L’idée clé
Le vrai danger n’est pas seulement l’attaque externe. Le vrai danger, c’est de te verrouiller toi-même hors du serveur en appliquant un durcissement SSH dans le mauvais ordre.
Pourquoi durcir SSH est la première brique de sécurité
SSH reste la porte d’entrée standard pour administrer un serveur Linux. Tant que cet accès est mal protégé, le reste du hardening perd une partie de sa valeur. Je vois régulièrement des serveurs exposés avec PasswordAuthentication yes, un compte root encore autorisé à se connecter directement, ou des clés SSH mal distribuées. Dans ce contexte, un simple bruteforce, une fuite de mot de passe ou une mauvaise habitude d’exploitation suffit pour transformer un accès d’admin en point de compromission.
Je préfère donc séparer les sujets. Ici, je me concentre uniquement sur SSH : l’authentification, le compte root, les clés, la validation de configuration et l’ordre de déploiement. Le firewall, Fail2ban et le hardening système global méritent leur propre traitement. Cette séparation est utile autant pour le SEO que pour la pratique : on garde un article lisible et un plan d’action concret.
Ne mélange pas tout
Si tu essaies de traiter SSH, le firewall, Fail2ban, les mises à jour, l’audit et les permissions dans un seul changement, tu augmentes le risque de te perdre et de casser l’accès admin.
Ce que je vérifie avant toute modification
✅ Checklist de sécurité avant durcissement SSH
sudo/etc/ssh/sshd_configsshd -t avant tout reloadsudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
sudo sshd -t
Cette étape a l’air basique, mais c’est là que se joue la différence entre une opération propre et un incident d’exploitation. Le hardening SSH n’est pas compliqué techniquement. Il devient dangereux quand il est fait trop vite, sans filet de sécurité et sans séquencement.
Ma méthode manuelle pas à pas
Quand je dois sécuriser un serveur Linux manuellement, je procède toujours en deux temps. D’abord je m’assure que l’accès sain existe. Ensuite seulement je coupe les accès risqués.
1. Vérifier ou créer l’utilisateur admin
sudo adduser linux-man
sudo usermod -aG sudo linux-man
Le but est d’éviter toute dépendance au compte root pour l’administration quotidienne. Un compte nominatif, avec sudo, est plus traçable et plus simple à gérer dans le temps.
2. Installer la clé publique
sudo mkdir -p /home/linux-man/.ssh
echo "ssh-ed25519 AAAA... votre-cle-publique" | sudo tee /home/linux-man/.ssh/authorized_keys > /dev/null
sudo chmod 700 /home/linux-man/.ssh
sudo chmod 600 /home/linux-man/.ssh/authorized_keys
sudo chown -R linux-man:linux-man /home/linux-man/.ssh
À ce stade, j’ouvre une seconde session SSH pour vérifier que la connexion par clé fonctionne réellement. Tant que ce test n’est pas concluant, je ne touche pas à l’authentification par mot de passe.
3. Modifier la configuration SSH
Selon les distributions, le fichier principal reste /etc/ssh/sshd_config. Je garde une conf lisible, sans accumulation de vieilles directives commentées dans tous les sens.
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
ChallengeResponseAuthentication no
UsePAM yes
X11Forwarding no
MaxAuthTries 3
LoginGraceTime 30
ClientAliveInterval 300
ClientAliveCountMax 2
Je ne change pas systématiquement le port SSH. Ce réglage peut réduire le bruit des scans les plus simples, mais il ne remplace jamais une authentification propre par clé, ni une politique d’accès cohérente.
4. Valider avant reload
sudo sshd -t
sudo systemctl reload ssh
# ou selon la distribution
sudo systemctl reload sshd
Le test de syntaxe est non négociable. Un reload avec une mauvaise configuration peut casser l’accès immédiatement. Ensuite, je teste une nouvelle session depuis un autre terminal. Si ça passe, je considère le changement validé.
Erreur classique
Couper PasswordAuthentication ou PermitRootLogin avant d’avoir validé une connexion par clé sur un utilisateur admin dédié est la meilleure façon de se lock-out.
Les directives SSH que je veux vraiment comprendre
PermitRootLogin no
Interdit la connexion SSH directe du compte root. C’est un bon réflexe, mais seulement si un compte admin opérationnel existe déjà.
PasswordAuthentication no
Supprime les connexions par mot de passe et réduit fortement le risque de bruteforce. Là aussi, on ne l’active qu’après test de la connexion par clé.
PubkeyAuthentication yes
C’est la base de la méthode : des clés, pas de mot de passe, et un contrôle fin des comptes autorisés.
MaxAuthTries / LoginGraceTime
Ce ne sont pas les réglages les plus visibles, mais ils réduisent le confort d’attaque et resserrent le comportement du démon SSH.
Tu remarqueras que je ne transforme pas cet article en guide de hardening global. Je ne détaille pas UFW ici, parce que l’objectif est vraiment de rendre SSH propre, compréhensible et déployable sans risque. Pour le firewall, je traiterais ça à part.
Pourquoi je passe ensuite à Ansible
Faire ce travail à la main est utile une fois, parce que ça force à comprendre ce qu’on change. En revanche, sur plusieurs serveurs, ce n’est pas tenable. Tu t’exposes vite à des écarts de configuration, des oublis, des validations faites trop vite, ou des déploiements non reproductibles. C’est exactement là qu’Ansible devient intéressant.
Avec un rôle, je peux standardiser les directives, garder mes variables lisibles, versionner les choix de sécurité et rejouer le même durcissement de façon cohérente. Ça ne remplace pas la compréhension manuelle, ça l’industrialise.
La bonne approche
Je recommande de faire une première passe manuelle sur un serveur de test, puis d’utiliser le rôle Ansible pour fiabiliser et reproduire exactement la même méthode partout.
Exemple de playbook avec le rôle et détail des variables
Le repo babidi34/ansible-role-secure-os me sert justement à industrialiser cette logique. L’idée n’est pas de cacher la complexité sous le tapis, mais de transformer une méthode fiable en déploiement reproductible.
---
- name: Harden SSH on Debian servers
hosts: debian_servers
become: true
roles:
- role: secure-os
vars:
ssh_allow_users:
- linux-man
ssh_passwordauthentication: "no"
ssh_permit_root_login: "no"
ssh_max_auth_tries: 3
ssh_login_grace_time: "30"
use_fail2ban: true
authorized_ports_tcp:
- 22
- 443
Ce que j’aime dans cette approche, c’est qu’on voit immédiatement les choix de sécurité appliqués.
Dans ce rôle, les variables SSH principales exposées par défaut sont notamment ssh_allow_users, ssh_passwordauthentication, ssh_permit_root_login, ssh_max_auth_tries, ssh_login_grace_time, use_fail2ban et authorized_ports_tcp. J’ai repris ici les vraies variables du rôle pour que l’exemple soit directement cohérent avec le repo.
🔐
ssh_permit_root_login
Je le mets à "no" quand un compte admin avec clé a déjà été validé.
🗝️
ssh_passwordauthentication
Cette variable contrôle l’authentification par mot de passe SSH. Je la mets à "no" une fois la connexion par clé validée.
👤
ssh_allow_users
Liste des utilisateurs autorisés à se connecter en SSH. C’est la variable la plus simple pour restreindre l’accès.
⏱️
ssh_max_auth_tries / ssh_login_grace_time
Ces deux variables permettent de resserrer le comportement du démon SSH sans compliquer inutilement l’exploitation.
Un bon rôle Ansible ne doit pas t’éviter de réfléchir. Il doit t’éviter de refaire à la main, de façon inconstante, des choix que tu as déjà validés techniquement.
FAQ
▶ Est-ce qu’il faut forcément changer le port SSH ?
▶ Quelle est la première erreur à éviter ?
▶ Pourquoi faire d’abord la méthode manuelle si j’ai déjà un rôle Ansible ?
▶ Est-ce que cet article couvre tout le hardening serveur ?
Conclusion
Le plus important dans le hardening SSH avec Ansible n’est pas la sophistication de la configuration. C’est la méthode. Si tu comprends d’abord la logique manuelle, les garde-fous et l’ordre d’application, tu peux ensuite automatiser sans transformer chaque déploiement en roulette russe. C’est exactement comme ça que je vois le rôle : non pas comme une boîte noire, mais comme une manière fiable de reproduire une procédure saine.
Tu veux sécuriser SSH proprement sur tes serveurs Linux ?
Je peux t’aider à mettre en place un durcissement cohérent, automatisé avec Ansible, sans prise de risque sur l’accès d’administration.

