L'objet de cet article est de prolonger celui sur l'utilisation de Gmail avec Fluid. Vous allez certainement vous dire que j'ai un problème avec Gmail parce que je n'arrête pas d'en parler, mais c'est juste parce que c'est mon fournisseur de mails, j'y peux rien ! Toujours en quête de manières efficaces d'utiliser ma boîte mail, je vous avais donc présenté la manière d'utiliser le webmail de façon un peu plus conviviale que directement dans le navigateur, et ce grâce à l'émergence des SSB. Or cette solution, bien que pratique par plusieurs aspects (surtout que le webmail de Gmail est super bien branlé), n'égale toujours pas l'utilisation d'un vrai client mail. On n'est pas tous dans la vague du cloud computing, et c'est pourquoi une alternative existe dans la méthode du tunnelling SSH. Je tiens à remercier kik pour avoir relu cet article et pour m'avoir aidé à corriger certains gros défauts de jeunesse pouvant avoir un impact sur votre sécurité. Remerciez-le !
Les raisons de la colère
Après quelques semaines d'utilisation de cette méthode SSB, j'ai pu constater qu'elle était vraiment casse-bonbons, et ce pour plusieurs raisons :
- c'est lent de se connecter, d'initialiser Gmail, même hors-ligne
- le badge, et c'est inhérent à la méthode employée, ne s'affiche que lorsqu'on est sur la boîte de réception
- toujours pas de drag-and-drop (bien que ce problème puisse être résolu sous Prism ou Firefox avec une petite extension bien placée)
- une intégration foirée au reste du système Macintosh (mais ce serait le même problème si j'utilisais KDE ou n'importe quoi d'intégré)
- le webmail, si ça a beau être le meilleur, n'est pas pratique à mes yeux
Présentation
Mais alors comment faire pour utiliser mon client mail préféré alors que ma fac bloque ce p*$!# de port SMTP ? Une solution reste alors le magique tunnelling SSH. En quoi ça consiste ? Regardons un peu ma situation :

L'état actuel des choses
Vous voyez que lorsque je veux aller sur le web, je peux le faire en me connectant au réseau de la fac, qui filtre mes requêtes, et qui voit que lorsque j'utilise le protocole http, alors je suis un gentil garçon donc il me laisse passer et je peux aller sur Gmail en utilisant l'interface web. Très bien. Je peux également y aller de manière sécurisée, d'après ce schéma. En parlant de sécurisé, j'ai un pote qui m'a fourni un accès ssh sur son serveur, que nous allons appeler myssh.net. Grâce à tout le tapage qu'on a fait il y a un an, nous avons réussi à faire débloquer SSH à l'université. Par contre, le SMTP, il est hors de question : le gouvernement n'est soi-disant pas d'accord et c'est une mesure anti-spam. Qu'à cela ne tienne, on a notre SSH ! L'idée est la suivante : c'est la machine sur laquelle est mon compte SSH qui va aller se connecter au serveur SMTP de Google, en faisant ce que je lui dis. Si tant est que l'accès à Internet de la machine sur laquelle je me connecte en SSH n'est pas également restreint, ça devrait fonctionner au poil. Nous utiliserons alors une fonctionnalité de SSH nommée tunnel qui consiste à rediriger tout ce qu'il reçoit de nous vers un autre serveur, avec un autre port, comme ceci :
Mon tunnel, et hop ! Pompopopom popopom pom pom...
C'est complètement démoniaque. Que nous faut-il pour réaliser cette opération ? Un compte SSH quelque part, et c'est peut-être le plus dur à avoir. Cherchez dans vos amis, ou alors mettez en place un tel serveur chez vous. Nous allons voir comment s'y prendre avec Snow Leopard, le fournisseur Gmail et l'application Mail, mais cette technique géniale pourrait marcher avec tous les systèmes d'exploitation, tous les clients web et tous les fournisseurs du monde.
Un petit essai
Nous allons tout d'abord faire un petit essai pour voir si ça marche. Lancez votre cher Terminal et tapez la commande suivante (en adaptant). N'exécutez que les commandes en caractères monospace où la ligne commence par $ mais omettez le $. Cela indique une commande à exécuter en mode utilisateur (et donc pas en mode administrateur). Le reste des lignes en mode monospace non préfixées de $ sont ce que renvoie le terminal.
$ ssh -N -f userssh@serveurssh.net -L1025:smtp.gmail.com:25 sleep 60
Vous allez vous connecter à votre serveur SSH et il va vous demander votre mot de passe. Une fois la connection établie, ssh vous rendra la main. Voilà, c'est fait. Mais qu'est-ce qui a été fait ? En fait vous avez fait en sorte d'ouvrir votre port local 1025, de manière à ce qu'il soit connecté (via ssh) au serveur SMTP de Gmail (si ces notions de port et de serveur vous perdent, je vous conseille de lire ce petit article explicatif). Ainsi, nous allons maintenant essayer de nous connecter à ce serveur par le biais de notre tunnel grâce au programme telnet :
$ telnet 127.0.0.1 1025 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 mx.google.com ESMTP e20sm6373203fga.10
Si cette dernière ligne s'est affichée, c'est que c'est gagné, vous êtes arrivé(e) de l'autre côté. Pour vous enfuir de ce telnet austère, faites Ctrl+$ puis Ctrl+D. Vous êtes maintenant revenu(e) au shell, ce bon vieux shell ! Tuons le processus ssh qui ouvre notre port 1025 et nous pourrons ainsi arrêter le tunnel :
$ killall ssh
Bien. Nous revoilà au point de départ. Maintenant il doit vous venir une petite question en tête : comment automatiser cette tâche ? Et surtout, même si la tâche est automatisée, comment faire en sorte d'éviter que ssh nous demande notre mot de passe, sans pour autant compromettre grandement la sécurité ?
Définir une poignée de main secrète
Si vous avez déjà été initié(e) à la cryptographie, vous devez savoir comment assurer la sécurité de vos échanges grâce au système à clé publique. SSH permet de faire cela eet de se passer de mot de passe. Je vous conseille de lire cet article de l'encyclopédie la plus utilisée au monde pour comprendre de quoi il en retourne, mais le principe est à peu près comparable à une poignée de main secrète qui garantit l'authenticité des transferts et de leurs acteurs. Une petite vidéo vous expliquera mieux que des mots comment réaliser une poignée de main secrète :
Poignée de main secrète à gogo
Ainsi, nous allons générer une poignée de main, certes pas aussi stylée que celle sur la vidéo, mais pas trop mal non plus. Entrez cette commande dans votre terminal :
$ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/Users/join/.ssh/id_rsa): (appuyez sur Entrée) Enter passphrase (empty for no passphrase): (entrez un mot de passe) Enter same passphrase again: (le même mot de passe)
Vous aurez droit à pas mal de petits dessins super sympas et un message qui dit qu'il a fini (ayé maman). Ne pas mettre de passphrase c'est grandement compromettre la sécurité de votre système. Je vous aurai mis en garde. Vous avez maintenant généré deux clés. Oui, car ce programme permet de générer deux clés : une clé publique et une clé privée. La clé publique est la poignée de main secrète brillamment réalisée devant tout le monde, c'est la manière de coder les messages. Par contre, la clé privée, c'est en quelque sorte comment réaliser, et donc comprendre, cette poignée de main secrète si subtile qui fait de vous le légitime membre d'un gang, c'est ce qui sert à décoder les messages. La prochaine étape consiste à envoyer votre clé publique au destinataire, c'est-à-dire au serveur ssh où vous pouvez vous connecter. Nous allons faire cela en une seule commande (n'oubliez pas de l'adapter) :
$ cat ~/.ssh/id_rsa.pub | ssh user@serveurssh.net "cat - >> ~/.ssh/authorized_keys"
Vous pouvez écrire le caractère pipe (|) en utilisant la combinaison de touches ⇧⌥L. Je vous le dis parce que j'ai eu du mal à trouver. Une fois la session ssh fermée, vous pouvez vous servir une coupe de champagne... Ah non... Il manque le principal !
Automatiser la tâche
Nous allons maintenant toucher un peu au service responsable du lancement de multitudes de choses sous Mac OS X, depuis la version 10.4 : il s'agit, mesdames et messieurs, de launchd ! Ce démon est configurable à travers le programme launchctl et permet pas mal de trucs fantastiques. Son utilité principale est de lancer des programmes, que ce soit en réponse à un événement précis ou non, sous tel nom d'utilisateur ou en tant qu'administrateur, qu'il pleuve ou qu'il vente. C'est ce qui s'occupe du démarrage de l'ordinateur, par exemple. Notre tâche, afin d'automatiser la création d'un tunnel, est donc de créer une entrée de lancement dans ce démon, c'est-à-dire de créer un agent qui sera responsable de la création du tunnel, au bon moment.
Créer un agent launchd
Nous allons créer un agent qui lancera le tunnel une fois qu'on demandera à accéder au port local 1025. Un tel agent est en réalité un simple fichier plist, le format de fichier dont Apple est amoureux, qui est une sorte de XML très simplifié qui sert juste à stocker des entrées de dictionnaire, c'est-à-dire des couples clé/valeur, de manière hiérarchisée. En clair, c'est comme une page web mais en tout con, vous allez voir. Créons d'abord le fichier qui abritera notre agent, dans le répertoire de recherche utilisateur de launchd :
$ vim ~/Library/LaunchAgents/oin.mail
Si vous ne savez pas comment faire un tilde (~, décidément), c'est simple mais j'en ai aussi chié pour trouver : tapez ⌥N. Vous entrez dans le meilleur programme du monde, c'est-à-dire vim, l'éditeur de texte à tout faire et mieux qu'Emacs en plus :). Mettez-vous en mode insertion (en tapant i) et collez le texte ci-dessous :
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Debug</key> <false/> <key>Label</key> <string>oin.mail</string> <key>OnDemand</key> <true/> <key>ProgramArguments</key> <array> <string>/usr/bin/ssh</string> <string>-N</string> <string>-f</string> <string>user@serveurssh.net</string> <string>-L1025:smtp.gmail.com:25</string> </array> <key>Sockets</key> <dict> <key>Listeners</key> <dict> <key>SockServiceName</key> <string>1025</string> <key>SockType</key> <string>stream</string> </dict> </dict> <key>StandardErrorPath</key> <string>/tmp/sshmail.err</string> <key>inetdCompatibility</key> <dict> <key>Wait</key> <false/> </dict> </dict> </plist>
N'oubliez pas d'aller changer ce que j'ai mis en rouge (si vous n'avez jamais utilisé vim, bonne chance). Pour sauvegarder et quitter, tapez sur Echap pour quitter le mode d'insertion et se remettre en mode normal, puis entrez :wq et confirmez en tapant sur la touche Entrée. Vous êtes revenu(e) dans le shell. Ouf ! Notre agent va faire en sorte que launchd lance le tunnel ssh lorsqu'on tripote le port local 1025 (je crois que je referai un petit article sur launchd tellement c'est marrant de jouer avec).
Charger l'agent
Nous devons maintenant tester ce que nous avons fait, notre bébé. Chargeons l'agent que nous avons créé par cette commande :
$ launchctl load -S Aqua ~/Library/LaunchAgents/oin.mail
Nous avons besoin du switch S pour préciser à launchctl que nous voulons que cet agent se lance avec le type Aqua, ce qui lui permettra de pouvoir interagir avec l'interface graphique. Nous verrons que c'est diablement important. Vérifiez maintenant que ce démon est bien listé grâce à cette magnifique commande :
$ launchctl list | grep oin.mail - 0 oin.mail
C'est bon. Roulez, jeunesse !
Autoriser la connection
Vous allez tôt ou tard être confronté(e) à cette horrible boîte de dialogue :

Allez, paye ton pass quoi !
Elle vous somme de rentrer votre mot de passe. C'est la passphrase que vous avez rentré plus haut, lorsque vous avez créé vos clés. Une fois votre mot de passe entré dans la boîte de texte, je vous conseille de cocher Mémoriser le mot de passe dans le trousseau pour ne plus avoir à revivre ce terrible épisode. Cliquez sur OK et le tour est joué.
Configurer Mail.app
Au fait, SMTP ça veut dire quoi ?
Il reste maintenant à configurer notre client mail pour utiliser ce serveur SMTP. Je fais l'hypothèse que vous avez déjà configuré votre compte Gmail dans l'application Mail. Lancez cette dernière, puis allez dans les préférences, dans le panneau Comptes. Sélectionnez votre compte puis, dans l'onglet Informations du compte, cliquez sur la liste déroulante en face de Serveur d'envoi pour pouvoir cliquer sur Modifier la liste des serveurs SMTP. Vous arrivez face à une feuille modale qui apparaît et vous propose de configurer vos serveurs SMTP. Vous en avez déjà un, c'est celui qui a été configuré à la création du compte dans Mail, et nous allons le laisser (oui, c'est plus direct et souvent plus rapide de ne pas avoir d'intermédiaire). Ajoutez un nouveau serveur SMTP en cliquant sur le bouton + puis remplissez les champs comme sur la capture d'écran ci-contre. Une fois les modifications effectuées, cliquez sur OK et fermez la fenêtre des préférences de Mail. Ecrivons un nouveau message à notre destinataire préféré : vous-même ! N'oubliez pas de sélectionner le serveur SMTP que nous venons d'ajouter, qui est en fait notre tunnel.

Un cas très banal de schizophrénie. Pas mal, le fond d'écran, non ?
Envoyez le mail et attendez environ quelques secondes et demi. Surprise :

Père Noël !
Je crois que tout est dit, ça marche et je vous ai sauvé la vie, pas la peine de m'embrasser je suis malade. Oh non, j'ai encore oublié quelque chose !
Alternative à launchd
Si, pour une raison ou une autre, vous ne voulez pas utiliser launchd, vous pouvez toujours vous rabattre sur cette superbe application qui vous permettra de faire des tunnels SSH à tour de bras, de les lancer et de les arrêter graphiquement, et surtout de voir que vous avez tapé pas mal de commandes pour rien. Mais ce que vous avez peut-être appris ici valait bien le dérangement, non ?

