Aller au contenu

SSH - Authentification par clé

L'authentification de base pour se connecter en SSH à un ordinateur s'effectue avec un nom d'utilisateur et un mot de passe. Outre le côté rébarbatif de devoir systématiquement ce mot de passe, cela entrave la bonne exécution de tâches automatisées à distance, telle qu'une sauvegarde quotidienne sur une machine distante par exemple. La sécurité est vraiment accrue car la passphrase seule ne sert à rien sans la clé privée, et vice-versa.

Pour ces raisons entre autres, il est nécessaire de s'authenfier à l'aide d'une clé SSH au lieu d'un mot de passe.

En résumé, on va créer une clé sur chaque serveur et échanger les clés de chacun afin qu'ils puissent s'authentifier entre eux par ce moyen.

L'authentification par clé fonctionne grâce à 3 composants :

  • Une clé publique : elle sera exportée sur chaque hôte sur lequel on souhaite pouvoir se connecter.
  • Une clé privée : elle permet de prouver son identité aux serveurs.
  • Une passphrase : Permet de sécuriser la clé privée (notons la subtilité, passphrase et pas password... donc « phrase de passe » et non pas « mot de passe »).

Génération des clés privée et publique

Sous Linux

Lancer la commande suivante pour générer la paire de clés qui permettra à l'utilisateur qui lance cette commande de s'authentifier avec elles.

ssh-keygen -t rsa -b 4096 -f ~/.ssh/Nom_du_serveur -C "nom de ma clé"

2 fichiers seront générés dans le dossier /home/utilisateur/.ssh de l'utilisateur ayant lancé la commande :

  • Nom_du_serveur : contient la clé privée et ne doit pas être dévoilé ou mis à disposition
  • Nom_du_serveur.pub : contient la clé publique. C'est elle qui sera mise sur les serveurs dont l'accès est voulu.

S'assurer que les bonnes permissions sont accordées sur le répertoire ~/.ssh/ et sur la clé générée.
Seul le propriétaire du répertoire doit pouvoir y écrire et lire la clé privée.
Lancer la commande suivante pour appliquer ces droits.

chmod 700 ~/.ssh and chmod 600 ~/.ssh/*"nom de ma clé"*

Sous Windows

Parmis les méthodes disponibles pour générer une paire de clés privée et publique sous Windows, il est possiblde d'utiliser PuttyGEN.
Page de téléchargement

Il suffit de cliquer sur Generate, de bouger la souris pour générer un mouvement aléatoire, renseigner les commentaires (à ne pas négliger pour s'y retrouver !), de mettre un mot de passe OU PAS !, puis de sauvegarder la clé privée (à l’abri pour ne pas risquer une usurpation d'identité) et la clé publique.
Copier également le texte visible dans la boite de dialogue dans un fichier texte pour plus tard.

Si nous choisissons d'indiquer un mot de passe, nous aurons donc 2 couches de sécurité : Le mot de passe ET l'échange de clés avec le serveur distant. Cependant, cela complexifiera les mécanismes automatisés (scripts, tâches planifiées).
Pour cette raison, on peut se satisfaire de l'échange de clés comme unique méthode d'authentification.

Précaution !

Sans mot de passe, il est primordial de déposer la paire de clé dans un répertoire auquel seul l'utilisateur aura accès.

Envoyer sa clé publique sur la machine Linux distante

Il s'agit ici d'ajouter sur le serveur Linux distant notre clé publique à la liste des clés autorisées à se connecter.
La clé sera ajoutée dans le fichier ~/.ssh/authorized_keys.

Depuis une machine Linux

Nous utiliserons ssh-copy-id pour envoyer notre clé publique avec la commande suivante :

ssh-copy-id -i ~/.ssh/Nom_du_serveur.pub -p 22 utilisateur@autre_serveur

Echange bilatéral

Il est parfois pratique de disposer d'un échange dans les 2 sens. Pour cela, procéder de même depuis le serveur distant vers le serveur local.

Depuis une machine Windows

Lorsque nous avons généré des clés avec Puttygen, nous avons copié la clé publique dans un fichier texte ressemblant à ceci :

ssh-rsa AAAAB3NzaC1yc2ERMC8zSF/ [...] qJpjoWALGQ== Ma description

Il faut éditer le fichier ~/.ssh/authorized_keys sur la machine Linux distante pour y ajouter notre clé publique.

nano ~/.ssh/authorized_keys

Se connecter avec ces clés

Depuis Linux

Il est possible de spécifier la clé à utiliser pour la connexion à l'hôte distant avec la commande suivante :

ssh -o "IdentitiesOnly=yes" -i <private key filename> <hostname>

Cependant, le plus pratique est de modifier le fichier ~/.ssh/config en y ajoutant la configuration à utiliser pour se connecter à une cible.

Host monserveur_distant.fr
HostName monserveur_distant.fr
User mon_utilisateur
Port 22
IdentityFile /home/mon_utilisateur/.ssh/La_clé_privée

Depuis Windows

Avec VSCode

Ajouter les extensions Remote - SSH, Remote - SSH: Editing Configuration files et Remote Explorer pour permettre à VSCode de se connecter à des hôtes distants en SSH, de pouvoir éditer le fichier de configuration associé et pouvoir naviguer dans l'arborescence distante.

Remote - SSH: Editing Configuration files présente l'intérêt de rester dans VSCode pour configurer l'accès SSH à des machines distantes. Cependant, il ne s'agit que d'un raccourci pour éditer le fichier %userprofile%\.ssh\config.

Contenu de ce fichier pour configurer l'utilisation d'une clé afin de se connecter à un hôte :

Host domain.fr
  HostName domain.fr
  User username_to_modify
  IdentityFile "C:\Users\user\My_defined_folder\My_key"

Il se peut que le format de la clé ne convienne pas... Il faut alors recharger la clé dans PuttyGen et utiliser le menu Conversions > Export OpenSSH key.

Avec Putty

Dans Putty, chercher l'option Connection > SSH > Auth > Credentials et indiquer le chemin vers la clé privée.

Dans un terminal

Ouvrir une invite de commande (cmd) ou PowerShell puis lancer la commande suivante :

ssh -i c:\ID\my_private_key user@hostname