Skip to content
U UOpsLab
infra-devops tutoriels Debian SSH cybersecurite Linux

SSH sur Debian 13 : se connecter avec une clé plutôt qu’un mot de passe

Mettre en place suos Debian une connexion SSH par clé, désactiver le mot de passe et changer le port SSH proprement.

R

Raynal.T

12 min de lecture
Connexion SSH par clé sur Debian 13

Quand on installe un serveur Debian, SSH arrive très vite dans la conversation.

C’est pratique, indispensable même, mais c’est aussi l’une des premières portes que les robots vont venir tester si le serveur est exposé sur Internet.

Par défaut, beaucoup de machines acceptent encore une connexion avec :

utilisateur + mot de passe

Ça fonctionne. Mais côté sécurité, ce n’est pas l’idéal. Un mot de passe peut être faible, réutilisé, volé, testé automatiquement, ou simplement tapé un peu trop souvent au mauvais endroit.

L’objectif ici est donc simple : passer sur une connexion SSH par clé publique / clé privée, vérifier que tout fonctionne, puis couper l’authentification par mot de passe.

Clé privée

Elle reste sur le poste client. C’est elle qui prouve votre identité au moment de la connexion.

Clé publique

Elle est déposée sur le serveur dans le fichier authorized_keys de l’utilisateur.

Mot de passe coupé

Une fois la clé validée, les tentatives de brute force sur mot de passe deviennent inutiles.

Pourquoi passer sur une clé SSH ?

Avec une connexion par mot de passe, le serveur doit accepter qu’un client tente de s’authentifier en envoyant un secret humain.

Et un secret humain, c’est rarement parfait.

Même avec un bon mot de passe, le service SSH reste une cible classique :

  • ➡️ scan automatique du port 22 ;
  • ➡️ test de comptes courants comme root, admin, debian, test ;
  • ➡️ dictionnaires de mots de passe ;
  • ➡️ tentatives lentes pour passer sous les radars.

Avec une clé SSH, on change de logique.

Le serveur ne demande pas à recevoir votre mot de passe. Il vérifie que votre client possède bien la clé privée qui correspond à une clé publique autorisée côté serveur.

La clé privée ne doit jamais être copiée sur le serveur. Elle reste sur votre poste, idéalement protégée par une passphrase.

Changer le port SSH par défaut peut aussi aider à réduire le bruit dans les logs. Ce n’est pas une vraie protection cryptographique, et ça ne remplace pas les clés, mais passer de 22 à un port moins évident évite une partie des scans automatiques les plus basiques.

Clé ou mot de passe : la vraie différence

Connexion par mot de passe

Principe

Le serveur accepte un secret tapé par l’utilisateur.

Point faible

Le secret peut être testé, réutilisé, deviné, intercepté ou retrouvé dans une fuite.

Le problème

Tant que cette méthode reste active, un robot peut continuer à tenter sa chance.

Connexion par clé SSH

Principe

Le serveur vérifie une preuve cryptographique liée à une clé publique autorisée.

Point faible

La clé privée doit rester protégée, idéalement avec une passphrase solide.

Le gain

Une fois les mots de passe coupés, le brute force classique n’a plus de prise utile.

Dans les deux cas, il faut rester propre.

Une clé privée sans passphrase, stockée n’importe où, ce n’est pas magique. Mais une clé moderne, protégée, avec l’authentification par mot de passe désactivée côté serveur, c’est déjà un énorme cran au-dessus.

Avant de commencer

Pour la partie tuto, mon environnement de lab est le suivant :

  • 🔹une petite VM sous Debian 13 ;
  • 🔹le service SSH est déjà installé ;
  • 🔹l’utilisateur distant existe déjà.

Je vais utiliser ces valeurs dans les commandes, à adapter bien sûr en fonction de votre infra :

Utilisateur serveur : debian
Serveur             : srv-debian.uopslab.local
Clé côté client     : ~/.ssh/id_ed25519_srv-debian
Port SSH final      : 7122

1. Vérifier l’état SSH du serveur

Sur le serveur Debian, on commence par vérifier que le service SSH est bien présent et actif.

sudo systemctl status ssh

On peut aussi vérifier la configuration réellement prise en compte par OpenSSH :

sudo sshd -T | grep -E '^(port|pubkeyauthentication|passwordauthentication|kbdinteractiveauthentication|permitrootlogin|authorizedkeysfile)'

Sur une configuration classique, PubkeyAuthentication est déjà activé par défaut, vous devriez avoir une sortie de ce style :

port 22
permitrootlogin without-password
pubkeyauthentication yes
passwordauthentication yes
kbdinteractiveauthentication no
authorizedkeysfile .ssh/authorized_keys .ssh/authorized_keys2

2. Sauvegarder la configuration SSH

Avant de modifier quoi que ce soit, on sauvegarde le fichier principal.

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date +%F-%H%M)

Et on garde aussi une copie de la configuration effective, très pratique pour comparer après modification :

sudo sshd -T > ~/sshd-effective-before.txt

Le fichier principal sshd_config contient normalement une ligne Include /etc/ssh/sshd_config.d/*.conf en tête. Donc si vous ajoutez un fichier de configuration spécifique avec l’extension .conf, il sera pris en compte. C’est bien plus propre pour ajouter notre configuration sans transformer le fichier d’origine.

3. Générer la clé côté client

La paire de clés se génère sur le poste client, pas sur le serveur.

Sur Linux, macOS, ou Windows avec OpenSSH disponible dans le terminal, ici je vais le faire depuis mon WSL :

ssh-keygen -t ed25519 -a 100 -C "debian@srv-debian" -f ~/.ssh/id_ed25519_srv-debian

Vous serez invité à saisir une passphrase. Je conseille vraiment d’en mettre une, ça rajoute une barrière si quelqu’un récupère votre fichier de clé privée.

Donc après tout ça, vous obtenez cette sortie et les deux fichiers :

DooSys@UopsLAB:~$ ssh-keygen -t ed25519 -a 100 -C "DooSys@UopsLAB" -f ~/.ssh/id_ed25519_srv-debian
Generating public/private ed25519 key pair.
Enter passphrase for "/home/DooSys/.ssh/id_ed25519_srv-debian" (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/DooSys/.ssh/id_ed25519_srv-debian
Your public key has been saved in /home/DooSys/.ssh/id_ed25519_srv-debian.pub
The key fingerprint is:
SHA256:qntmTehzxz7qaneDY9cNY/uRD8XzFeXHHuBKTKfn91E debian@srv-debian
The key's randomart image is:
+--[ED25519 256]--+
|           . o  .|
|          o + .o.|
|           + o oE|
|          . +  o=|
|       .S  . . +=|
|      ...   + .o*|
|     ..o o o =+ o|
|     .B B B o .+ |
|    o*.BoB.o .. .|
+----[SHA256]-----+
~/.ssh/id_ed25519_srv-debian      # clé privée, à garder secrète
~/.ssh/id_ed25519_srv-debian.pub  # clé publique, à copier sur le serveur

4. Installer la clé publique sur le serveur

Donc sur le serveur, si vous n’avez pas encore de répertoire .ssh dans votre home, vous venez le créer comme ça :

sudo mkdir -p ~/.ssh
sudo chmod 700 ~/.ssh
sudo nano ~/.ssh/authorized_keys
sudo chmod 600 ~/.ssh/authorized_keys

Dans authorized_keys, on colle le contenu de la clé publique id_ed25519_srv-debian.pub, sur une seule ligne.

Puis on vérifie le propriétaire :

sudo chown -R "$USER:$USER" ~/.ssh

5. Tester la connexion par clé

Depuis le client, on force un test par clé uniquement :

ssh -i ~/.ssh/id_ed25519_srv-debian -o PreferredAuthentications=publickey -o PasswordAuthentication=no debian@srv-debian.uopslab.local

Si la connexion fonctionne, c’est bon signe. On est d’accord que vous pouvez aussi remplacer srv-debian.uopslab.local par l’IP de votre serveur.

Logo MobaXterm

Et côté client Windows ?

Personnellement, j’utilise MobaXterm pour gérer mes consoles SSH et RDP. On peut aussi y déclarer et générer ses clés SSH. Je pense que j’en ferai un tutoriel dédié prochainement.

6. Désactiver l’authentification par mot de passe

Une fois la connexion par clé testée, on peut verrouiller le serveur.

Sur Debian 13, je préfère créer un fichier dédié :

sudo nano /etc/ssh/sshd_config.d/99-key-only.conf

Avec ce contenu :

PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin prohibit-password

Explication rapide :

DirectiveRôle
PubkeyAuthentication yesAutorise l’authentification par clé publique
PasswordAuthentication noDésactive l’authentification SSH par mot de passe
KbdInteractiveAuthentication noCoupe les méthodes interactives qui peuvent encore passer par PAM
PermitRootLogin prohibit-passwordInterdit le login root par mot de passe, tout en laissant possible la clé si vraiment configurée

7. Changer le port SSH par défaut

Tant qu’on est dans la configuration SSH, on peut aussi changer le port par défaut.

Le port 22 est scanné en permanence. Mettre SSH sur un autre port ne rend pas le serveur invisible, mais ça réduit fortement le bruit automatique et les tentatives opportunistes.

Dans le même fichier :

sudo nano /etc/ssh/sshd_config.d/99-key-only.conf

On ajoute la directive Port.

Par exemple :

Port 7122
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin prohibit-password

Vous pouvez choisir un autre port, mais évitez les ports déjà utilisés par un autre service. Pour vérifier rapidement :

sudo ss -tulpn | grep ':7122'

Si la commande ne retourne rien, le port n’est probablement pas déjà en écoute.

Avec UFW :

sudo ufw allow 7122/tcp
sudo ufw status

Avec nftables ou un pare-feu côté hébergeur, il faut adapter la règle pour autoriser le TCP entrant sur 7122.

8. Valider la configuration avant reload

Avant de recharger SSH, on vérifie la syntaxe :

sudo sshd -t

S’il n’y a aucun retour, c’est bon.

Ensuite seulement, on recharge le service :

sudo systemctl reload ssh

Puis on vérifie la configuration effective :

sudo sshd -T | grep -E '^(port|pubkeyauthentication|passwordauthentication|kbdinteractiveauthentication|permitrootlogin)'

On doit obtenir quelque chose dans cet esprit :

port 7122
pubkeyauthentication yes
passwordauthentication no
kbdinteractiveauthentication no
permitrootlogin prohibit-password

9. Tester depuis un deuxième terminal

📢📢 Très important 📢📢 : on ne ferme pas la session déjà ouverte.

Depuis un deuxième terminal côté client :

ssh srv-debian

Sans entrée ~/.ssh/config, il faut préciser le port :

ssh -p 7122 -i ~/.ssh/id_ed25519_srv-debian debian@srv-debian.uopslab.local

Puis on teste volontairement que le mot de passe ne passe plus :

ssh -p 7122 -o PreferredAuthentications=password -o PubkeyAuthentication=no debian@srv-debian.uopslab.local

La connexion doit échouer, car le serveur ne doit plus accepter l’authentification par mot de passe.

10. En cas de problème

Si la connexion par clé ne fonctionne pas, les causes sont souvent très simples. Commencez par vérifier les permissions :

ls -ld ~/.ssh                     -> 700
ls -l ~/.ssh/authorized_keys      -> 600

Vérifiez aussi que la clé publique est bien sur une seule ligne dans authorized_keys.

Côté client, si besoin de plus d’infos, lancez une connexion en mode verbeux :

ssh -vvv -p 7122 -i ~/.ssh/id_ed25519_srv-debian debian@srv-debian.uopslab.local

Et côté serveur, regardez les logs :

sudo journalctl -u ssh -n 80 --no-pager

Et pas de panique, on a tout sauvegardé. Donc si vous avez besoin de revenir rapidement en arrière :

sudo mv /etc/ssh/sshd_config.d/99-key-only.conf /etc/ssh/sshd_config.d/99-key-only.conf.disabled
sudo sshd -t
sudo systemctl reload ssh

À retenir

Passer SSH en authentification par clé, ce n’est pas juste “remplacer un mot de passe par un fichier”.

C’est changer le modèle d’authentification :

  • ➡️ la clé privée reste côté client ;
  • ➡️ la clé publique est autorisée côté serveur ;
  • ➡️ le serveur vérifie une preuve cryptographique ;
  • ➡️ le mot de passe SSH peut ensuite être désactivé.

Et c’est surtout cette dernière étape qui casse l’intérêt du brute force classique. Les robots pourront toujours frapper à la porte. Mais sans authentification par mot de passe disponible, ils n’ont plus grand-chose à tester.

Sources

Cet article vous a-t-il été utile ?

Votre retour aide à mieux choisir les prochains sujets.

Retour aux articles
Share:

Suivre UOpsLab

Nouveaux articles, retours terrain et notes de lab.