Tunneling SSH et transfert de port

CybersécuritéBeginner
Pratiquer maintenant

Introduction

Secure Shell (SSH) n'est pas seulement un outil d'accès à distance aux terminaux ; c'est aussi un puissant utilitaire réseau. Le tunneling SSH, également appelé transfert de port SSH (SSH Port Forwarding), vous permet d'acheminer le trafic réseau local vers des hôtes distants via une connexion SSH sécurisée.

L'idée fondamentale est d'emprunter la connectivité d'une autre machine. Le tunnel ne crée pas de nouvelle accessibilité réseau à partir de rien ; il réutilise la position et les accès de l'hôte distant.

Cette technique est largement utilisée par les administrateurs système, les développeurs et les professionnels de la sécurité pour contourner les pare-feux d'entreprise rigides, chiffrer le trafic d'applications héritées et accéder à des services internes cachés qui ne sont pas directement exposés sur l'internet public.

Dans ce laboratoire, vous découvrirez les concepts et les applications pratiques de deux types principaux de transfert de port SSH :

  • Transfert de port local (-L) : Transfère un port de votre machine locale vers une destination distante.
  • Transfert de port distant (-R) : Transfère un port d'un serveur distant vers votre machine locale.

Comprendre la topologie réseau

Dans cette étape, nous allons explorer l'environnement réseau simulé qui a été préparé pour vous.

Pour pratiquer le tunneling SSH, nous avons besoin d'un scénario impliquant plusieurs machines. Comme nous travaillons dans un environnement de machine virtuelle unique, nous avons simulé une topologie réseau complexe en utilisant différents ports réseau sur votre système local (127.0.0.1).

Voici la cartographie conceptuelle de notre simulation. Votre machine locale est représentée par votre session de terminal actuelle. L'hôte bastion, ou serveur de bordure, est simulé à l'aide d'un conteneur Docker qui expose SSH sur 127.0.0.1:2222. Le service interne est un serveur web fonctionnant sur le même réseau Docker privé à l'adresse 172.31.0.20:80. Conceptuellement, imaginez que ce service se trouve au cœur d'un réseau d'entreprise et qu'il est bloqué par un pare-feu, ce qui signifie qu'il ne peut être accédé qu'à partir de l'hôte bastion. Enfin, le service local est un serveur web fonctionnant sur le port 8000 sur la VM LabEx. Vous pouvez considérer cela comme un serveur de développement fonctionnant sur votre ordinateur portable personnel que vous souhaitez partager avec quelqu'un sur Internet.

Vérifions que nos services simulés sont en cours d'exécution. Nous utiliserons la commande curl, qui est un outil en ligne de commande pour transférer des données avec des URL.

Tout d'abord, vérifiez le "Service local" fonctionnant sur le port 8000 :

curl http://127.0.0.1:8000

Vous devriez voir le résultat Local Developer Machine Data.

Le service interne n'est intentionnellement pas exposé directement sur la VM LabEx. Vous y accéderez via le tunnel SSH à l'étape suivante.

Dans les étapes suivantes, nous utiliserons le tunneling SSH pour manipuler la manière dont nous accédons à ces services, en simulant des scénarios réels de contournement de pare-feu.

Configurer le transfert de port local (-L)

Dans cette étape, vous allez configurer le transfert de port local.

Imaginez que vous êtes chez vous et que vous devez accéder à un tableau de bord d'entreprise interne (notre service à l'adresse 172.31.0.20:80). Un pare-feu bloque l'accès direct à cette adresse interne depuis l'extérieur. Cependant, le pare-feu autorise les connexions SSH vers un serveur de bordure spécifique (notre hôte bastion).

Le transfert de port local vous permet d'ouvrir un port sur votre machine locale, et SSH transférera en toute sécurité tout trafic envoyé vers ce port local via le tunnel SSH vers la destination.

La syntaxe pour le transfert de port local est : ssh -L [local_port]:[destination_host]:[destination_port] [user]@[ssh_server]

Le transfert local est plus facile à comprendre comme : "faire en sorte qu'un service distant me paraisse local".

Nous allons transférer notre port local 8080 vers le service interne (172.31.0.20:80) via notre hôte bastion SSH simulé. Nous utiliserons également deux indicateurs supplémentaires. L'indicateur -N indique à SSH de ne pas exécuter de commande distante, ce qui est utile lorsque vous souhaitez uniquement transférer des ports. L'indicateur -f indique à SSH de s'exécuter en arrière-plan, nous permettant de continuer à utiliser notre terminal.

Exécutez la commande suivante pour créer le tunnel :

ssh -N -f -L 8080:172.31.0.20:80 \
  -o StrictHostKeyChecking=no \
  -o UserKnownHostsFile=/dev/null \
  -i ~/project/pivot_key -p 2222 pivot@127.0.0.1

Le tunnel fonctionne maintenant silencieusement en arrière-plan.

Maintenant, testons le tunnel. Au lieu d'accéder directement à l'adresse Docker interne, vous accéderez à votre port local 8080 nouvellement ouvert. Le tunnel SSH interceptera cette requête, la chiffrera, l'enverra à l'hôte bastion, qui la transférera ensuite vers 172.31.0.20:80.

curl http://127.0.0.1:8080

Vous devriez voir le résultat Secret Internal Corporate Data. Vous avez réussi à contourner le pare-feu conceptuel !

Configurer le transfert de port distant (-R)

Dans cette étape, vous allez configurer le transfert de port distant.

Imaginez que vous développez une application web sur votre ordinateur portable local (notre service sur le port 8000). Vous souhaitez montrer vos progrès à un client, mais votre ordinateur portable est derrière un routeur domestique (NAT) et ne possède pas d'adresse IP publique.

Le transfert de port distant résout ce problème en vous permettant de vous connecter à un serveur SSH public et d'ouvrir un port sur ce serveur distant. Tout trafic atteignant ce port distant est renvoyé via le tunnel SSH vers votre machine locale.

La syntaxe pour le transfert de port distant est : ssh -R [remote_port]:[local_host]:[local_port] [user]@[ssh_server]

Le transfert distant inverse la perspective : "faire en sorte que mon service local soit accessible depuis le côté distant".

Nous allons exposer notre service local (127.0.0.1:8000) à l'hôte bastion sur le port 8081.

Exécutez la commande suivante pour créer le tunnel distant :

ssh -N -f -R 8081:127.0.0.1:8000 \
  -o StrictHostKeyChecking=no \
  -o UserKnownHostsFile=/dev/null \
  -i ~/project/pivot_key -p 2222 pivot@127.0.0.1

Le tunnel est maintenant établi en arrière-plan. L'hôte bastion écoute désormais sur le port 8081. Lorsque quelqu'un accède au port 8081 sur le serveur distant, le trafic est renvoyé vers votre port local 8000.

Testons cela en interrogeant le service transféré via le conteneur de l'hôte bastion :

docker exec bastion_host curl -s http://127.0.0.1:8081

Vous devriez voir le résultat Local Developer Machine Data. Vous avez réussi à exposer un service local à un serveur distant !

Accéder au service web interne

Dans cette dernière étape, nous allons consolider nos connaissances en utilisant les tunnels que nous avons créés pour télécharger les données et les enregistrer dans des fichiers dans notre répertoire de projet.

Assurez-vous d'être dans votre répertoire de projet par défaut :

cd ~/project

Tout d'abord, utilisons le tunnel de transfert de port local (port 8080) pour récupérer les données d'entreprise internes et les enregistrer dans un fichier nommé internal_data.txt. Nous utiliserons l'indicateur -o avec curl pour spécifier le fichier de sortie.

curl http://127.0.0.1:8080 -o internal_data.txt

Ensuite, utilisons le tunnel de transfert de port distant (port 8081) pour récupérer les données du développeur local via l'hôte bastion et les enregistrer dans un fichier nommé remote_data.txt.

docker exec bastion_host curl -s http://127.0.0.1:8081 > remote_data.txt

Enfin, vérifions le contenu des fichiers que vous venez de télécharger en utilisant la commande cat :

cat internal_data.txt
cat remote_data.txt
Secret Internal Corporate Data
Local Developer Machine Data

En téléchargeant avec succès ces fichiers via les ports transférés, vous avez prouvé que les tunnels SSH acheminent activement le trafic de manière sécurisée entre les points de terminaison.

Résumé

Félicitations ! Vous avez terminé avec succès le laboratoire sur le tunneling SSH et le transfert de port.

Dans ce laboratoire, vous avez appris à comprendre les concepts du tunneling SSH et comment il peut être utilisé pour contourner les restrictions réseau. Vous avez configuré le transfert de port local (-L) pour accéder en toute sécurité à des services internes cachés en acheminant le trafic local via un hôte bastion. De plus, vous avez configuré le transfert de port distant (-R) pour exposer des services de développement locaux à un serveur distant, contournant ainsi avec succès le NAT local et les pare-feux. Enfin, vous avez appris à exécuter des tunnels SSH discrètement en arrière-plan en utilisant les indicateurs -N et -f.

Ces compétences sont essentielles pour une administration système sécurisée, le développement à distance et la navigation en toute sécurité dans des topologies réseau complexes.