5

SSLH avec NGINX (SSL+SSH sur le même port 443)

Sur un serveur dédié, une des premières règles de base à appliquer est de modifier le port 22 du serveur SSH par autre chose. Cependant, avec un outil comme ZenMap il est très facile de connaître le port d’écoute du serveur SSH. Pour « tromper » les futurs attaquants, le serveur SSH va être paramètré pour écouter sur le port 443. Le problème est si le port 443 est déjà utilisé par service web alors les 2 services rentrent en conflis. Pour régler le problème, une couche sera ajouter au serveur : SSLH.

SSLH aura pour rôle de gérer les requêtes venant du port 443 et les diriger au service en question (web ou SSH).
Il a été déjà vue sur le blog, comment configurer SSLH avec Apache2. C’est le tour de configurer SSLH avec NGINX sur Debian Wheezy.

De plus, le fait de paramétrer l’écoute du serveur SSH sur le port 443, cela permet de passer les règles de filtrages des proxys entreprise pour accéder à son serveur dédié.

Installer SSLH sans les dépendances

Pour installer sslh sur le serveur, apt recommande d’installer Apache2 :

apt-cache show sslh
Package: sslh
Version: 1.13b-3.2
Installed-Size: 166
Maintainer: Guillaume Delacour <gui@iroqwa.org>
Architecture: amd64
Depends: libc6 (>= 2.4), libconfig9, debconf (>= 0.5), adduser, lsb-base (>= 3.0-6), update-inetd
Recommends: apache2 | httpd, openssh-server | ssh-server
.....

Cependant, ici le système est paramétré avec NGINX donc on va préciser à apt de ne pas installer les paquets recommandés :

apt-get install --no-install-recommends sslh

Configuration de Nginx

Le port SSL des sites web hébergés par le serveur vont être changés par 1443 via la commande sed :

cd /etc/nginx/site-availables
sed -i -e "s/443/1443/g" *

Relance du service nginx pour la prise en compte du changement du port SSL :

service nginx restart

Configuration de SSLH

Edition du fichier de configuration /etc/default/sslh:

nano /etc/default/sslh

Modifier le port SSL préalablement défini et passer RUN à yes :

RUN=yes
DAEMON_OPTS="-u sslh -p 0.0.0.0:443 -s 127.0.0.1:666 -l 127.0.0.1:1443 -P /var/run/sslh.pid"

Démarrer SSLH :

/etc/init.d/sslh start

Supprimer la règle iptables du port SSH

Ne pas oublier de supprimer la règle d’ipables, qui correspondait au port d’écoute du service SSH.
Pour commencer, il faut lister et numéroter toutes les règles d’iptables :

iptables -L --line-numbers

Ensuite repérer le numero de la ligne qui correrspond à la règle SSH et la supprimer :

iptables -D INPUT 9  ##9 est un exemple de numéro de ligne

Vérification des ports ouverts sur le serveur

A partir d’une autre machine, faire un scan des ports soit avec nmap ou son outil graphique ZenMap :
zmap

Partager l'article :





fred

"Dire que l'on s'en fiche du droit à la vie privée sous prétexte qu'on a rien à cacher, c'est comme déclarer que l'on se fiche du droit à la liberté d'expression sous prétexte qu'on a rien à dire." Edward Snowden

5 commentaires

  1. Ah mais décidément ce site est une mine d’or et d’inspiration ! Mis en place aussi sec.
    Une remarque à nouveau, à la lecture du /usr/share/doc/sslh/README.Debian
    Il semble plutôt préconisé de ne pas écouter sur toutes les adresses IP possibles (0.0.0.0) mais uniquement en localhost, ce qui renforce d’ailleurs la sécurité (moins d’accès possibles).
    Je suis donc resté en 443, mais avec le changement suivant dans mes configs nginx :

    sed -i -e « s/listen 443/listen 127.0.0.1:443/g » *

    et un simple changement de config dans /etc/default/sslh :

    DAEMON_OPTS= »–user sslh –listen 192.168.1.XX:443 –ssh 127.0.0.1:22 –ssl 127.0.0.1:443 –pidfile /var/run/sslh/sslh.pid »

    Merci !
    L’utilisation de sslh a aussi l’avantage de ne pas exposer le port 22 sur internet, mais ça devrait être fait de base.

  2. Bonjour Daniel,
    je ne suis pas sûr que ça fonctionne si tu laisse l’écoute du port 443 pour les deux services : SSLH et SSL.
    Car un seul service peut « prendre la main » sur un port dédié…

    De plus, si je comprend bien ta configuration seul ton serveur peut accéder au SSL, comment fais-tu pour accéder de l’éxtérieur au https ? il y a un truc qui m’échappe ?

    De mon côté, seuls les ports 80 et 443 sont ouvert à l’extérieur(règle iptables). La gestion du port 443 est géré par SSLH, qui redirige la requète soit du le port 1443 (SSL) ou le port 666 (SSH).

  3. Bonjour,
    Ca fonctionne bien,
    Comme tu le dis en début d’article :
    SSLH aura pour rôle de gérer les requêtes venant du port 443 et les diriger au service en question (web ou SSH).

    J’utilise donc bien 443 depuis l’extérieur, c’est routé avec ma box sur le réseau local 192.168.X sur la machine ou tourne sslh, qui fait le tri entre les trames pour 127.0.0.1:22 pour ssh et 127.0.0.1:443 pour ssl

    Donc on peut modifier les champs des services, mais ce n’est pas obligatoire, sslh étant en amont pour faire le tri sur l’IP du réseau local, puis redirigeant en localhost sur le service final.

    Ce que je comprends des configs réseau, c’est que 0.0.0.0 s’applique à toutes les routes possibles sur une machine (si on a plusieurs cartes réseau par exemple), 192.X s’applique au LAN, 127.0.0.1 n’est par contre accessible que localement sur la machine, ce qui renforce la sécurité.

    Cela pourrait permettre que ssh ne tourne qu’en localhost par exemple, et donc pas accessible depuis une autre machine du réseau local port 22 , non plus, mais uniquement en 442 via sslh, par exemple.
    Sans soucis pour le moment.

    A+

  4. Ok merci pour les éclaircissements :-D

    En gros, c’est ce que fait la ligne :
    [code lang= »shell »]
    DAEMON_OPTS="-u sslh -p 0.0.0.0:443 -s 127.0.0.1:666 -l 127.0.0.1:1443 -P /var/run/sslh.pid"
    [/code]
    SSH n’est accessible que depuis localhost sur le port 1443 pour moi et 443 pour toi … mais dans mon cas je ne peux pas remplacer 0.0.0.0 par l’adresse Ip en 192.* ou autre vue que je n’ai que l’adresse IP public (serveur dédié hébergé) mais sur une machine à la maison oui je pourrais.

    En tout cas je suis entièrement d’accord avec toi pour ajouter le maximum de sécurité à son serveur ! :-)

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *