connexion_ssh_a_travers_de_multiples_hotes_ssh_proxyjump

Connexion SSH à travers de multiples hôtes SSH via ProxyJump

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

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.
user@cli:~$ ssh final-srv 

Principe de fonctionnement

  1. La connexion à final-srv déclenche une connexion à j2 via ProxyJump
  2. la connexion à j2 déclenche une connexion à j1 via ProxyJump
  3. la connexion à j1 s'effectue puis celle à j2 et finalement celle à final-srv

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
  • connexion_ssh_a_travers_de_multiples_hotes_ssh_proxyjump.txt
  • Dernière modification : 2023/10/12 00:05
  • de ps