Sslh multiplexer
26 mai 2013
Adrien Oliva
4 minutes
730 mots

Cet article est issue de mon ancien blog, il est copié tel quel et est peut être un peu vieux sur certains aspects (notamment les Debians sans systemD par défaut)

J’avais déjà parler plusieurs fois de sslh et donc tout naturellement je vous fait un petit article dessus.

Présentation

Sslh est un petit soft qui permet de multiplexer plusieurs service sur un même port. En particulier et à l’origine, il permettait d’utiliser les protocoles SSH et HTTPS sur le même port. Techniquement le petit soft utilise les comportements différents des deux protocoles : SSH attend gentiment que le client lui donne un utilisateur et un mot de passe alors que HTTPS demande tout de suite une ressource. Plus tard, ce soft a évolué et permet maintenant de multiplexer encore plus de service comme OpenVpn ou XMPP.

Utilisation

Je passerais les étapes d’installations, sslh est disponible dans les dépôts d’à peu près toutes les distributions.

La configuration se trouve dans le fichier /etc/sslh.conf. Il est extrêmement bien commenté pour quiconque parle un peu anglais.

Dans la section listen, vous pouvez fixer le port et les IP sur écoute. Pour tout multiplexer sur le port 443 pour tout le monde, il faut les lignes suivante dans votre fichier de configuration :

listen:
(
    { host: "0.0.0.0"; port: "443"; }
);

Ne jamais, jamais, jamais, jamais oublier de changer les ports des services déjà installés comme par exemple le port par défaut de votre serveur web sécurisé.

Ensuite, il va falloir dire à sslh quel service utiliser pour les différents protocoles et sur quel port dialoguer… On utilise pour cela la section protocols. Pour multiplexer SSH et HTTPS (c’est quand même le but principal de l’article), il faut copier ces lignes dans votre fichier de configuration :

protocols:
(
    { name: "ssh"; service: "ssh"; host: "localhost"; port:   "22"; probe: "builtin"; }
   ,{ name: "ssl";                 host: "localhost"; post: "8443"; probe: "builtin"; }
);

Ces deux lignes vont rediriger le protocole SSH sur le service ssh de la machine localhost accessible sur le port 22 et le protocle HTTPS (ssl) de la machine localhost accessible sur le port 8443. Il faudra penser à configurer correctement votre serveur SSH sur le port 22 et votre serveur web sur le port 8443 pour la partie sécurisée.

Redémarrer vos services SSH, web, etc… si leur configuration a changée. Démarrez maintenant votre serveur sslh. Sous Debian, une commande du genre :

root@debian # service sslh start

Sous ArchLinux (ou tout système utilisant systemd), la commande est plus du genre :

root@archlinux # systemctl start sslh-select

(cette commande est testée et approuvée)

Si le service se lance bien, vous pouvez l’activer pour qu’il démarre tout seul en même temps que la machine. Sous Debian, une petite commande à la update-rc.d ou quelque chose comme ça et le tour est joué. Sous Archlinux,

root@archlinux # systemctl enable sslh-select

Et voilà, maintenant, vous pouvez accéder à votre serveur web sécurisé ET à votre serveur ssh sur le même port 443. Pour rappel, l’option -p de ssh permet de déterminer un port spécifique.

Avantages Inconvénients

Alors incontestablement, sslh permet d’accéder à un serveur ssh même derrière un parefeu très restrictifs, tout en gardant un serveur web sécurisé opérationnel. N’importe quel parefeu, aussi restrictif soit-il, ne peut pas bloquer le port 443.

Par contre au rayon des inconvénients, j’en note 2. Un, pas très grave, mais qui va déplaire à toutes les personnes très à cheval sur leurs statistiques. En passant par sslh, le serveur web voit les requêtes qui lui arrivent dessus en provenance de localhost.

Un autre soucis, un peu plus embêttant que j’ai vu apparaitre sur mes deux serveurs Archlinux, sslh fini par faire un buffer overflow au bout d’un certains temps. Je ne sais pas si c’est un bug du soft, un problème dans les packages des dépôts officiels… Je n’ai pas encore eu le temps de regarder tout ces détails, ni de faire plus de tests mais c’est assez agaçant. D’autant que le serveur web sécurisé n’est plus accessible sur le port 443. À l’heure actuelle, j’ai une béquille sur mes serveurs qui vérifient l’état du service sslh-select et le relance si besoin. Dans un crontab, la petite ligne :

*/10 * * * systemctl status sslh-select | grep "Active: failed" && systemctl restart sslh-select

Et voilà… Vous avez maintenant un serveur avec tous vos services accessibles de partout.