Sécuriser l'accès SSH d'un serveur neuf

Dix minutes après la livraison, avant toute autre chose : un compte personnel, connexion par clé uniquement, un port non standard, un pare-feu, et un bannissement du brute force.

débutant~10 min de manipulation
#ssh#linux#security#example

Pas encore validée de bout en bout — sois le premier.Signaler un problème

Brouillon — pas encore exécuté de bout en bout. Cette page est écrite mais son auteur ne l'a pas encore déroulée sur une vraie machine. Des commandes peuvent être fausses : lis avant de lancer, et dis-nous ce qui casse.

En un coup d'œilAvant et après, en une image
Ton serveur
ssh -p 22, refusedban
Ton portable~/.ssh/id_ed25519
Les robots d'internetroot / password…
Pare-feu/tcp only
sshdkeys only · no root
fail2ban3 failures → 1h ban
Ton compte · sudo

Seule ta clé atteint sshd, sur ton port, à travers le pare-feu. Root et mots de passe sont refusés ; avec fail2ban, les récidivistes sont bannis avant même d'atteindre sshd.

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

te posera une question
$ssh-keygen -t ed25519 -C "@laptop"
Vérification
$cat ~/.ssh/id_ed25519.pub
Retour attendu
ssh-ed25519 AAAA… @laptop
QuoiAvantAprès cette page
Qui peut se connecterroot, quiconque a le mot de passe, avec une clé
Port22
Mots de passe fauxillimités3, puis banni une heure

Créer ton propre utilisateur

$ssh root@
te posera une question
$adduser
$usermod -aG sudo
$rsync --archive --chown=: ~/.ssh /home/
Vérification
$ssh @ sudo -n true && echo OK
Retour attendu
OK
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-nopasswd

Fais-le seulement si le compte est protégé par une clé, ce que l'étape suivante impose.

Durcir le démon SSH

/etc/ssh/sshd_config.d/00-hardening.conf
Port
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
Vérification
$sudo sshd -t && echo syntax OK
Retour attendu
syntax OK

Pare-feu

Commande sensible — peut couper ton propre accès (pare-feu). Vérifie avant d'exécuter.
$sudo apt install -y ufw
$sudo ufw allow /tcp
$sudo ufw enable
Vérification
$sudo ufw status
Retour attendu
Status: active
/tcp                  ALLOW       Anywhere

Redémarre maintenant SSH et, depuis un second terminal, connecte-toi sur le nouveau port :

$sudo systemctl restart ssh
Vérification
$ssh -p  @ echo connected
Retour attendu
connected
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 -t signale 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
/etc/fail2ban/jail.d/sshd.local
[sshd]
enabled = true
port =
maxretry = 3
bantime = 1h
$sudo systemctl enable --now fail2ban
Vérification
$sudo fail2ban-client status sshd | head -3
Retour attendu
Status 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 @

Tout a fonctionné ?

Si tu as suivi cette page jusqu'au bout sur une vraie machine, dis-le. Ta validation est datée et enregistre ta stack : le prochain lecteur sur le même chemin sait que ça marche toujours.

Cette copie est en lecture seule. Pour dire que ça marche, ou que ça ne marche pas, ouvre une issue

Seuls tes choix de stack sont enregistrés, jamais tes valeurs. Le pseudo reste sur ce navigateur.