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 –
Bonjour,
Merci beaucoup pour ce tutoriel bien expliqué. J’ai plusieurs questions (je suis sous MacOS) :
– coté client : je n’ai aucun fichier .pid. Je n’ai d’ailleurs pas de répertoire stunnel dans /var/run/
– lorsque que j’essai de me connecter en ssh à [email protected] -p 51122 , la réponse est que la connexion est refusée. L’absence de fichier .pid en est la cause ?
Merci de votre retour !
Bonjour,
Merci pour ce tuto très clair.
J’ai une petite question concernant la configuration client.
Vous avez dit qu’il faut renseigner le certificat serveur en l’occurence server.pem dans notre cas, mais il se trouve que dans ce fichier contient la clé privé. As-t-on vraiment besoin d’avoir la clé privé associé ou le certificat uniquement suffit?
@ahmed si tu suit le tuto, normalement il devra se trouver dans » /etc/stunnel/ »
Tu n’as rien ?
ça me rassure, j’avais la même question. Son tutoriel me donne l’impression qu’il va donner au client sa clée privée dans le certificat.