L'objectif est de lancer une connexion à travers plusieurs hôtes SSH de façon à atteindre une machine située derrière un ou plusieurs pare-feu.
Ici un client SSH cli souhaite se connecter à la machine final-srv en passant par deux machines j1 et j2
Exemple : schéma précédant au format .png obtenu à partir du fichier .dot pour grafviz/dot avec la commande dot -Tpng ssh-jump.dot -o ssh-jump.png
graph G { rankdir = "LR" node [shape=box3d, fontname="arial"]; "cli" -- "j1" -- "j2" -- "final-server" }
On utilisera les clés publiques SSH ainsi que la clause ProxyJump SSH
On doit constituer sur la machine cli un fichier de configuration du client SSH ~/.ssh/config
Le fichier .ssh/config sur la machine cli
host j1 # premiere machine Jump hostname vps-xyztuv.ovh.net user monuser identityfile ~/.ssh/id_rsa host j2 # seconde machine jump hostname host2.mydom.net user monuser IdentityFile ~/.ssh/id_rsa ProxyJump j1 host final-srv # machine de destination hostname final-srv.local # adresse ou nom du serveur final user monuser IdentityFile ~/.ssh/id_rsa Proxyjump j2
1. On doit d'abord créer sur la machine cli une paire de clés SSH pour l'utilisateur en question avec ssh-keygen
user@cli:~$ ssh-keygen
2. ensuite, on doit copier la clé publique (habituellement .ssh/.id_rsa.pub) sur la machine j1 dans le fichier ~/.ssh/authorized_keys de l'utilisateur monuser avec ssh-copy-id
user@cli:~$ ssh-copy-id j1
3. puis on copie la même clé publique (habituellement .ssh/.id_rsa.pub) sur la machine j2 dans le fichier ~/.ssh/authorized_keys de l'utilisateur monuseravec ssh-copy-id
user@cli:~$ ssh-copy-id j2
4. enfin, on répète la manipulation avec la même clé publique sur la machine final-srv.local dans le fichier ~/.ssh/authorized_keys de l'utilisateur monuseravec ssh-copy-id
user@cli:~$ ssh-copy-id final-srv
Remarques :
user@cli:~$ ssh final-srv
L'utilisation d'une clé publique avec passphrase est pertinente en terme de sécurité mais chaque connexion intermédiaire nécessitera l'utilisation de la clé privée donc une demande de mot de passe à chaque connexion à un hôte SSH…
En conséquence, il sera très pertinent de mettre en cache la passphrase en utilisant ssh-agent et ssh-add avant de déclencher la connexion.
user@cli:~> ssh-agent bash user@cli:~> ssh-add Enter passphrase for /home/user/.ssh/id_rsa: Identity added: /home/user/.ssh/id_rsa (user@cli) user@cli:~> ssh final-srv
Il est problématique en terme de sécurité de pouvoir ouvrir une session ssh sur les serveurs intermédiaires j1 et j2.
Pour éliminer le problème, on peut changer le shell de l'utilisateur la connexion intermédiaire avec chsh et le remplacer par /bin/false
root@j1:~# chsh -s /bin/false monuser