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
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
- ssh-jump.dot
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 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 :
- 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