Salut à tous !

Je viens aujourd’hui vous présenter stunnel ! Alors qu’est-ce que Stunnel ?

I] Explications sur Stunnel

Définition officielle traduite(google trad.) depuis stunnel.org :

Stunnel est un proxy conçu pour ajouter des fonctionnalités de chiffrement TLS pour les clients et les serveurs existants sans aucun changement dans le code des programmes. Son architecture est optimisée pour la sécurité, la portabilité et l’évolutivité (y compris l’équilibrage de charge), ce qui convient pour les grands déploiements.

Plus globalement, Stunnel est un programme qui va permettre d’encapsuler un flux de données dans un tunnel ssl/tls de façon à chiffrer la communication entre le serveur et le client. Tout ça dans le but d’améliorer par exemple la sécurité d’un programme comme VNC ou autre.

Stunnel est très utile également lorsque vous voulez contourner un proxy/firewall qui bloque les connexions ssh ou vpn par exemple. Ainsi grâce à Stunnel vous établirez votre communication encapsulée dans un tunnel SSL/TLS et qui sera identifiée comme des paquets HTTPS d’une navigation sur un site lambda par les proxy/firewall qui font du contrôle d’application, ce qui pour un proxy/firewall est difficilement détectable !

Attention ! Toute utilisation de Stunnel à but illégal n’engage que vous et votre responsabilité. En aucun cas, je ne pourrais être mis en cause de vos actes auxquels je ne vous incite pas à travers ce tuto.

Stunnel s’installe sur la plupart des distrib Linux, mais aussi sur Windows ! Ici dans notre exemple nous aurons :

  • Le serveur sur Debian 7
  • Le client sur Fedora 22

Mais la configuration est presque identique sur d’autres distributions.

II] Installation & configuration serveur

Installons donc ici sur Debian notre partie serveur.

apt-get install stunnel4

Allons dans le répertoire de configuration.

cd /etc/stunnel/

Maintenant nous allons génerer la clé et le certificat qui nous permettra de sécuriser la liaison.
Générons donc ici la clé en 2048 bits :

openssl genrsa -out cleserveur.key 2048

Maintenant notre « CSR » (Signature de la demande de certificat) :

openssl req -new -key cleserveur.key -out demandecertif.csr

Et ensuite notre certificat autosigné qui sera ici valide 365 jours :

openssl x509 -req -days 365 -in demandecertif.csr -signkey cleserveur.key -out certserver.crt

Pour terminer nous allons combiner le certificat et la clé (générée plus haut) dans un même fichier :

cat cleserveur.key > server.pem && cat certserver.crt >> server.pem

Nous allons maintenant commencer la configuration de Stunnel. Faites une sauvegarde du fichier par défaut :

mv /etc/stunnel/stunnel.conf /etc/stunnel/stunnel.conf.bak

Avant de se lancer dans la config, j’aimerais juste vous prévenir qu’ici les commentaires sont identifiés par des ‘;’ et non par ‘#’ comme habituellement sur Linux.

vim /etc/stunnel/stunnel.conf

J’utilise ici vim pour l’édition mais vous pouvez utiliser nano si vous êtes plus à l’aise avec.
Copier le texte ci-dessous et collez-le dans votre fichier :
–> Par précaution je ne met jamais d’accent/apostrophe,etc dans les commentaires d’un fichier de configuration

; Version du protocole a utiliser (all, SSLv2, SSLv3, TLSv1) - Nous utiliserons tous sauf SSLv2 qui n'est pas assez sécurisé
sslVersion = all
options = NO_SSLv2
; Un peu de sécurité en plus - on emprisonne lexecution de stunnel
chroot = /var/lib/stunnel4/
; Le PID sera cree a linterieur la prison
pid = /stunnel4.pid
; Cette partie reste commentee - elle servira en cas de debeug
; debug = 7
; output = /var/log/stunnel4/stunnel4.log
; lutilisateur et le groupe utilise pour faire fonctionner stunnel en toute securite
setuid = stunnel4
setgid = stunnel4
; Ici on vient optimiser la connexion pour diminuer la latence reseau et compresse le flux
socket = l:TCP_NODELAY=1
socket = r:TCP_NODELAY=1
compression = zlib
; creation dun service decoute stunnel
[ssh]
accept = 11322
connect = 22
cert=/etc/stunnel/server.pem
key=/etc/stunnel/cleserveur.key

Ici on a créé un service SSH qui sera en écoute sur le port 11322 et qui sera lié avec le port 22 local. Ainsi lorsque mon client établira une connexion sur le port 11322 du serveur, le flux sera directement lié au port 22 du serveur. Si vous voulez éviter d’être bloqué par les Firewall choisissez soit le port 443 soit un port haut, entre 49152 et 65535 (ports dynamiques ou privés).
Si jamais vous avez des règles iptables par exemple, n’oubliez pas de rajouter une exception pour le nouveau port.

Maintenant nous allons activer stunnel

vim /etc/default/stunnel4

Modifiez l’option suivante comme ci-dessous :

ENABLED=1

Puis démarrez stunnel :

/etc/init.d/stunnel4 start

Si vous voulez qu’il démarre automatiquement au démarrage, tapez la commande suivante :

chkconfig stunnel4 on

La partie serveur est donc terminée !

III] Installation & Configuration Client

Maintenant nous allons nous attaquer au client. Cependant avant de vous lancer n’oubliez pas de récuperer le certificat server.pem sur votre client. Vous pouvez très bien utiliser SCP ou SFTP par exemple. Copiez le dans le dossier /etc/stunnel/.
Installons les paquets nécessaires, ici sur Fedora :

dnf install stunnel

Nous allons éditer le fichier de configuration de stunnel sur le client :

vim /etc/stunnel/stunnel.conf

Copiez puis collez ces lignes dans le fichier

cert = /etc/stunnel/server.pem
pid = /var/run/stunnel.pid
client = yes
[ssh]
accept = 127.0.0.1:51122
connect = bidouilleit.com:11322

Cette fois le fichier est plus simple. Nous spécifions notre service avec le port local en écoute (ligne ‘accept’) et le serveur distant avec son port. Ici j’ai fais exprès de mettre un port différent dans la ligne ‘accept’ par rapport à la config du serveur(ligne ‘connect’). En effet sur beaucoup de tutos que j’ai pu lire sur le sujet, ils renseignent le même port et cela peut porter à confusion.
Le port dans la ligne ‘accept’ coté client ne sert qu’à specifier sur quel port le socket créé par stunnel sur le client va écouter. Il n’a aucune importance par rapport au serveur distant !

Lançons donc notre stunnel :

stunnel /etc/stunnel/stunnel.conf

Puis établissons notre connexion ssh. Comme expliqué, ici nous allons nous connecter au socket stunnel en local qui écoute sur le port 51122. Ce dernier va ensuite établir une connexion avec le socket du serveur qui lui écoute sur le port 11322. Coté serveur la connexion va de suite être liée au port ssh du serveur.

ssh [email protected] -p 51122

Ici nous venons de tester avec SSH mais il est tout à fait possible de le faire avec n’importe quel autre service comme par exemple OpenVpn.

Pour arrêter le socket stunnel sur le client, nous allons taper la commande suivante qui va tuer le processus grâce à son PID :

kill `cat /var/run/stunnel/stunnel.pid`

Voilà ! J’espère avoir été clair et avoir pu vous apporter mon aide !

N’hésitez pas à laisser un commentaire !
_____________________

A bientôt sur bidouilleit.com !

– Bruno Sousa –