SSH : Accès par clé publique

Dans cet article nous allons voir les bases de ce qu’est SSH et comment s’en servir, coté client.

Descriptions générale

SSH pour Secure SHell, est un protocole réseau permettant de communiquer de manière sécurisé entre deux machines. Il tire parti des avantages de la cryptographie asymétrique et symétrique.
Ce protocole est actuellement en version 2.X. Sa version 1 est obsolète depuis 2006, elle ne doit plus être utilisée (si vous ne savez pas quelle version vous utilisez, vous utilisez très probablement la version 2).
SSH utilise une architecture client serveur, pour information Octopuce utilise exclusivement l’implémentation libre du serveur : OpenSSH, qui est largement la plus répandue.
Le protocole SSH permet premièrement aux machines de communiquer de manière sécurisé (et donc au client de faire exécuter des commandes au serveur) mais le protocole permet également le transfert de fichier notamment via SCP, Rsync, ou SFTP.

Vocabulaire

Client SSH : le logiciel dont vous disposez sur votre machine « personnelle ». Il permet de se connecter à un serveur, typiquement il s’agit de : openssh-client ou putty et dans le cas de transfert de fichier il y a trop de candidats pour tous les nommer, mais on peut penser à FileZilla (qui fait office de client SFTP), ou WinSCP (pour faire du SCP).
Serveur SSH : le logiciel installé sur le serveur (la machine), nous n’utilisons que openSSH. (Attention il est commun que les serveurs (machines) disposent d’un client SSH d’installé afin de pouvoir se connecter à un autre serveur).
Clef SSH : On parle souvent de paire de clef SSH, c’est une référence à l’utilisation de la cryptographie asymétrique pour identifier un client qui tente de se connecter au serveur. Physiquement il s’agit d’un fichier présent sur votre machine personnelle, dont la contrepartie est présente sur le serveur. Dans la paire de clef il existe une clef privée que vous ne devez JAMAIS donner à quiconque, elle est stockée sur votre machine personnelle et une clef publique qui sera stockée sur le ou les serveurs avec lesquels vous souhaitez pouvoir vous connecter. On les appelle parfois aussi Certificats client (le format n’est pas le même dans ce cas)
Agent SSH : C’est un outil qui améliore le confort d’utilisation des clients ssh et potentiellement un peu leur sécurité, il s’agit de se souvenir pour un temps donné de la clef privée de l’utilisateur afin de pouvoir ouvrir plusieurs connexions sans avoir à retaper le mot de passe, il permet également de « forward » cette clef, ce qui peut être utile, notamment dans le cas où l’on utilise des bastions.

Fonctionnement (approximatif)

Afin d’établir une connexion à un serveur vous renseignez dans votre client SSH un utilisateur et une IP ainsi que la clef privée associée

Exemple de connexion à un serveur

À ce moment le client envoie au serveur (ici 192.0.2.14) une demande d’identification pour l’utilisateur « monuser » qui dispose de la clef « .ssh/maclef.key ».
À aucun moment la clef n’est envoyée en clair, le client envoie un fingerprint (mais on ne va pas rentrer dans les détails).
Si le serveur a bien connaissance du fait que cet utilisateur dispose de la clef publique correspondant à cette clef privée alors il autorise l’accès.
Dans les logs cela donne quelque chose de similaire à l’image suivante


Connexion accepté par un serveur après une connexion avec une clef

Une fois connecté au serveur vous pouvez utiliser votre ligne de commande comme vous le feriez sur n’importe quel Linux.
Les utilisateurs de Microsoft Windows avec PuTTY trouveront une explication pas à pas en bas de cet article.

Remarque : il est possible de se connecter avec le protocole SSH sans utiliser de clef en utilisant un mot de passe. Mais pas chez Octopuce* où nous avons fait le choix de seulement permettre l’authentification par clef (pour information : même avec un mot de passe, le protocole SSH utilise de la cryptographie asymétrique, grâce à Diffie-Hellman, mais c’est compliqué).

*Pour certaines connexions SFTP cela est possible

Création de clef SSH

GNU/Linux et MacOS et windows10

Cette partie décrit comment créer une paire de clef avec le client open-ssh
Avec une clef ed25519 :
Il existe plusieurs « types » de paires de clefs, on évoquera dans cette article ed25519 et RSA. Les clefs à courbe elliptique (comme ed25519) sont plus sécurisées que le contreparties RSA mais relativement récentes dans le protocole SSH, si vous disposez de serveurs plus vieux que ceux disponibles sur Debian Wheezy (il faut mettre à jour !) il est possible qu’il ne les acceptent pas.
ssh-keygen -t ed25519 -b 521 -f tutotest.key -C "Clef de demonstration"
Remarque : quand on utilise ed25519 la taille de la clef est optionnelle car elle est fixée à 256 bits

Génération d’une paire de clef ed25519 avec OpenSSH

Options usuelles pour ssh-keygen :
-t type de la paire de clef SSH
-f nom du fichier contenant la clef privée
-b taille en bits de la clef
-C commentaire associé à la clef

Nous recommandons l’utilisation d’un mot de passe sur votre clef privée afin que même si quelqu’un avait accès à votre ordinateur il ne puisse pas se faire passer pour vous.
Avec une clef RSA :
Les clefs RSA sont plus anciennes mais toujours fiables, en revanche elles sont plus lentes, plus lourdes et nécessitent d’être bien plus grosses pour avoir un intérêt en terme de sécurité que les courbe elliptiques. Les commandes restent similaires

Windows (avec Putty)

Jusqu’à récemment Windows ne disposait pas de client SSH intégré, il fallait donc utiliser le logiciel Putty qui sert de client SSH, d’agent et permet aussi générer des clefs (mais pas au format Openssh, sinon ca serait trop simple). Nous allons détailler les étapes pour créer sa paire de clef, se connecter à un serveur.

Avec une clef ed25519 :
Il s’agit simplement d’ouvrir le logiciel PuTTY Key Generator puis de sélectionner la puce ed25519 en bas et enfin de cliquer sur Generate afin de générer la paire de clef.

Génération d’une paire de clef ed25519 avec PuTTY

Nous recommandons l’ajout d’une passphrase qui vous sera demandé à chaque utilisation de la clef privée, ainsi qu’un commentaire afin de pouvoir plus facilement identifier la clef.
Afin de pouvoir vous connecter avec la clef générée ainsi vous devez au préalable fournir la clef publique (surlignée en bleu) à Octopuce afin de l’ajouter sur votre infrastructure.
Enfin pensez bien à sauvegarder la clef privée associée à la clef publique que vous venez de générée.

Avec une clef RSA :
La méthode est très similaire à la création d’une clef ed25519 attention cependant à bien nous fournir une clef avec un nombre de bits supérieur ou égal à 2048 (avec un maximum de 4096).
Les mêmes précautions d’usage sont à prendre concernant l’utilisation d’un mot de passe sur la clef privée.

Génération d’une paire de clef RSA avec PuTTY

Même remarque qu’au dessus n’oubliez pas de faire parvenir à Octopuce votre clef public, attention les clef RSA font souvent plusieurs lignes, copiez là bien complètement.

Pour aller plus loin

Agents SSH

Comme expliqué plus haut les agents SSH permettent de sauvegarder temporairement vos clefs pour une utilisation ultérieur sans avoir à retapper le mot de passe.

ssh-agent

Pour Linux, MacOs et probablement windows10 l’agent de choix est ssh-agent (il en existe d’autres). Nous n’allons pas aller trop en profondeur dans son fonctionnement mais simplement donner un exemple de base pour faire ce que l’on souhaite.

On ouvre un nouveau terminal et on tape
ssh-agent
Ce qui vous renverra quelque chose du genre :
SSH_AUTH_SOCK=/tmp/ssh-ECCAE6q4TtNX/agent.30733; export SSH_AUTH_SOCK;
SSH_AGENT_PID=30734; export SSH_AGENT_PID;
echo Agent pid 30734;

Vous pouvez maintenant ajouter les clefs que vous souhaitez à cette instance de votre agent, par exemple
ssh-add .ssh/tutotest.key
On vous demandera à ce moment là de rentrer votre mot de passe, une fois cela fait vous pourrez vous connecter aux serveurs (comme vu au dessus) sans avoir à rentrer à nouveau vos mots de passe et même utiliser d’autres serveurs avec la même paire de clef.

ssh config

Il est possible dans openssh d’utiliser un fichier de configuration pour se faciliter la vie nous n’entrerons pas dans les détails mais le manuel et une rapide recherche sur internet peuvent vous apporter des réponses.
Host servername
HostName 192.0.2.14
Port 22
User monuser
IdentityFile ~/.ssh/tutotest.key

Il est maintenant possible de se connecter en tapant simplement
ssh servername

Une connexion SSH avec Putty

Lorsque vous ouvrez le logiciel PuTTY vous arriverez sur une fenêtre similaire à

Fenêtre d’accueil de PuTTY

Commencez par remplir le hostname (il peut s’agir d’un nom de domaine : example.com, ou d’une addresse IP : 192.0.2.14). Pensez également bien à préciser qu’il s’agit d’une connexion SSH en sélectionnant la puce SSH au milieu de la fenêtre.

Exemple d’adresse IP pour une connexion

Il vous faut maintenant préciser où se trouve votre clef privée afin de permettre la connexion au serveur (si vous disposez de plusieurs paires de clef SSH veillez à bien sélectionné celle correspondant au serveur que vous souhaitez atteindre !).
Attention les options pour contrôler l’authentification SSH sont un peu cachées : Dans le panneau de gauche dans Connection > SSH > Auth
Puis private key file for authentication.

Renseigner une clef privée pour une connexion SSH

Enfin appuyez sur Open ce qui ouvrira une console dans laquelle il vous suffira de rentrer votre identifiant pour le serveur sur lequel vous souhaitez vous connecter.

Octopuce ne fourni aucun support sur les clients SSH, même à ces clients.