SSH : durcissement du serveur
Réglages recommandés pour un serveur SSH exposé à Internet. Les exemples utilisent des noms génériques (deploy).
Règle d’or : ne pas se verrouiller hors du serveur
Section intitulée « Règle d’or : ne pas se verrouiller hors du serveur »- Garder une session SSH ouverte pendant toute la modification.
- Tester la syntaxe avant de recharger :
sudo sshd -t. - Tester une nouvelle connexion dans un autre terminal avant de fermer la session ouverte.
- Disposer d’un accès de secours (console de l’hébergeur).
Configuration dans un fichier dédié
Section intitulée « Configuration dans un fichier dédié »Ubuntu lit /etc/ssh/sshd_config.d/*.conf avant le reste de sshd_config. Créer un fichier qui précède ceux des autres paquets (ordre alphabétique) :
sudo tee /etc/ssh/sshd_config.d/00-durcissement.conf <<'CONF'PermitRootLogin noPasswordAuthentication noKbdInteractiveAuthentication noPubkeyAuthentication yesAuthenticationMethods publickeyMaxAuthTries 3LoginGraceTime 30X11Forwarding noAllowUsers deployClientAliveInterval 300ClientAliveCountMax 2CONFsudo sshd -t && sudo systemctl reload sshAvant de recharger, vérifier que la connexion par clé fonctionne (voir Clés SSH) : désactiver les mots de passe sans clé installée ferme l’accès.
Signification des réglages
Section intitulée « Signification des réglages »| Directive | Effet |
|---|---|
PermitRootLogin no |
Interdit la connexion directe en root (utiliser un compte et sudo) |
PasswordAuthentication no |
Interdit les mots de passe : seules les clés sont acceptées |
KbdInteractiveAuthentication no |
Ferme l’authentification interactive (autre voie de mot de passe) |
AuthenticationMethods publickey |
Exige une clé publique |
MaxAuthTries 3 |
Nombre d’essais par connexion |
LoginGraceTime 30 |
Délai (secondes) pour s’authentifier |
X11Forwarding no |
Désactive la redirection graphique |
AllowUsers deploy |
Seuls ces comptes peuvent se connecter (aussi AllowGroups) |
ClientAliveInterval, ClientAliveCountMax |
Ferme les sessions inactives (ici 300 s × 2) |
Vérifier la configuration effective
Section intitulée « Vérifier la configuration effective »sudo sshd -T | grep -E "^(permitrootlogin|passwordauthentication|allowusers|maxauthtries|authenticationmethods|x11forwarding) "sudo sshd -T -C user=deploy,host=poste,addr=203.0.113.5 # valeurs pour une connexion donnée (blocs Match)Exemple de résultat attendu :
maxauthtries 3permitrootlogin nopasswordauthentication nox11forwarding noallowusers deployauthenticationmethods publickeyTester depuis un autre terminal :
ssh deploy@serveur.exemple.com # doit fonctionnerssh -o PubkeyAuthentication=no -o PreferredAuthentications=password deploy@serveur.exemple.com # doit échouer : Permission denied (publickey)ssh root@serveur.exemple.com # doit échouerRecharger ou redémarrer
Section intitulée « Recharger ou redémarrer »sudo sshd -t # toujours avantsudo systemctl reload ssh # recharge sshd_config, sessions conservéessudo systemctl restart ssh # redémarre (les nouvelles connexions utilisent la nouvelle configuration)Les sessions ouvertes ne sont pas coupées par reload ni par restart : une configuration erronée n’affecte que les connexions suivantes, d’où l’intérêt de garder la session ouverte.
Changer le port
Section intitulée « Changer le port »Changer de port réduit le bruit des scans automatisés, mais n’est pas une protection (un scan de ports le retrouve). Sur Ubuntu, SSH démarre par activation de socket : modifier Port ne suffit pas.
echo "Port 2222" | sudo tee /etc/ssh/sshd_config.d/10-port.confsudo sshd -tsudo ufw allow 2222/tcp # autoriser le nouveau port AVANTsudo systemctl daemon-reloadsudo systemctl restart ssh.socketsudo ss -tlnp | grep ':2222' # écoute sur le nouveau portTesté sur Ubuntu 24.04 et 26.04 : avec seulement systemctl restart ssh.socket, le port reste 22 ; il faut daemon-reload puis restart ssh.socket. Tester ssh -p 2222 deploy@serveur.exemple.com dans un autre terminal avant de retirer l’ancien port du pare-feu (sudo ufw delete allow OpenSSH).
Règles par utilisateur ou par réseau : Match
Section intitulée « Règles par utilisateur ou par réseau : Match »# Accepter les mots de passe seulement depuis le réseau interneMatch Address 192.168.1.0/24 PasswordAuthentication yes
# Un groupe limité aux transferts de fichiers (voir « Transfert de fichiers »)Match Group sftponly ChrootDirectory /srv/sftp/%u ForceCommand internal-sftp AllowTcpForwarding noLes blocs Match s’écrivent en fin de fichier : ils s’appliquent jusqu’au prochain Match ou à la fin du fichier.
Limiter les redirections
Section intitulée « Limiter les redirections »AllowTcpForwarding no # interdit les tunnels (ou « local » pour n'autoriser que -L)AllowAgentForwarding noPermitTunnel noGatewayPorts noÀ activer par utilisateur avec Match si certains comptes ont besoin de tunnels.
Authentification à deux facteurs (facultatif)
Section intitulée « Authentification à deux facteurs (facultatif) »Un second facteur (code TOTP) s’ajoute à la clé avec libpam-google-authenticator :
sudo apt install libpam-google-authenticatorgoogle-authenticator # configuration par chaque utilisateurPuis AuthenticationMethods publickey,keyboard-interactive et KbdInteractiveAuthentication yes, et auth required pam_google_authenticator.so dans /etc/pam.d/sshd. Tester sur une session de secours : une erreur ici bloque l’accès.
Bannière et informations
Section intitulée « Bannière et informations »Banner /etc/issue.netPrintMotd noLa bannière s’affiche avant l’authentification (message d’avertissement légal). Ne pas y indiquer d’informations techniques.
Surveiller les connexions
Section intitulée « Surveiller les connexions »sudo journalctl -u ssh -n 50 --no-pagersudo journalctl -u ssh --since "1 hour ago" | grep -iE "failed|invalid|refused"last -n 10 # connexions réussiessudo lastb -n 10 # tentatives échouéesLe blocage automatique des adresses qui échouent est assuré par Fail2ban (voir Pare-feu : Fail2ban).
Dépannage
Section intitulée « Dépannage »| Symptôme | Piste |
|---|---|
sshd -t signale une erreur |
Ligne et fichier indiqués : directive inconnue ou faute de frappe |
sshd -T montre encore passwordauthentication yes |
Un fichier lu avant le vôtre (ls /etc/ssh/sshd_config.d/) : nommer le vôtre 00-… |
| Le port ne change pas | sudo systemctl daemon-reload puis sudo systemctl restart ssh.socket |
| Accès perdu après modification | Console de l’hébergeur : corriger ou retirer le fichier /etc/ssh/sshd_config.d/00-durcissement.conf, sudo systemctl reload ssh |
| Un utilisateur légitime est refusé | AllowUsers/AllowGroups ne l’inclut pas |
Match sans effet |
Le bloc doit être après les réglages généraux, et la condition doit correspondre (sshd -T -C …) |
Ubuntu 24.04 et 26.04 : différences à connaître
Section intitulée « Ubuntu 24.04 et 26.04 : différences à connaître »Les réglages de cette page sont identiques sur OpenSSH 9.6 (24.04) et 10.2 (26.04).
Pour aller plus loin
Section intitulée « Pour aller plus loin »- Manuel :
man sshd_config - Suite : Tunnels et rebonds