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