Un serveur qui sort de chez l'hébergeur répond à root avec un mot de passe, sur le port 22, à tout internet. Dans l'heure, des robots essaient des mots de passe. Cette page ferme ces portes en cinq étapes, chacune vérifiée avant la suivante.
Avant de commencer
$ssh-keygen -t ed25519 -C "@laptop"$cat ~/.ssh/id_ed25519.pubssh-ed25519 AAAA… @laptop
| Quoi | Avant | Après cette page |
|---|---|---|
| Qui peut se connecter | root, quiconque a le mot de passe | , avec une clé |
| Port | 22 | |
| Mots de passe faux | illimités | 3, puis banni une heure |
Créer ton propre utilisateur
$ssh root@$adduser $usermod -aG sudo $rsync --archive --chown=: ~/.ssh /home/$ssh @ sudo -n true && echo OKOK
Si sudo demande un mot de passe
Debian et Ubuntu n'accordent le sudo sans mot de passe à personne par défaut ; sudo -n échoue alors. Soit tu tapes le mot de passe (très bien), soit tu autorises le groupe sans mot de passe :
$echo '%sudo ALL=(ALL) NOPASSWD:ALL' | sudo tee /etc/sudoers.d/90-sudo-nopasswdFais-le seulement si le compte est protégé par une clé, ce que l'étape suivante impose.
Durcir le démon SSH
Port PermitRootLogin noPasswordAuthentication noKbdInteractiveAuthentication no$sudo sshd -t && echo syntax OKsyntax OK
Pare-feu
$sudo apt install -y ufw$sudo ufw allow /tcp$sudo ufw enable$sudo ufw statusStatus: active /tcp ALLOW Anywhere
Redémarre maintenant SSH et, depuis un second terminal, connecte-toi sur le nouveau port :
$sudo systemctl restart ssh$ssh -p @ echo connectedconnected
Si la nouvelle connexion échoue
Ton premier terminal est toujours connecté : rien n'est perdu. Par ordre de probabilité :
- Le pare-feu ne liste pas
: refais l'étape pare-feu. sshd -tsignale une erreur : corrige le fichier complémentaire, redémarre à nouveau.- L'hébergeur a son propre pare-feu réseau devant le serveur (courant chez OVH, Hetzner, les clouds) : ouvre le port là aussi.
- Tu testes depuis le premier terminal par erreur : ouvres-en un nouveau.
Bannir le brute force
$sudo apt install -y fail2ban[sshd]enabled = trueport = maxretry = 3bantime = 1h$sudo systemctl enable --now fail2ban$sudo fail2ban-client status sshd | head -3Status for the jail: sshd |- Filter | |- Currently failed: 0
Si tu te bannis toi-même
Trois fautes de frappe d'affilée depuis ta propre adresse et tu es dehors pour une heure. Depuis une autre adresse (partage de connexion du téléphone, console de l'hébergeur), débannis-toi :
$sudo fail2ban-client set sshd unbanip Pour ne jamais bannir ton bureau ou ta maison, ajoute ignoreip = 203.0.113.0/24 à la jail.
Terminé
Root est dehors, les mots de passe sont refusés, le port est hors des sentiers battus, et les récidivistes sont bannis. Désormais tu te connectes avec :
$ssh -p @