Une compilation de documentations   { en , fr }

Mutualisation de connexions réseau avec OpenSSH

Étiquette:
Créé en:
Auteur:
Xavier Béguin

Avantage de cette fonctionnalité

Cette fonctionnalité peut être intéressante dans certains cas : elle permet la réutilisation d'une connexion SSH déjà ouverte, ce qui permet notamment de ne pas avoir à s'authentifier à nouveau.

C'est surtout intéressant lorsqu'on s'authentifie au serveur à l'aide d'un mot de passe ou qu'on utilise une clef SSH mais qu'on ne dispose pas d'agent SSH qui retient en mémoire une clef SSH dont on a déjà saisi le mot de passe.

Configuration de la réutilisation de connexions

L'activation de cette fonctionnalité se fait dans le fichier de configuration du client ssh, ~/.ssh/config, donc le fichier .ssh/config du répertoire personnel de votre compte.

On devra y ajouter les directives ControlMaster et ControlPath :

  • ControlMaster contrôle si la connexion principale doit être créée ou si une connexion doit être réutilisée. Cette directive peut être complétée des mots :
    • yes: indique que la connexion principale doit être créée. Elle sera à l'écoute de la création d'autres connexions au même compte distant sur le socket Unix désigné par ControlPath (voir ci-dessous). Ces nouvelles connexions seront alors mutualisées sur la même connexion réseau ;
    • no: indique qu'une connexion existante doit être réutilisée. Si aucune n'existe, la connexion réseau se fera normalement, sans création d'une connexion principale réutilisable ;
    • ask: équivaut à yes mais demande d'abord confirmation auprès du programme ssh-askpass (pour une interface généralement graphique) ou un équivalent désigné par la variable d'environnement SSH_ASKPASS;
    • auto: le client va tenter de réutiliser une connexion principale, mais si elle n'existe pas, il va la créer ;
    • autoask: identique à auto, mais après demande de confirmation à l'utilisateur comme avec ask.
  • ControlPath définit le nom du socket de contrôle à créer/utiliser. Elle doit dépendre du nom du serveur, du port, et de l'utilisateur distant, puisque seules les connexion réseaux ayant ces points en commun peuvent être mutualisées. Des séquences de caractères spéciales peuvent être utilisés dans le nom de la socket pour être remplacés par des caractéristiques de la connexion :
    • %r représente la nom d'utilisateur distant ;
    • %h représente la nom de la machine distante ;
    • %p représente le port du serveur distant. On peut ainsi utiliser par exemple la valeur ~/.ssh/socket1-%r@%h:%p.

Utiliser un fichier socket placé dans le répertoire /tmp (plutôt que dans ~/.ssh/ comme dans l'exemple donné ci-dessus) peut être intéressant car le fichier sera supprimé en cas de crash de la machine. Dans le cas contraire, le client SSH génèrera une erreur à cause de la tentative de connexion avec un socket mort, qui devra être supprimé manuellement.

Exemple de configuration avec réutilisation de connexion

Voici un exemple de configuration dans ~/.ssh/config entraînant la création d'un socket dans le répertoire .ssh permettant la réutilisation de connexion :

Host machine1
	Hostname machine1.example.com
	User hkrustofski
	IdentityFile /home/krusty/.ssh/id_special
	ControlMaster auto
	ControlPath ~/.ssh/domaine-%r@%h:%p

Avec cette configuration, l'utilisation de la commande ssh machine1 ouvrira une connexion à machine1.example.com en créant une connexion principale s'il n'en existe pas encore, ou bien en réutilisant une éventuelle connexion déjà existante qui sera mutualisée à grâce au socket /home/krusty/.ssh/domaine-hkrustofski@machine1.example.com:22.

Lors de l'utilisation d'une connexion mutualisée, le transfert de connexion X11 ou d'agent SSH est possible, mais l'écran ou l'agent transféré seront ceux de la connexion principale. Autrement dit, il n'est pas possible de transférer plus d'un écran ou agent SSH.