SSH est la porte d'entrée de ton serveur Linux. C'est aussi la cible numéro un des attaquants : expose un serveur sur Internet avec le port 22 ouvert, et tu verras les premières tentatives de brute force arriver en moins d'une heure. Bots automatisés, dictionnaires de mots de passe, credential stuffing… le bruit de fond est permanent.

La bonne nouvelle : durcir SSH ne demande ni budget ni outil exotique. Avec une configuration soignée de sshd_config et quelques briques complémentaires, tu élimines l'immense majorité des attaques opportunistes. Voici 10 mesures concrètes, classées par ordre de priorité, avec les directives exactes à appliquer.

~5 000Tentatives/jour port 22serveur exposé sur Internet
N°1Port le plus scannéle port 22 attire tous les bots
< 1 hAvant le 1er brute forceaprès exposition du serveur

Le piège classique : le lockout. Une erreur dans sshd_config et tu perds l'accès à ton propre serveur. Règle d'or : garde toujours une session SSH ouverte pendant que tu modifies la configuration, teste la connexion dans un second terminal, et valide la syntaxe avec sshd -t avant tout systemctl restart sshd. Si possible, garde aussi un accès console (KVM, console cloud) sous la main.

Les 10 mesures, dans l'ordre

Clés ed25519 → Désactiver mots de passe → fail2ban → Audit des logs → Serveur durci

1. Remplace les mots de passe par des clés ed25519

C'est la mesure qui change tout. Un mot de passe se devine, se brute-force, se réutilise. Une clé ed25519 (courbe elliptique moderne, rapide, clés courtes) est hors de portée de toute attaque par dictionnaire. Génère ta paire de clés côté client, avec une passphrase :

ssh-keygen -t ed25519 -a 100 -C "jean@poste-admin"
ssh-copy-id -i ~/.ssh/id_ed25519.pub [email protected]

Le flag -a 100 augmente le nombre de rounds de dérivation de la passphrase : si ta clé privée est volée, elle reste coûteuse à casser. Préfère ed25519 à RSA : à sécurité équivalente, les clés sont plus courtes et les opérations plus rapides. Une fois la connexion par clé validée (depuis un second terminal !), désactive l'authentification par mot de passe :

# /etc/ssh/sshd_config
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitEmptyPasswords no

2. Interdis la connexion root directe

Le compte root existe sur tous les serveurs Linux : c'est le premier login que les bots testent. En l'interdisant, tu forces l'attaquant à deviner à la fois un nom d'utilisateur et un secret. Bonus : tu obtiens une traçabilité réelle, chaque admin se connecte avec son propre compte puis élève ses privilèges via sudo.

# /etc/ssh/sshd_config
PermitRootLogin no

Si un outil d'automatisation exige root (sauvegardes, déploiement), utilise PermitRootLogin prohibit-password avec une clé dédiée et restreinte — jamais yes.

3. Restreins les comptes autorisés avec AllowUsers

Par défaut, tout compte local possédant un shell peut tenter une connexion SSH — y compris les comptes de service créés par des paquets. Whiteliste explicitement les comptes légitimes :

# /etc/ssh/sshd_config
AllowUsers admin deploy
# Variante par groupe :
# AllowGroups ssh-users

Tu peux même combiner utilisateur et source : AllowUsers [email protected].* n'autorise le compte admin que depuis ton réseau d'administration (VPN WireGuard, par exemple).

4. Change le port… en connaissant ses limites

Déplacer SSH du port 22 vers un port non standard (par exemple 2222 ou 49152) réduit drastiquement le bruit des scans automatisés dans tes logs. Mais sois lucide : c'est de la réduction de bruit, pas de la sécurité. Un scan complet type nmap -p- -sV retrouve ton port en quelques minutes, et la bannière SSH le trahit immédiatement. Considère cette mesure comme un confort de lecture des logs, jamais comme une protection.

# /etc/ssh/sshd_config
Port 49152

# N'oublie pas le pare-feu AVANT de redémarrer sshd :
ufw allow 49152/tcp
ufw delete allow 22/tcp   # seulement après avoir validé la connexion

5. Installe fail2ban pour bannir les attaquants

fail2ban lit les logs d'authentification en temps réel et bannit (via nftables/iptables) toute IP qui multiplie les échecs. Même avec les mots de passe désactivés, il coupe court aux scans insistants et protège les autres services exposés.

apt install fail2ban

# /etc/fail2ban/jail.local
[sshd]
enabled  = true
port     = 49152
maxretry = 3
findtime = 10m
bantime  = 1h
# Bannissement progressif : double la durée à chaque récidive
bantime.increment = true

Vérifie le fonctionnement avec fail2ban-client status sshd : tu verras le nombre d'IP actuellement bannies. Sur un serveur exposé, attends-toi à des dizaines par jour.

6. Ajoute un second facteur : MFA TOTP sur SSH

Pour les serveurs sensibles, combine la clé ed25519 avec un code TOTP (Google Authenticator, Aegis, FreeOTP…). Même si la clé privée d'un admin fuit, l'attaquant bute sur le second facteur.

apt install libpam-google-authenticator
google-authenticator   # exécuté par chaque utilisateur, génère le QR code

# /etc/pam.d/sshd — ajouter :
auth required pam_google_authenticator.so

# /etc/ssh/sshd_config
KbdInteractiveAuthentication yes
AuthenticationMethods publickey,keyboard-interactive

La directive AuthenticationMethods publickey,keyboard-interactive exige les deux facteurs successivement : clé d'abord, code TOTP ensuite. Teste impérativement dans un second terminal avant de fermer ta session — c'est la mesure qui provoque le plus de lockouts.

7. Affiche une bannière légale

Une bannière d'avertissement avant authentification n'arrête aucun attaquant, mais elle a une valeur juridique réelle : elle établit que l'accès est restreint et que les connexions sont journalisées, ce qui renforce un dossier en cas de poursuites (article 323-1 du Code pénal sur l'accès frauduleux à un STAD).

# /etc/ssh/sshd_config
Banner /etc/ssh/banner.txt
# /etc/ssh/banner.txt
*** ACCES RESTREINT ***
Ce systeme est reserve aux utilisateurs autorises.
Toute connexion est journalisee. Tout acces non autorise
est passible de poursuites (art. 323-1 et s. du Code penal).

8. Réduis la surface : timeouts, tentatives, fonctionnalités inutiles

Chaque option activée par défaut est une surface d'attaque potentielle. Désactive ce que tu n'utilises pas et limite les fenêtres d'opportunité :

# /etc/ssh/sshd_config
MaxAuthTries 3          # 3 essais max par connexion
LoginGraceTime 30       # 30 s pour s'authentifier, sinon déconnexion
MaxSessions 4
ClientAliveInterval 300 # déconnecte les sessions mortes
ClientAliveCountMax 2
X11Forwarding no        # inutile sur un serveur headless
AllowAgentForwarding no # sauf besoin réel (rebond contrôlé)
AllowTcpForwarding no   # bloque les tunnels pivots
PermitTunnel no

Attention à AllowTcpForwarding no si tu utilises SSH comme bastion ou pour des tunnels légitimes (accès à une base de données interne, par exemple) : applique-le alors par utilisateur via un bloc Match User.

9. Audite régulièrement auth.log

Durcir sans surveiller, c'est piloter sans tableau de bord. Le fichier /var/log/auth.log (ou journalctl -u ssh sur les systèmes systemd récents) raconte tout : qui s'est connecté, d'où, et qui a échoué.

# Connexions réussies
grep "Accepted" /var/log/auth.log

# Échecs et comptes testés par les bots
grep "Failed password\|Invalid user" /var/log/auth.log \
  | awk '{print $NF}' | sort | uniq -c | sort -rn | head

# Top 10 des IP attaquantes
grep "Failed" /var/log/auth.log \
  | grep -oE "from [0-9.]+" | sort | uniq -c | sort -rn | head

Sur un parc de plusieurs machines, centralise ces logs (rsyslog, Wazuh, ou tout SIEM) : une connexion réussie depuis une IP inhabituelle à 3 h du matin doit déclencher une alerte, pas être découverte trois semaines plus tard.

10. Maintiens OpenSSH à jour et vérifie ta config

Les vulnérabilités SSH critiques existent — regreSSHion (CVE-2024-6387) a rappelé en 2024 que même OpenSSH n'est pas infaillible. Active les mises à jour de sécurité automatiques (unattended-upgrades sur Debian/Ubuntu) et prends l'habitude de valider chaque changement :

# Vérifier la syntaxe AVANT de redémarrer
sshd -t

# Voir la configuration effective (defaults inclus)
sshd -T | grep -Ei "permitrootlogin|passwordauth|port|allowusers"

# Appliquer
systemctl restart sshd

Des outils comme ssh-audit te donnent en une commande une note sur tes algorithmes d'échange de clés, de chiffrement et de MAC, avec les recommandations pour écarter les suites obsolètes.

Récapitulatif : un sshd_config durci et commenté

Voici l'assemblage des mesures précédentes, prêt à adapter à ton contexte :

# /etc/ssh/sshd_config — configuration durcie
Port 49152                          # réduction de bruit (pas une protection)
Protocol 2

# --- Authentification ---
PermitRootLogin no                  # jamais root en direct
PubkeyAuthentication yes
PasswordAuthentication no           # clés ed25519 uniquement
PermitEmptyPasswords no
KbdInteractiveAuthentication yes    # requis pour le TOTP
AuthenticationMethods publickey,keyboard-interactive
AllowUsers admin deploy             # whitelist explicite
MaxAuthTries 3
LoginGraceTime 30

# --- Surface d'attaque ---
X11Forwarding no
AllowAgentForwarding no
AllowTcpForwarding no
PermitTunnel no
ClientAliveInterval 300
ClientAliveCountMax 2

# --- Légal & logs ---
Banner /etc/ssh/banner.txt
LogLevel VERBOSE                    # journalise les empreintes de clés

Par où commencer ?

Si tu ne dois retenir que trois actions aujourd'hui : passe aux clés ed25519 et désactive les mots de passe (mesure 1), interdis root (mesure 2), installe fail2ban (mesure 5). Ces trois-là neutralisent l'écrasante majorité des attaques réelles observées sur un serveur exposé. Les autres mesures s'ajoutent ensuite, par couches, selon la sensibilité de la machine — c'est exactement le principe de la défense en profondeur.

Et garde le réflexe du pro : chaque modification de sshd_config se fait avec une session de secours ouverte, un sshd -t de validation, et un test de connexion indépendant avant de fermer quoi que ce soit.