====== Connexion SSH à travers de multiples hôtes SSH via ProxyJump ====== ===== Avant-propos ===== 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** {{:ssh-jump.png?600|}} **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 ==== la configuration sur la machine cli ==== 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 **monuser**avec **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 **monuser**avec **ssh-copy-id** user@cli:~$ ssh-copy-id final-srv **Remarques** : * on peut également coller au bout du fichier **~/.ssh/authorized_key** la clé publique à propager * l'exemple ici présenté utilise des clés **RSA** mais des clés **ECDSA** ou **ED25519** fonctionnent également * on peut par ailleurs utiliser les options habituelles de **ssh_config** (**port** , ...) pour adapter aux conditions locales. ==== Test ==== user@cli:~$ ssh final-srv === Principe de fonctionnement === - La connexion à **final-srv** déclenche une connexion à **j2** via **ProxyJump** - la connexion à **j2** déclenche une connexion à **j1** via **ProxyJump** - la connexion à **j1** s'effectue puis celle à **j2** et finalement celle à **final-srv** ==== Remarques ==== === ssh-agent et ssh-addd === 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 === connexion shell aux Jump serveurs === 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