SSLH : Multiplexer les connections SSL et SSH sur le même port

From Deimos.fr / Bloc Notes Informatique
Jump to: navigation, search

1 Introduction

SSLH est comme un tour de magie. Il permet par exemple sur une adresse WAN sur le port 443 d'avoir du HTTPS et du SSH. Comment c'est possible ??? On peut mettre un même port d'écoute sur un même port !

Effectivement ! Il faut simplement voir SSLH comme un proxy de couche 7 capable de filtrer et différencier les trames SSL des trames SSH.

2 Installation

2.1 Debian

Sur Debian, easy move :

Command aptitude
aptitude install sslh

2.2 FreeBSD

Pour l'installation sur FreeBSD :

Command pkg_add
pkg_add -vr sslh

2.3 OpenBSD

Sur OpenBSD pour une version 1.7 :

Command
wget http://www.rutschle.net/tech/sslh-1.7a.tar.gz
tar -xzvf sslh-1.7a.tar.gz
cd sslh-1.7a
cc -o sslh -DLIBWRAP sslh.c -lwrap
cp sslh /usr/local/sbin

Pour les dernières versions :

Command
wget http://www.rutschle.net/tech/sslh-1.10.tar.gz
tar -xzvf sslh-1.10.tar.gz
cd sslh-1.10
make
make install

Note : Sur les dernières version vous allez vous trouver ave 2 binaires : sslh-fork et sslh-select. sslh-select est pour 1 seul thread tandis que sslh-fork est multithreadé.

3 Configuration

3.1 Debian

Si vous êtes sur Debian, c'est simple, vous créez un fichier dans /etc/default/sslh avec le contenu suivant :

Configuration File /etc/default/sslh
LISTEN=ifname:443
SSH=localhost:22
SSL=localhost:443

  • LISTEN : C'est l'IP de l'interface et le port d'écoute d'SSLH. Il faut que ce soit le port d'écoute d'entrée (WAN par exemple), celui par lequel vos clients vont passer
  • SSH : L'adresse du port, ainsi que la machine correspondant à votre port SSH
  • SSL : L'adresse du port, ainsi que la machine correspondant à votre port HTTPS

3.2 FreeBSD

Pour configurer SSLH, il suffit d'ajouter ces lignes dans rc.conf :

Configuration File /etc/rc.conf
# SSLH
sslh_enable="YES"
sslh_mode="select"
# sslh_fib="NONE"
sslh_pidfile="/var/run/sslh/sslh.pid"
sslh_ssltarget="websrv:443"
sslh_sshtarget="localhost:22"
sslh_sshtimeout="2"
sslh_listening="192.168.0.254:443"
sslh_uid="nobody"

3.3 OpenBSD

Sur OpenBSD, j'ai choisis d'ajouter ces lignes dans /etc/rc.local avec ma configuration directement dans la ligne de commande :

Configuration File /etc/rc.local
if [ -x /usr/local/sbin/sslh ] ; then
    # Versions < 1.7a
    /usr/local/sbin/sslh -p <interface:443> -s <ssh_srv:22> -l <web_https:443>    # Versions >= 1.10
    /usr/local/sbin/sslh -P /tmp/sslh.pid -p <interface:443> --ssh <ssh_srv:22> --ssl <web_https:443>    echo 'SSLH'
fi

Encore une fois, a vous d'adaptez ces lignes selon vos besoins.

3.4 pfSense

Sur pfSense, nous allons créer un fichier type init :

Configuration File /usr/local/etc/rc.d/sslh.sh
#!/bin/sh
sslh_listen_ip=<interface_ip>sslh_listen_port=<port>ssh_redirect_ip=<interface_ip>ssh_redirect_port=<port>ssl_redirect_ip=<interface_ip>ssl_redirect_port=<port> 
rc_start() {
	/sbin/sslh-fork -P /tmp/sslh.pid -p $sslh_listen_ip:$sslh_listen_port --ssh $ssh_redirect_ip:$ssh_redirect_port --ssl $ssl_redirect_ip:$ssl_redirect_port &
}
 
rc_stop() {
	/usr/bin/killall sslh-fork
}
 
case $1 in
	start)
		rc_start
		;;
	stop)
		rc_stop
		;;
	restart)
		rc_stop
		rc_start
		;;
esac

A vous d'adapter le début du script avec les informations souhaitées.

Puis mettre les bons droits :

Command chmod
chmod +x /usr/local/etc/rc.d/sslh.sh

4 FAQ

4.1 J'ai des processus Zombies de sslh sur OpenBSD

Il m'est arrivé d'avoir des processus zombie à chaque tentative de connexion sur le serveur SSH. Pour palier à ce problème, voici un patch pour la version 0.7 :

Configuration File patch
462a463,464
>    if (fork() > 0) exit(0); /* Detach */
>
467,468d468
<    if (fork() > 0) exit(0); /* Detach */
<