Tunneling SSH expliqué : Accédez en toute sécurité aux services distants

Utilisez le tunneling SSH pour accéder aux bases de données privées, applications web et services distants grâce au forwarding local, distant et dynamique.

Le Tunneling SSH Expliqué : Accéder en Toute Sécurité aux Services Distants

Le tunneling SSH vous permet d'atteindre des services distants sans les exposer sur Internet. Si votre base de données, tableau de bord d'administration ou serveur de développement n'est accessible que depuis un bastion, un tunnel SSH offre à vos outils locaux un chemin sécurisé.

Les principaux schémas sont le forwarding local, le forwarding distant et le forwarding dynamique. Chacun répond à une question différente : avez-vous besoin d'atteindre quelque chose à distance, d'exposer quelque chose en local, ou de créer un proxy SOCKS ?

Qu'est-ce que le Tunneling SSH ?

Le tunneling SSH encapsule le trafic applicatif dans une connexion SSH. Au lieu de vous connecter directement à un service, vous vous connectez à un port redirigé local ou distant. SSH transporte ce trafic via la session chiffrée et se connecte à la destination finale depuis le bon côté du tunnel.

Le tunnel chiffre le trafic entre votre client SSH et le serveur SSH. Si la destination finale se trouve au-delà du serveur SSH, ce dernier tronçon utilise la sécurité fournie par le service de destination. Pour les services sensibles, conservez TLS ou le chiffrement natif même lorsque vous utilisez un tunnel.

Types de Tunnels SSH

SSH propose trois principaux types de redirection de ports, chacun servant un objectif différent :

1. Redirection de Port Local (-L)

La redirection de port local est le type le plus courant. Elle vous permet de rediriger le trafic d'un port de votre machine locale vers un port d'une machine distante (ou d'une machine accessible depuis le serveur SSH distant). C'est idéal pour accéder à des services exécutés sur le réseau interne d'un serveur distant ou sur le serveur lui-même, qui ne sont pas directement accessibles depuis votre réseau local.

Comment ça fonctionne : Le client SSH écoute sur votre machine. Le serveur SSH se connecte à la destination.

Cas d'utilisation : Accéder à une base de données MySQL sur le port 3306 que seul le bastion peut atteindre.

Syntaxe de la commande :

ssh -L [PORT_LOCAL]:[HOTE_DESTINATION]:[PORT_DESTINATION] [UTILISATEUR_SSH]@[SERVEUR_SSH]

Exemple :

Supposons que vous ayez une base de données MySQL exécutée sur db.internal.example.com (port 3306) et que vous ne puissiez vous connecter en SSH qu'à bastion.example.com. Pour accéder à la base de données depuis votre machine locale sur le port 8888 :

ssh -L 8888:db.internal.example.com:3306 [email protected]

Après avoir exécuté cette commande, vous pouvez ouvrir votre client MySQL local et vous connecter à localhost:8888. Le trafic sera tunnelisé de manière sécurisée via bastion.example.com vers db.internal.example.com:3306.

Utilisez -N lorsque vous n'avez pas besoin d'un shell distant :

ssh -N -L 8888:db.internal.example.com:3306 [email protected]

Pour les scripts, ajoutez -o ExitOnForwardFailure=yes afin que SSH se ferme si l'écouteur local ne peut pas être créé.

2. Redirection de Port Distant (-R)

La redirection de port distant fait l'inverse de la redirection locale. Elle vous permet de rediriger le trafic d'un port du serveur SSH distant vers un port de votre machine locale ou d'une machine accessible depuis votre machine locale. C'est utile pour exposer un service exécuté sur votre machine locale (ou une machine de votre réseau local) au serveur distant ou à son réseau.

Comment ça fonctionne : Le serveur SSH écoute sur un port distant. Votre client SSH se connecte à la destination depuis votre côté du tunnel.

Cas d'utilisation : Permettre à un collègue distant d'accéder à un serveur de développement web exécuté sur votre machine locale (par exemple, une application Flask sur le port 5000) sans exposer votre machine locale directement sur Internet.

Syntaxe de la commande :

ssh -R [PORT_DISTANT]:[HOTE_DESTINATION]:[PORT_DESTINATION] [UTILISATEUR_SSH]@[SERVEUR_SSH]

Exemple :

Supposons que vous exécutiez une application web sur votre machine locale à localhost:5000. Vous souhaitez permettre à un utilisateur sur remote.example.com d'y accéder en se connectant au port 9000 sur remote.example.com.

ssh -R 9000:localhost:5000 [email protected]

Dans les configurations OpenSSH typiques, l'écouteur distant n'est disponible que sur l'interface de bouclage du serveur SSH. Cela signifie que les utilisateurs sur l'hôte distant peuvent tester localhost:9000, mais que d'autres machines ne peuvent pas nécessairement atteindre remote.example.com:9000.

Pour exposer l'écouteur à d'autres machines, vous avez généralement besoin d'une adresse de liaison telle que 0.0.0.0 dans la commande et d'un paramètre côté serveur GatewayPorts tel que clientspecified ou yes. Soyez prudent : la redirection distante peut exposer des services sur votre ordinateur portable ou votre réseau local au réseau distant.

3. Redirection de Port Dynamique (-D)

La redirection de port dynamique crée un proxy SOCKS sur votre machine locale. Au lieu de rediriger le trafic vers une destination spécifique, elle permet aux applications configurées pour utiliser ce proxy SOCKS de se connecter à n'importe quel hôte et port accessible depuis le serveur SSH. Cela transforme effectivement votre connexion SSH en un serveur proxy polyvalent.

Comment ça fonctionne : Votre client SSH écoute en tant que proxy SOCKS. Les applications qui prennent en charge SOCKS envoient des requêtes à ce proxy local, et le serveur SSH établit la connexion sortante.

Cas d'utilisation : Naviguer sur le web en toute sécurité depuis un réseau Wi-Fi public en routant tout le trafic de votre navigateur via un serveur SSH à la maison ou au bureau. Cela chiffre votre activité de navigation.

Syntaxe de la commande :

ssh -D [PORT_LOCAL] [UTILISATEUR_SSH]@[SERVEUR_SSH]

Exemple :

Pour créer un proxy SOCKS sur votre machine locale écoutant sur le port 1080 :

ssh -D 1080 [email protected]

Après avoir exécuté cette commande, configurez votre navigateur ou une autre application pour utiliser un proxy SOCKS à localhost:1080. Si l'application prend en charge le DNS distant via SOCKS5, activez-le lorsque la confidentialité du DNS est importante.

Applications Pratiques et Avantages

Le tunneling SSH offre un large éventail d'applications pratiques :

  • Accès Sécurisé aux Bases de Données : Accéder aux bases de données (comme PostgreSQL, MySQL ou MongoDB) qui ne sont accessibles que depuis un serveur spécifique dans un réseau privé, sans exposer le port de la base de données directement sur Internet.
  • Accès aux Services Web Internes : Se connecter à des applications web internes, des interfaces d'administration ou des tableaux de bord de surveillance qui ne sont pas exposés publiquement.
  • Sécurisation des Protocoles Non Chiffrés : Encapsuler des protocoles non sécurisés comme VNC, FTP ou HTTP simple dans un tunnel SSH chiffré, offrant confidentialité et intégrité.
  • Travailler avec des Restrictions Réseau : Accéder à des services via un serveur autorisé à les atteindre. Ne faites cela que si cela est conforme à la politique réseau de votre organisation.
  • Développement à Distance Sécurisé : Fournir un accès sécurisé aux environnements de développement ou aux outils exécutés sur des serveurs distants.

À Retenir

Utilisez le forwarding local lorsque votre ordinateur portable a besoin d'accéder à un service distant privé. Utilisez le forwarding distant lorsqu'un hôte distant a besoin d'un accès temporaire à un service proche de vous. Utilisez le forwarding dynamique lorsque vous avez besoin d'un proxy SOCKS via un serveur SSH de confiance. Gardez le tunnel aussi étroit que possible et fermez-le une fois le travail terminé.