• Bien configurer son client SSH pour gérer de multiples connexions à l'aide de divers moyens d'authentification

    Introduction

    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.

    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 :
    Code:
    /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 :
    Code:
    $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 :

    Code:
    Host nom_hote_1
        Option1 valeur
        Option2 valeur
    Il est possible d'utiliser le joker * pour appliquer des options génériquement :
    Code:
    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 :

    Code:
    Host git
        HostName depot.exemple.fr
        User git
    Ainsi nous pouvons nous connecter à git@depot.exemple.fr en tapant simplement :

    Code:
    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 :

    Code:
    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 :

    Code:
    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 :
      Code:
      ssh -p 8822 user@hote.exemple.fr
    • en ligne de commande mais en utilisant l'option -o :
      Code:
      ssh -o User=user -o Port=8822 -o HostName=hote.exemple.fr hote
    • en configurant les options dans le fichier config :
      Code:
      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



    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--------