Bien configurer son client SSH pour gérer de multiples connexions à l'aide de divers moyens d'authentification
L'usage de SSH permet de sécuriser les connexions distantes, que ce soit avec les postes client ou les serveurs et matériels d'infrastructure. Une très bon niveau de sécurité peut être atteint grâce à l'usage de clés SSH, particulièrement si elles sont chiffrées à l'aide d'une phrase de passe.
Toutefois cela peut devenir une contrainte surtout si des moyens d'authentification différents sont utilisés en fonction des machines à connecter.
Pour cela, il est impératif de bien configurer son client SSH et d'utiliser un agent SSH.
Introduction
Configurer SSH n'est pas très compliqué à condition de garder en tête quelques règles simples de syntaxe et de comprendre la façon dont SSH interprète votre fichier de configuration. Cela peut prendre un peu de temps en fonction du nombre de connexions que vous devez gérer mais vous facilitera grandement la vie par la suite.
Structure et interprétation du fichier de configuration
Le fichier de configuration du client SSH est lu, si présent, dès lors qu'une connexion SSH est initiée, que ce soit directement en ligne de commande, par l'intermédiaire d'un agent ou encore lors d'opération sur un dépôt Git distant.
Le fichier de configuration du système, pour tous les utilisateurs donc, est :
/etc/ssh/ssh_config
Il permet de configurer les options par défaut mais doit être édité en tant que root. Le fichier lu est situé dans :
$HOME/.ssh/config
Ce fichier contient les options à appliquer lors de la connexion, il est organisé par hôte. Nous appellerons section un bloc d'instruction commençant par le nom de l'hôte à connecter suivi des options à appliquer à cette connexion.
Seules les options qui diffèrent de la configuration par défaut (généralement / etc/ssh/ssh_config
) doivent être précisées. Une section commence par l'en-tête Host
suivi des options indentées :
Host nom_hote_1
Option1 valeur
Option2 valeur
Il est possible d'utiliser le joker * pour appliquer des options génériquement :
Host *
OptionGlobale1 valeur
Il n'est pas nécessaire que la valeur de Host corresponde au nom de la machine, elle peut être une sorte d'alias :
Host git
HostName depot.exemple.fr
User git
Ainsi nous pouvons nous connecter à en tapant simplement :
ssh git
Lors d'une connexion, la configuration est lue de haut en bas et les options correspondant à l'hôte sont appliquées. L'ordre des blocs est donc important. Mais l'interprétation ne s'arrête pas au premier bloc rencontré, SSH va continuer de lire le fichier à la recherche d'autres blocs Hosts pouvant correspondre. S'il en trouve, il appliquera alors les options présentes dans le bloc et qui n'auraient pas déjà été définies et appliquées précédemment. Ce point est particulièrement important car il signifie que SSH utilise toujours, pour une option donnée, la première valeur définie. Il n'est donc pas possible de surpasser une option déjà définie dans une section précédente. En conséquence, le fichier config doit être écrit du particulier au général, de telle manière que les options les plus spécifiques se trouvent au début du fichier et les options générales à la fin.
Prenons l'exemple suivant :
Host num1
Option1 valeur
Option2 valeur
Option3 valeur
Host num2
Option4 valeur
Host *
Option2 valeur
Si nous nous connectons à l'hôte num1, les trois options correspondantes seront appliquées, le fichier continuera d'être lu jusqu'à la section Host *
, celle-ci correspond à toutes les connexions et sera donc appliquée mais comme l'option Option2 a déjà été définie, elle sera abandonnée.
En revanche, si nous nous connectons à l'hôte num2, l'option Option4 sera logiquement appliquée puis, à la lecture de la section Host *
l'option Option2 sera appliquée également.
L'usage de l'option -v
en ligne de commande permet de voir les options appliquées :
ssh -v root@192.168.1.100
OpenSSH_7.2p2, OpenSSL 1.0.2j-fips 26 Sep 2016
debug1: Reading configuration data /home/user/.ssh/config
debug1: /home/user/.ssh/config line 39: Applying options for 192.168.1.*
debug1: /home/userl/.ssh/config line 50: Applying options for *
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 25: Applying options for *
debug1: Connecting to 192.168.1.100 [192.168.11.174] port 22.
debug1: Connection established.
Options de connexions
Les options à appliquer à une connexion peuvent l'être de différentes façons :
directement en ligne de commande :
ssh -p 8822 user@hote.exemple.fr
en ligne de commande mais en utilisant l'option -o :
ssh -o User=user -o Port=8822 -o HostName=hote.exemple.fr hote
en configurant les options dans le fichier config :
Host hote HostName hote.exemple.fr User user Port 8822
Quelques options utiles :
- User : l'utilisateur utilisé pour la connexion ;
- PasswordAuthentication : l'authentification doit être faite par mot de passe (yes | no) ;
- RSAAuthentication : l'authentification doit être faite par clé SSH (yes | no) ;
- IdentityFile : le chemin vers la clé utilisée pour la connexion ;
- IdentitiesOnly : utile si un agent SSH est utilisé pour préciser que seul l'identité spécifiée dans le fichier de configuration doit être utilisée (si l'agent peut en offrir plusieurs) (yes | no) ;
- StrictHostKeyChecking : ajouter la clé de l'hôte au fichier $HOME/.ssh/known_hosts et vérifier cette entrée avant chaque connexion (yes | no) ;
- Compression : compresser les données avant transmission, utilise avec un client lent (yes | no) ;
- ServerAliveInterval : intervalle de temps (en secondes) après lequel, en l'absence de transmission de données depuis le serveur, SSH va envoyer un message à ce dernier pour vérifier qu'il répond ;
- ServerAliveCountMax : nombre de messages envoyés pour lequel aucune réponse n'est obtenue. Au delà de ce seuil, le client SSH met fin à la connexion.
Sources
- https://www.digitalocean.com/communi...our-ssh-client
- https://www.cyberciti.biz/faq/create...on-linux-unix/
- https://docstore.mik.ua/orelly/netwo...sh/ch07_04.htm
- https://linux.die.net/man/5/ssh_config
Note : si le dossier $HOME/.ssh n'existe pas, il faut le créer. Le client SSH vérifie les droits sur le dossier et son contenu et refusera une connexion si les droits sont trop ouvert. Idéalement, ils doivent être les suivants :
- dossier
$HOME/.ssh : 700 ou drwx------
; - fichier
$HOME/.ssh/config : 600 ou -rw-------
; - vos clés SSH :
400 ou -r--------