Ci-dessous on constate deux sessions établies[1] et deux processus distincts :

mst:~#  netstat -lapute | grep ESTA | grep ssh
tcp        0      0 mst:33449          syphilis:https          ESTABLISHEDfly        15194011   17430/ssh
tcp        0      0 mst:49494          syphilis:https          ESTABLISHEDfly        15192811   17290/ssh
mst:~# ps -ef | grep ssh
fly      17290  4851  0 22:09 pts/8    00:00:00 ssh -p 443 fly@syphilis
fly      17430 17266  0 22:55 pts/10   00:00:00 ssh -p 443 fly@syphilis

Maintenant, utilisons correctement SSH :

mst:~# ps -ef | grep ssh
fly      17290  4851  0 22:09 pts/8    00:00:00 ssh -p 443 fly@syphilis
fly      17430 17266  0 22:55 pts/10   00:00:00 ssh -p 443 fly@syphilis
fly      17470 17253  0 23:30 pts/9    00:00:00 ssh -p 443 fly@syphilis
mst:~#  netstat -lapute | grep ESTA | grep ssh
tcp        0      0 mst:33449          syphilis:https          ESTABLISHEDfly        15194011   17430/ssh
tcp        0      0 mst:49494          syphilis:https          ESTABLISHEDfly        15192811   17290/ssh

Comme vous le constatez on voit trois processus, mais seulement deux connexions réseau établies. Magique non ? Et bien non, c'est le pouvoir du ControlMaster.

ControlMaster kesako ?

Le ControlMaster est votre ami ! Et en plus il vous veut du bien. Son seul défaut est qu'il existe en deux parfums : soit une version inférieure à la version 4 d'OpenSSH soit la version 4 ou mieux.
Son principe est un peu le même que GNU Screen, il permet de multiplexer les connexions. Grosso modo, vous ouvrez une première session (donc une connexion réseau) vers une machine. Puis toute nouvelle session n'utilisera plus que la première connexion réseau établie comme on le voit ci-dessus.
Dans les faits, cela se traduit par une socket qui permet aux différentes sessions de se taper la discut' au travers d'une unique connexion.

Le plus simple est de commencer avec une vielle version (et donc un goût assez old fashion). Anciennement, cette fonctionnalité de SSH était manuelle, on devait d'abord déclarer la première session comme master et les suivantes comme des sessions normales.

fly@mst:~$ ssh -p 443 -M -S /tmp/master-fly@siphilis\:443 fly@syphilis
fly@syphilis's password:
fly@syphilis:~$

Le paramètre -M est celui indiquant que l'on active le ControlMaster, le -S /tmp/master-fly@siphilis\:443 indique la socket utilisée pour le multiplexage..

fly@mst:~$ ls -l /tmp/master-fly@siphilis\:443 
srw--- 1 fly fly 0 2008-03-30 22:09 /tmp/master-fly@siphilis:443

Pour ouvrir une autre session en utilisant le multiplexage, il est juste nécessaire d'utiliser la socket.

fly@mst:~$ ssh -p 443 -M -S /tmp/master-fly@siphilis\:443 fly@syphilis
fly@syphilis:~$

Vous voilà donc avec plusieurs sessions SSH, mais une seule connexion réseau. En outre si vous regardez bien, la dernière phase de login juste au dessus, vous constaterez que le mot de passe n'est plus demandé. Il n'y a ici aucune clé d'utilisée, c'est simplement dû au fait que la première session est déjà authentifiée.

Pour l'utilisation avec une version récente d'OpenSSH, apprendre le fonctionnement du fichier ~/.ssh/config est vivement recommandé car il n'est plus nécessaire de mettre d'arguments en ligne de commande. Pour cela éditez votre ~/.ssh/config comme suit :

Host *
ControlPath /tmp/master-%r@%h:%p
ControlMaster auto

Cette syntaxe indique que pour tous les hosts sur lesquels nous voudrons nous connecter, le ConrtolMaster sera en automatique. C'est à dire que si la socket identifiée par ControlPath n'existe pas SSH l'a créera, sinon elle sera utilisée.

!Remarques Importantes :

L'utilisation du ControlMaster peut s'avérer néfaste pour votre sécurité !

En effet, pour peu qu'une personne ai accès à votre compte (ou bien même au compte root), il lui suffit de déclarer une des socket que vous utilisez pour que la connexion de l'usurpateur soit directement authentifiée sur la machine cible.

fly      17978 17962  0 21:54 pts/14   00:00:00 ssh -M -S /tmp/trut -p 443 fly@dtc

Comme on le voit, un simple ps -ef peut nous montrer la ligne de commande utilisée. Le fait d'utiliser un répertoire non sûr permettra de rapidement prendre la main sur la socket... Le mieux est d'utiliser le fichier ~/.ssh/config qui ne laisse plus voir par un simple ps la socket utilisée. Personnellement, je pense que le ControlPath ~/.ssh/somefile est un peu plus sécurisant...

L'utilisation du ControlMaster peut vous faire perdre des données !

En effet, si pour une raison quelconque vous déconnectez la session master, les autres connexions resteront actives, mais si vous veniez à tuer la session master alors toutes vos sessions seraient perdues !

L'utilisation du ControlMaster peut vous faire gagner un temps précieux :

En effet, sur les machines sur lesquelles je travaille[2] actuellement, le handshake et l'authentification sont particulièrement lents. Du coup, avec le ControlMaster seul ma première authentification est lente, les autres sont instantannées.

Lectures utiles :

Pour ce petit document je me suis particulièrement inspiré des sites suivants :

Notes

[1] Le port d'écoute est 443 (https) sur syphilis.

[2] Oui, oui, ça m'arrive, mais pas plus de quelques minutes après je fatigue trop...