Introduction aux tunnels SSH
Ceci est le premier article d'une petite série au sujet des tunnels SSH (mais aussi premier article de ce blog
). Il s'adresse aux débutants et traite de l'installation d'OpenSSH sous Linux (Debian pour être précis), et de l'ouverture d'un tunnel sécurisé sous Linux, Windows et Mac OS X.
J'ai découvert la magie du tunnel SSH il y a quelques temps déjà, et depuis je n'ai cessé d'en apprendre sur cette petite merveille.
Tout d'abord une rapide présentation : le SSH est un protocole qui permet l'accès distant et sécurisé au shell (ici l'interpréteur de lignes de commandes) d'une machine, bien souvent Linux/Unix. Il opère sur le port 22 par défaut, et offre divers degrés de sécurité. Selon les paramètres du serveur, on peut se connecter sans mot de passe, avec mot de passe, avec une paire de clés et une phrase de passe ou sans phrase de passe, ... Voilà pour ceux qui ne connaissaient pas du tout.
Alors qu'est-ce que c'est ?
SSH permet, en plus d'administrer une machine à distance, d'ouvrir ce qu'on appelle un "tunnel". Concrètement il s'agit de créer un serveur proxy (SOCKS) en local qui écoutera sur un port donné, et au travers duquel vous allez pouvoir faire communiquer vos applications vers l'extérieur. Tout ce qui transitera au travers de ce tunnel le sera de manière chiffrée ("cryptée"), et l'ordinateur servant de point d'accès (celui auquel vous vous connectez) se chargera de déchiffrer puis de transmettre les données.
En somme :
- Chiffre vos transmissions entre votre ordinateur et votre point d'accès (le serveur SSH). Toute personne se trouvant entre les deux ne verra qu'un message chiffré sans avoir la moindre idée de ce qui se dit...
- Permet de faire passer certaines applis bloquées par le pare-feu / le proxy (reconnues par leur numéro de port) dans le tunnel et donc ainsi les exploiter quand même (sites Web bloqués, applications de communication... jeux
) - Offre une solution minimale de compression : utile si vous souhaitez surfer en EDGE / 3G mais que le débit n'est pas au top (dans un train en mouvement par exemple). La compression apporte un léger confort à ce niveau là (c'est une option à activer lors de l'ouverture d'un tunnel).
Petit schéma :
L'ordinateur client (à gauche) utilise son navigateur pour appeler "www.google.fr". S'il décide d'utiliser son tunnel SSH (nous verrons comment plus bas), la requête ne quitte pas la machine avant d'avoir été encapsulée dans un paquet transmis sur le canal SS (flèches vert foncé).
Elle traverse les différents routeurs séparant le client et le serveur de façon chiffrée, un observateur se trouvant entre le client à gauche et le serveur à droite ne verra qu'une suite de caractères inintelligibles.
Une fois les paquets reçus par le serveur, il les décapsule et fait son boulot : il envoie une requête à Google (flèches rouge foncé). Ici, tout se fait en clair, mais en général on s'arrange pour avoir un serveur difficile à écouter (situé dans un datacenter sécurisé par exemple ; un serveur dédié low-cost fait généralement l'affaire pour des transmissions "perso").
Google répond toujours en clair (flèches rouges) au serveur. Ce dernier encapsule les paquets puis les renvoie à notre client à travers le canal sécurisé (en vert clair). L'observateur éventuel ne voit donc ni la requête, ni la réponse.
Installation
S'il n'est pas installé sur votre machine Linux (mais il l'est bien souvent avec les distribs populaires), vous pouvez l'installer avec votre gestionnaire de packets, c'est rapide et indolore. Un exemple sous Debian :
sudo apt-get update sudo apt-get install openssh-server
A vous d'adapter en fonction de votre packet manager.
Vous pouvez aussi ajouter le client :
sudo apt-get install openssh-client
Vous voilà avec votre serveur OpenSSH et éventuellement un client.
La config contient alors les valeurs par défaut, et vous pouvez démarrer le serveur (au cas où il ne se soit pas lancé après l'installation) de cette manière :
sudo /etc/init.d/ssh start
Après une modification de la configuration (située dans /etc/ssh/sshd_config), vous pouvez appliquer la nouvelle config simplement en tapant :
sudo /etc/init.d/ssh restart
Fait intéressant, cela ne ferme pas les sessions actuellement ouvertes et vous pouvez donc bidouiller votre fichier de config depuis une session SSH distante sans risquer de vous faire déconnecter. Par contre, une erreur de config suivie d'une déconnexion (volontaire ou perte de connexion, coupure de courant) risque de vous empêcher de vous reconnecter. Prudence
Votre premier tunnel
Nous allons ouvrir un tunnel de manière simple, sans clé privée, sans utiliser un port alternatif, ...
Depuis une machine Linux
Cette procédure nécessite d'avoir installé le packet "openssh-client". Ouvrez donc une fenêtre de terminal, puis saisissez :
# Ouverture du tunnel # On spécifie l'hôte, le numéro du port # sur lequel on écoute, et le nom d'utilisateur ssh nom_ou_ip_de_lamachine -D 1080 -l nom_utilisateur # Exemple concret : ssh morveus.com -D 1080 -l administrateur
Lors de votre première connexion s'affichera un message vous proposant d'accepter ou non une empreinte de clé RSA. Acceptez avec un "yes".
Après avoir saisi votre mot de passe, vous pourrez constater que l'invite du shell aura changé de nom (par exemple "administrateur@votremachinedistante". Cela signifie que vous aurez ouvert une session SSH. Mais ce n'est pas tout : l'emploi de l'argument "-D" suivi d'un numéro de port (ici 1080) indique au client SSH d'ouvrir le port 1080 en écoute.
La suite : après la partie "Windows"
Depuis une machine Windows
Sous Windows, téléchargez et installez / ouvrez Putty.

Accueil de Putty sous Windows
Saisissez le nom d'hôte ou l'adresse IP du serveur auquel vous comptez vous connecter dans "Host Name (or IP address)".
C'est tout ce que vous aurez à faire sur cette page.
Rendez-vous ensuite dans "Connection > SSH > Tunnels" (dans "Category", menu de gauche) :

Là, cochez "Dynamic" le bas de page, et choisissez un numéro de port dans "Source Port". 1080 est le numéro du port utilisé par SOCKS5, tel que spécifié dans la RFC 1928. Cliquez sur "Add" pour ajouter cette redirection. Vous devriez obtenir ceci :

Lorsque vous êtes prêt, cliquez sur "Open". Vous avez aussi la possibilité de sauvegarder ce profil en retournant à l'écran d'accueil de Putty, dans "Saved Sessions". Tapez un nom et faites "Save". Cela vous permettra de la réutiliser la prochaine fois, sans avoir à repasser par ces étapes.
Note : cochez "Local ports accept connections from other hosts" si vous souhaitez que d'autres machines du même réseau local puisse se connecter au travers de ce tunnel.

Nous voici connectés. Il est évidemment possible d'utiliser le terminal SSH pour travailler normalement sur la machine. La différence est que maintenant, Putty écoute sur le port 1080, attendant que vos applis s'y connectent.
Depuis une machine sous Mac OS
Ouvrez une fenêtre de terminal, et tapez :
# Ouverture du tunnel # Les commandes sont les mêmes que sous Linux ssh nom_ou_ip_de_lamachine -D 1080 -l nom_utilisateur # Exemple concret : ssh morveus.com -D 1080 -l administrateur
La commande tapée sous le terminal de Mac OS X. Tapez simplement "yes" pour continuer.
Vous pouvez aussi utiliser Putty, qui existe sous quasiment toutes les plate-formes (Windows, Linux, Mac OS, Symbian, Windows Mobile, iPhone, J2ME, ...). La méthode sera alors la même que ci-dessus pour Windows.
"Tunneller" un logiciel
Toute application vous permettant de changer ses paramètres de connexion proxy peut passer par le tunnel. Voici un exemple avec Firefox sous Windows (fonctionne de la même manière sous Mac OS et sous Linux) :

Rendez-vous donc dans le menu "Outils > Options". Cliquez sur l'icône "Avancé", l'onglet "Réseau". Cliquez sur "Paramètres". Une nouvelle fenêtre s'ouvre alors :

Cochez "Configuration manuelle du proxy", puis dans la case "Hôte SOCKS", entrez l'adresse IP du loopback (127.0.0.1) de votre machine. Si vous avez ouvert le tunnel depuis une autre machine sur votre réseau local, entrez son adresse IP (192.168.x.x, 10.0.0.x, ...)
Saisissez "1080" dans la case "Port" (ou une autre valeur, selon celle que vous avez indiquée à Putty).
Validez par OK, puis encore OK pour fermer la fenêtre des options... Et voilà !
Lorsque Firefox ouvrira une page Web, tout sera chiffré par Putty et transmis de manière sécurisée à votre serveur distant. Votre boss, votre voisin, votre femme, ... ne sauront rien !
Notez aussi que bien entendu, les sites Web auxquels vous accéderez verront l'adresse IP de votre serveur et non votre adresse IP personnelle. Cela apporte un petit plus.

Mon adresse IP en connexion directe (voir alaide.com) à gauche, et l'IP que voient les hôtes distants lorsque je suis connecté au travers d'un tunnel.
"Socksification" d'un logiciel
C'est bien beau tout ça, mais comment faire quand votre logiciel ne vous permet pas de choisir (ou alors pas facilement) un proxy à utiliser pour la connexion ? Certaines applications (ou jeux ^^) n'offrent pas cette possibilité, mais vous souhaitez quand même les faire passer au travers de votre tunnel...
C'est là qu'interviennent les programmes dits "socksifiers". Ils interceptent les paquets sortant de vos applications et les envoient vers un proxy (ici, on les renverra à l'adresse de notre client SSH, sur le port choisi -1080 par défaut-)
Le plus simple d'utilisation que je connaisse est Proxifier. Il est disponible en version d'essai et coûte environ 25€ actuellement (40$).
Une fois installé / ouvert, il suffit d'aller dans "Options > Proxy Settings", de faire "Add" et de saisir ceci :

Saisissez donc votre adresse IP (ou celle du client qui a ouvert le tunnel) ainsi que le numéro du port à utiliser (1080 par convention). Cochez "SOCKS Version 5", puis cliquez sur OK.
Vos applications seront automatiquement "tunnellées" : bureautique, jeux vidéos, multimédia... Il existe très peu d'exceptions !
Il est possible d'exclure des adresses IP (ou des plages), même chose pour les ports, et des applications. Rendez-vous dans "Options > Proxification rules", puis cliquez sur "Add". Vous pourrez ainsi choisir quels IP / ports / applications exclure de la socksification/proxification (hurray for the barbarsims !)
We're done !
Ceci conclut ce petit article très basique sur le tunnelling. J'espère qu'il vous apparaît facile à reproduire, si vous êtes perdus je suis ouvert à toute question.
Par la suite, je publierai une série d'articles un peu plus spécifiques, m'étant longuement pris la tête sur divers problèmes liés à cette technique. J'espère arriver à restituer ce que j'ai appris en lisant pas mal sur le Net, mais que j'ai toujours trouvé par bribes d'informations. Ces articles traiteront donc des sujets suivants :
- Comment assurer un minimum la sécurité de son serveur OpenSSH ?
(interdire l'accès root, identification par paires de clés, port alternatif) - Comment traverser un proxy bloquant d'entreprise avec un serveur OpenSSH sous Linux ?
- Comment faire si ce proxy détecte les connexions SSH ?
- Comment réaliser la même chose, mais avec un serveur sous Windows à la maison (si on ne possède pas de dédié sous Linux) ?
Bon tunnelling à tous !

octobre 19th, 2009 à 15 h 36 min
j'aime
et je link
octobre 19th, 2009 à 15 h 37 min
Merci !
octobre 19th, 2009 à 16 h 13 min
[...] Hop un petit tuto made by Morveus concernant les tunnels ssh: Par ici [...]