· Julien PENASSOU · Deep dive  · 7 minutes de lecture

Les Tunnels SSH

Libérez tout le potentiel de SSH pour créer des tunnels réseaux sécurisés !

Libérez tout le potentiel de SSH pour créer des tunnels réseaux sécurisés !

Introduction

L’intérêt du tunneling

Le tunneling est une technique qui permet de faire transiter des communications entre deux machines à travers un canal sécurisé, appelé tunnel. Concrètement, ce tunnel encapsule les échanges réseau afin de les protéger et de les faire passer là où une communication directe serait normalement impossible, soit pour des raisons techniques (segmentation réseau, NAT, filtrage de ports, absence de routage), soit pour des raisons de sécurité (restriction d’accès, cloisonnement, exposition limitée des services).

Cette méthode présente plusieurs avantages : elle est relativement simple à mettre en place, elle limite fortement l’exposition des services sur Internet et elle améliore la sécurité en évitant l’ouverture inutile de ports accessibles publiquement.

Le tunneling est notamment utilisé pour accéder à des ressources qui ne sont pas directement exposées, ou pour rediriger des ports d’une machine à une autre. Selon le besoin, les flux peuvent être redirigés de différentes manières :

  • d’un port local vers une autre port local
  • d’un port local vers un port distant
  • d’un port distant vers un port local

Exemples d’utilisation concrets :

  • Accéder à une interface web interne (routeur, application, outil d’administration) sans rendre le service public.
  • Administrer un cluster, un serveur ou une base de données via un canal chiffré.
  • Tester un service protégé par un pare-feu sans modifier la configuration réseau.
  • Faire transiter son trafic Internet via un réseau distant grâce à un proxy.

Pourquoi SSH ?

SSH (Secure SHell) est un protocole réseau permettant d’établir des connexions chiffrées entre deux ordinateurs pour avoir un accès distant sécurisé. Si vous ne connaissez pas SSH, je vous invite à lire la page wikipédia.

Il s’agit d’un outil indispensable pour un administrateur et il est donc présent sur quasiment sur tous les serveurs. En plus d’être installé quasiment partout, SSH est très simple d’utilisation et offre toutes les options pour faire du tunneling et de la redirection de port.

Les concepts

Avant d’entrer dans le détail du fonctionnement du tunneling SSH, il est important de prendre le temps de comprendre quelques concepts clés qui serviront de base pour la suite.

Proxy SOCKS

Un proxy SOCKS (SOCKet Secure) est un serveur intermédiaire chargé de faire transiter le trafic réseau à votre place. Plutôt que de communiquer directement avec un service distant, votre application (navigateur web, outil en ligne de commande, etc.) envoie ses requêtes au proxy, qui se charge ensuite de les relayer vers la destination appropriée.

Schéma d'un proxy SOCKS

Les cas d’usage sont multiples, par exemple :

  • Contourner des contraintes réseau (filtrage de ports, pare-feu, segmentation, absence de routage direct)
  • Accéder à des services internes depuis un poste distant, sans les exposer publiquement
  • Masquer l’origine des connexions lors de phases de tests, d’administration ou d’analyse

Redirection de port / port forwarding

Comme son nom l’indique, la redirection de port sert à rediriger le trafic réseau d’un port source vers un autre port. Ce port de destination peut être local ou sur une machine distante.
Dans l’exemple ci-dessous quand un utilisateur va contacter host 1 sur le port 80, host 1 va rediriger le trafic vers host 2 sur le port 8080 et afficher mon application.

Schéma du concept de redirection de port

Les différents types de tunnels SSH

Redirection de port local / Local Forwarding

Permet de rediriger un port local vers un service distant à travers une connexion SSH.

Schéma représentant la redirection de port local

Dans l’exemple ci-dessus, mon host 1 veut accéder au port 80 de mon host 2 mais le pare-feu ne le permet pas. Peu importe, le port 22 (SSH) lui est autorisé. Ainsi, quand host 1 va sur http://127.0.0.1:8080 celui ci va être redirigé vers le port 80 de host 2 en passant par le tunnel SSH ouvert précédemment avec la commande :

ssh user@serveur -L <port_local>:<hôte_cible>:<port_cible>

Redirection de port distant / Remote Forwarding

Permet d’ouvrir un port sur un serveur distant redirigeant vers un port de notre serveur local. C’est très utile pour la majorité des pare-feu qui bloquent le trafic entrant mais autorise le trafic sortant.

Schéma représentant la redirection de port distant

Dans l’exemple ci-dessus, host 2 n’a pas accès par défaut en SSH à host 1 (car surement bloqué par le pare-feu ou derrière du NAT). Mais l’inverse fonctionne donc nous allons partir de ça ! host 1 se connecte en SSH à host 2 avec l’option -R 2222:127.0.0.1:22 pour ouvrir le port distant 2222 (sur host 2). Quand host 2 va lancer la commande ssh -p 2222 user@127.0.0.1, il sera redirigé vers le port 22 de host 1 et aura donc un terminal sur celui-ci.

ssh user@serveur -R <port_distant>:<hôte_local>:<port_local>

# Depuis l'host 2
ssh -p 2222 user@127.0.0.1

Redirection de port dynamique (proxy SOCKS)

Le dynamic forwarding (ou proxy SOCKS), permet de transformer une connexion SSH en proxy réseau dynamique. Contrairement au port forwarding classique, on ne redirige pas un port vers un service précis : c’est l’application (navigateur, outil CLI, …) qui décide dynamiquement où envoyer le trafic.

Schéma représentant la redirection dynamique de port

En pratique, on ouvre un port local SOCKS (par exemple 1080) via SSH, on configure ensuite notre application pour l’utiliser. Tout le trafic passe alors par le tunnel chiffré SSH et semble provenir du serveur distant, ce qui est idéal pour tester des accès réseau, contourner des restrictions ou naviguer via un autre point de sortie sans déployer un VPN complet.

ssh user@serveur -D <port_local>

Pour aller plus loin

Port Knocking + OTP pour SSH

L’utilisation des tunnels SSH est souvent temporaire. Nous n’avons donc pas forcément besoin d’avoir ce port ouvert en permanence. Et si je vous disais qu’il y a un moyen d’ouvrir le port SSH sur demande ? C’est le port Knocking !

Dans le principe, il faut voir ça comme une porte fermée nécessitant de toquer à la porte avec une certaine combinaison pour qu’on nous ouvre. Si ce n’est pas la bonne combinaison, il ne se passe rien !

Ici, pour la combinaison, nous allons faire des demandes de connexion sur une suite de ports spécifiques dans un laps de temps donné pour demander l’ouverture.

Le port SSH est fermé par défaut. Une séquence précise de connexions sur plusieurs ports déclenche temporairement l’ouverture de notre port via une règle iptables temporaire. La limite du port knocking, c’est qu’une fois la suite de port connu, tout le monde peut avoir accès au port 22.

Si l’on souhaite encore renforcer la sécurité on peut ajouter de l’OTP (One-Time Password). Cela permet de définir une suite de port de façon dynamique qui change chaque minute !

OTP est un mécanisme d’authentification utilisant un code à usage unique, généré dynamiquement pour une session ou une action donnée et permettant de renforcer la sécurité en ajoutant un second facteur d’authentification en plus du mot de passe.

Un fichier de configuration pour ses connexions SSH

Vous en avez marre de mémoriser les informations SSH de vos serveurs (utilisateur, port, clef SSH, tunnel, …)?

Le fichier ~/.ssh/config permet de centraliser et structurer toutes ses options de connexion SSH dans un seul endroit. Cela nous permet de faire des “alias”

# Commande d'origine
ssh dev@dev.exemple.com -p 2222

# Commande avec l'alias
ssh serveur-dev

Quelques exemples de base pour votre fichier de configuration :

# Connexion simple à mon serveur de dev
Host serveur-dev
    HostName dev.exemple.com
    User dev
    Port 2222

# Connexion via clés SSH
Host serveur-prod
    HostName prod.exemple.com
    User prod
    IdentityFile ~/.ssh/id_ed25519_prod

# Connexion à un serveur interne via proxyjump
Host bastion
    HostName bastion.exemple.com
    User admin

Host serveur-interne
    HostName 10.0.1.15
    User user
    ProxyJump bastion

Suivez-nous

Cet article vous a plu ?

Rejoignez-nous sur nos différents réseaux sociaux pour suivre notre actualité ! Nous y partageons nos nouveautés, nos réalisations, ainsi que des retours d’expérience sur les projets que nous menons au quotidien.

Vous pouvez également suivre notre blog via notre flux RSS, afin de ne manquer aucune publication. De nouveaux articles seront publiés régulièrement, avec pour objectif de vous présenter nos réalisations, de promouvoir les bonnes pratiques de l’ingénierie logicielle, et de décrypter l’actualité technique et numérique.

Partager cet article :
Retour au blog

Articles connexes

Voir tous les articles »