Authentification SSH sécurisée avec une paire de clés
Introduction
SSH signifie “Secure Shell” et est un protocole réseau qui permet d’établir une connexion sécurisée, authentifiée et chiffrée via un réseau à un serveur. À l’origine, il a été développé pour un accès sécurisé aux lignes de commande distantes. Il existe également des extensions, comme “SFTP”, pour le transfert sécurisé de fichiers et de répertoires. Dans cet article, nous allons montrer comment, au lieu d’un mot de passe, une paire de clés cryptographiques peut être utilisée pour l’authentification. Une paire de clés est générée, la longueur de la clé étant nettement supérieure à celle d’un mot de passe. Grâce à l’authentification par clé publique SSH, une connexion unique peut également être réalisée de manière simple, en stockant la clé publique sur plusieurs serveurs.
SSH est également souvent utilisé comme moyen de transfert pour la gestion distribuée des versions de code source git.
Comment fonctionne l’authentification avec une paire de clés ?
Pour l’authentification, le serveur et le client génèrent chacun deux clés : une clé publique et une clé privée. La clé privée doit toujours rester secrète, tandis que la clé publique peut être rendue publique. Il est impossible de déduire la clé privée à partir de la clé publique. Cependant, sans connaître la clé privée, il est possible, en utilisant la clé publique d’une personne, de vérifier si des données ont été signées avec la clé privée de cette personne. Ce mécanisme constitue la base de l’authentification lors de l’établissement d’une connexion SSH.
Le processus d’établissement de la connexion du client au serveur par l’utilisation de l’authentification par clé publique se déroule de manière simplifiée comme suit :
- Le client établit une connexion avec le serveur.
- Le serveur envoie sa clé publique au client.
- Le client compare la clé publique envoyée par le serveur avec celle qu’il connaît pour ce serveur. Si la clé publique différente de celle qui est connue du client, la connexion est interrompue. Si le client ne connaît pas la clé publique du serveur, il demande à l’utilisateur s’il doit enregistrer l’empreinte digitale du serveur lors de la première connexion.
- Le serveur vérifie si le client possède la clé privée à l’aide de la clé enregistrée sur lui.
La clé privée est généralement chiffrée avec une phrase de passe sur l’ordinateur personnel. Avant utilisation, la clé privée doit donc d’abord être déchiffrée. Pour éviter cela à chaque connexion sur un serveur, la clé privée déchiffrée peut être stockée dans un “SSH-Agent”, permettant ainsi aux clients SSH locaux d’y accéder au besoin. L’entrée d’un mot de passe à chaque connexion sur un serveur est donc évitée.
Stockage de la clé publique sur le système cible
Le serveur OpenSSH couramment utilisé sous Linux recherche généralement la clé publique dans le fichier ~/.ssh/authorized_keys lors de la connexion du client. L’abréviation ~ représente votre répertoire personnel sur le serveur, par exemple /home/bob/. Si la clé correspondante y est trouvée, la connexion de l’utilisateur est autorisée.
Vous devez donc copier votre clé publique dans le fichier ~/.ssh/authorized_keys sur le serveur. Votre clé publique se trouve généralement dans le fichier ~/.ssh/id_rsa.pub sur l’ordinateur où vous avez généré votre paire de clés.
Clients Linux
Génération d’une paire de clés
Une paire de clés peut être générée sous Linux avec la commande
ssh-keygen -t rsa
Ici, vous serez invité à choisir une phrase de passe. Il s’agit d’un mot de passe qui chiffre la clé privée stockée dans un fichier sur votre ordinateur pour la protéger contre les accès non autorisés.
Pour éviter de devoir copier la clé publique manuellement, il existe l’outil ssh-copy-id sous Linux. Cet outil peut être utilisé comme suit, par exemple pour l’utilisateur “bob” :
ssh-copy-id bob@server.example.com
Vous serez invité à entrer le mot de passe pour la connexion SSH, et l’outil enregistrera la clé publique sur le serveur. Ensuite, vous pouvez tester la connexion sur le système cible :
ssh bob@server.example.com
Utilisation de l’agent SSH
Comme vous avez généralement protégé votre clé privée avec une phrase de passe, vous devrez la saisir à chaque connexion au serveur SSH. Pour éviter cela, un daemon a été créé qui s’exécute en arrière-plan sur votre ordinateur et stocke temporairement la phrase de passe en mémoire. Sur la plupart des ordinateurs de bureau Linux, ce daemon est démarré automatiquement, de sorte qu’en exécutant la commande
ssh-add
la clé privée existante déverrouillée peut être ajoutée à l’agent.
En cas d’erreur parce que le daemon ne fonctionne pas, il peut être démarré avec la commande
eval `ssh-agent`
en définissant automatiquement les variables d’environnement appropriées dans le shell actuel.
Clients Windows
Depuis la version 1709, Windows 10 inclut également un client SSH par défaut. Il n’est donc pas nécessaire d’installer un logiciel supplémentaire, comme sur la plupart des systèmes Linux. Sur les anciennes versions de Windows, vous pouvez utiliser par exemple l’outil Putty.
Pour utiliser le client, veuillez démarrer Microsoft PowerShell.
Ici, vous pouvez générer une nouvelle paire de clés avec la commande ssh-keygen -t rsa, où vous serez également invité à saisir une phrase de passe :

Vous pouvez alors afficher votre clé publique avec cat ~/.ssh/id_rsa.pub :

Votre clé publique doit maintenant également être stockée sur le serveur. Pour ce faire, connectez-vous au serveur avec la commande ssh bob@example.com et modifiez le fichier ~/.ssh/authorized_keys avec un éditeur de texte comme “nano” :
nano ~/.ssh/authorized_keys
Après avoir entré votre clé publique sur le serveur, vous ne devriez plus être invité à entrer un mot de passe lors de la connexion au serveur.
Sécurisation du système cible
Une fois les clés publiques stockées sur le serveur Linux, il est conseillé d’augmenter la sécurité en désactivant l’authentification par mot de passe sur le serveur. Avant de désactiver l’authentification par mot de passe, veuillez vérifier si la connexion via l’authentification par clé publique SSH fonctionne sans avoir à entrer de mot de passe pour le serveur.
Cela peut être configuré dans le fichier /etc/ssh/sshd_config sur le serveur avec la ligne suivante :
PasswordAuthentication no
Après avoir effectué des modifications dans ce fichier, le serveur SSH doit être redémarré. Cela peut se faire sur les systèmes Linux utilisant “systemd” en saisissant la commande suivante :
systemctl restart ssh.service
La connexion SSH en cours est généralement maintenue.
Transfert de fichiers avec SCP
Le protocole “Secure Copy” (SCP), basé sur SSH, permet de transférer des fichiers et des répertoires, ce qui peut être effectué par exemple pour un répertoire à l’aide de la commande suivante :
scp -r /home/bob/Dokumente/ bob@server.example.com:/home/bob/Backup/
De plus, il existe le protocole SFTP, qui, à la différence de SCP, permet également le transfert des droits de répertoire. Il fonctionne cependant de manière interactive, ce qui rend le transfert des fichiers un peu plus lent. Pour SFTP, vous pouvez par exemple utiliser le client FileZilla.
Les clients des deux protocoles peuvent généralement accéder à un agent SSH.
Conclusion
Cet article a montré comment générer une paire de clés et y accéder à distance sur des serveurs. Ce type d’authentification offre non seulement plus de sécurité, mais évite également de devoir entrer un mot de passe pour chaque nouvelle connexion SSH.
Références
- RFC Standard n° 4252 : “Le protocole d’authentification Secure Shell (SSH)”, Internet Engineering Task Force
- ssh.com, SSH Communications Security, Inc.
- SSH - Secure Shell, HTW Chur