La porte qui ne répond pas
Je voulais piloter depuis mon téléphone un agent qui tourne sur mon serveur. La solution évidente — un sous-domaine, un mot de passe — était la mauvaise, et pour une raison qui n'a rien à voir avec la cryptographie. Voici le raisonnement, et les trois pièges bêtes qui m'ont coûté un après-midi.
Ce qu'on expose vraiment
Un agent qui tourne en serveur, ce n'est pas une page web. C'est un interpréteur de commandes. Il lit des fichiers, il en écrit, il lance des programmes. Mettre ça derrière un sous-domaine avec un mot de passe, c'est mettre un shell sur Internet et espérer que le mot de passe tienne.
La bonne question n'est pas « est-ce que mon mot de passe est solide ». C'est : qu'est-ce que quelqu'un obtient s'il franchit cette porte ? Sur un serveur d'agent, la réponse est presque toujours : tout. Le compte qui fait tourner l'agent est celui qui a le droit de déployer, de redémarrer, de lire les configurations. Supposez que qui l'atteint devient administrateur, et vous raisonnerez juste.
Pourquoi pas un service tout fait
Il existe des services qui montent ce genre de tunnel en trois clics. Ils reposent tous sur la même mécanique de chiffrement, éprouvée, et je n'ai rien à leur reprocher là-dessus.
Le point faible est ailleurs. Ces services ont un serveur de coordination : une machine, chez eux, qui sait quels appareils existent et qui distribue les autorisations. Ce n'est pas le tunnel qu'un attaquant vise, c'est cet annuaire. Et quand il tombe, il tombe pour tout le monde à la fois.
En montant le tunnel soi-même, cet annuaire n'existe pas. Les machines se reconnaissent par leur clé, échangée une fois, à la main. Il n'y a personne à compromettre, parce qu'il n'y a personne.
Une porte qui ne répond pas
Voilà la propriété qui décide de tout, et elle est mal connue.
Un serveur SSH ouvert sur Internet répond. On lui envoie n'importe quoi, il annonce son nom et sa version. C'est ainsi qu'on se fait recenser : des robots balaient l'Internet en permanence, notent ce qui répond, et reviennent plus tard.
Le tunnel, lui, ne répond pas. Un paquet qui n'est pas signé par une clé qu'il connaît déjà est jeté sans un mot : pas de refus, pas d'erreur, rien. Pour un robot qui balaie, ce port n'existe pas.
Conséquence agréable : une fois le tunnel en place, on peut refermer l'accès d'administration habituel. On ne rajoute pas une porte, on en remplace une bavarde par une muette.
Les trois pièges
Le tunnel a marché du premier coup. C'est le reste qui a résisté, et aucun des trois problèmes n'était intéressant. Les voici pour qu'ils ne vous coûtent pas le même après-midi.
1. La taille des paquets
Symptôme : les petites réponses passent, les grosses disparaissent. Une page qui « charge » indéfiniment, aucune erreur, aucun journal. C'est ce qu'il y a de pire à diagnostiquer, parce que quelque chose marche.
Un tunnel ajoute une enveloppe autour de chaque paquet. Si la valeur configurée ne tient pas compte de cette enveloppe, les paquets pleins sont jetés en silence quelque part sur le chemin — et un aller-retour court, lui, passe très bien. J'ai soupçonné l'authentification, la configuration du serveur, un défaut du logiciel. C'était une histoire de taille.
2. L'espace invisible
Une clé refusée, un message d'erreur qui parle de longueur. La clé était juste — vérifiée des deux côtés, même empreinte. Le clavier du téléphone avait ajouté une espace à la fin du collage.
Une heure perdue à soupçonner une clé correcte. Quand un secret collé est refusé, la première hypothèse n'est pas qu'il est faux : c'est qu'il a été abîmé en route.
3. L'adresse au mauvais endroit
Le formulaire demande deux adresses qui n'ont rien à voir : la vôtre dans le tunnel, et celle du serveur à joindre. Mettez la seconde à la place de la première, et le tunnel s'établit quand même — la poignée de main n'en dépend pas — mais rien ne circule ensuite. Ça marche à moitié, ce qui est la pire façon de ne pas marcher.
Le garde-fou qui efface
Dernier épisode, et le plus instructif. Deux fois, le tunnel s'est tu tout seul après avoir fonctionné.
Mon pare-feu n'est pas configuré à la main : il est déclaré dans un fichier, et un programme le réapplique tout seul à intervalle régulier. Toute règle ajoutée à côté disparaît au passage suivant. Sans message, évidemment : il ne corrige pas une erreur, il remet l'état voulu.
Ce qui rend le symptôme trompeur, c'est que la connexion en cours survit. Tout semble marcher — jusqu'à la première coupure, où plus rien ne revient.
Ce que je n'écris pas ici
Un article sur sa propre infrastructure demande de décider ce qu'on tait. Ma règle : aucune valeur. Pas de clé, pas de mot de passe, pas d'adresse de machine, pas de numéro de port. Non parce que ce serait dangereux de les connaître — la solidité d'un système ne doit jamais reposer sur le secret de sa mécanique — mais parce qu'ils ne servent à rien au lecteur. Ce qui l'aide, c'est le raisonnement ; ce qui ne l'aide pas mais aiderait quelqu'un d'autre, on le garde.
Il y a aussi ce que je tais parce que ce n'est pas encore réglé. Un serveur d'agent joignable par le tunnel donne accès à un compte puissant, et c'est le vrai sujet — plus important que tout le débat sur le tunnel. Le tunnel est la moitié facile.