- Modifié
Salut,
Ayant eu un peu de temps et souhaitant améliorer la sécurité de mon serveur, j'ai étudier et mis en pratique différentes approches que j'ai trouvé un peu partout sur le net.
Fort de ces lectures et de mes compétences, j'ai écrit un script qui rajoute une couche de sécurité à un serveur linux (basé sur debian).
Ce script travaille sur plusieurs points :
- Sécurisation de SSH ( Changement du port d'écoute, empêche root de ce connecter, n’autorise qu'un ou des utilisateurs prédéfinis et met en place une double-authentification par OTP.)
- Met en place un firewall basique (iptables ne filtrant que l'input).
- Met en place knockd.
- Met en place un honeypot ssh basique.
- Met en place fail2ban.
Si vous me suivez, vous aurez compris ici l'idée globale :
- Le serveur expose le minimum de ports (principe de base de la sécurité). tous les autres sont droppés.
- Le port ssh (22) est ouvert, mais conduit vers un container spécialement prévu faisant croire au hacker qu'il est sur le serveur alors qu'il est isolé dans un environnement prédéfini.
- Le "vrai" port ssh lui, est fermé par défaut et ne s'ouvre que si le serveur reconnais la séquence prédéfinie. Evidemment, elle ne s'ouvre que pour l'IP qui a donné la bonne séquence.
- Une fois ouvert, l'utilisateur doit fournir, en plus de son mot de passe, un code OTP géré par google authenticator et disponible par une application sur smartphone.
- Si l'utilisateur donne trois mots de passe erronés, son IP est bannie pour 1h.
J'ai choisi délibérément de ne pas passer par une clé ssh ( ouhouuuuuuuuuu le vilain ! ) car je trouve plus facile d'utilisation la méthode que j'ai choisie :
- Il est facile de se souvenir de la séquence du port-knocking.
- On a toujours son smartphone sur soit.
Les clés ssh elles, doivent être stockées en sécurité et ne sont pas forcément accessible à tout moment.
Alors certes, ce serait encore plus sécurisé avec des clés (Pour ceux qui y tiennent, on peut très facilement rajouter les clés à tout ce qui est déjà mis en place ici !), mais est-ce vraiment nécessaire ?
Un mot de passe + OTP est déjà qualifié d'authentification forte. Ici, je rajoute le pot de miel, le port caché, et le ban au bout de 3 essais erronés sur le vrai port.
A vous de voir, mais je pense que si vous mettez tout en place tel que je le dit et que vous vous faites quand même pirater, alors c'est que le gars en face n'est pas le premier script-kiddie venu et qu'il vous en voudra personnellement !
Libre à vous ensuite de creuser les sujets et de vous amuser comme vous voudrez.
Pour vous donner une idée de l'ambiance, voici le nombre de tentatives de connexions sur le port 22. Plus de 180k en tout juste 3 heures :
2500# docker logs ssh-honeypot_droberson | wc -l
181951
Mode d'emploi :
- Ouvrez DEUX terminaux sur votre serveur.
- Vérifier et adaptez les quelques variables en début de script.
- Exécutez le.
- Quand le script vous le demande, allez sur le second terminal et générez le code OTP avec l'utilisateur qui aura le droit de ce connecter avec la commande :
google-authenticator
- Flashez le QR Code et notez les codes de secours.
- Pour ceux qui ont la flemme de tout lire, séquence de réponses rapides : y / y / n / y
- Revenez sur le premier terminal et validez en tapant "yes" suivis de la touche "entrée".
- Ouvrez un 3ème terminal et tentez une connexion (pensez à installer knockd en remplaçant l'ip, le port et la séquence par les votre :
knock IP_DU_SERVEUR -v 7000 8000 9000 10000 11000 && ssh -p 42069 utilisateur@IP_DU_SERVEUR
- Il doit vous demander le code OTP. Rentrez le lui et... magie !
Une fois le processus validé, vous pouvez tout quitter sereinement
Avant de lancer un grand "GO, vous pouvez l'utiliser les yeux fermés !", j'aimerai avoir les retours de quelques personnes qui ont les moyens techniques et les connaissances nécessaires pour le tester.
Non pas que je ne suis pas sûr de moi, mais il peut toujours y avoir des cas particuliers à prendre en compte.
https://github.com/zerpex/scripts/blob/master/server/securize_new_server.sh
Notes techniques :
Actuellement, si le firewall ne bloque pas l'output, c'est à cause de docker. Je n'ai pas encore trouvé de façon totalement propre et transparente de le gérer en le désactivant dans docker.
Pour les connaisseurs, les commandes commentées dans la section iptables fonctionnent seulement dans un environnement simple où les containers sont "seuls". Dès qu'on a une architecture un peu plus compliquée avec des réseaux virtuels type backends/frontends, il faut rajouter des forwards à la main et ça ne me plait pas. Je cherche une solution qui gère ces cas de manière transparente... Oui, c'est un appel aux idéesLe container "ssh honeypot" rempli parfaitement son rôle, mais j'aimerai trouver un "vrai" honeypot. Un truc qui fasse croire à un hacker qu'il est vraiment sur le serveur quoi. Je n'ai pas eu le temps de chercher autant que je voudrai, mais je suis certain que ça existe. Alors avant d'écrire le mien, si quelqu'un a une piste, je prend
Commande simple pour vérifier si le container "ssh honeypot" a été compromis :
docker diff ssh-honeypot_droberson
Si cette commande vous affiche plus de 2 lignes, alors il y a eu compromission. Vous pouvez soit prendre le temps d'analyser tout ça, soit simplement détruire le container et le recréer :
sudo docker run -d -m 256m --cpus=".5" -p 22:22 --name ssh-honeypot_droberson txt3rob/docker-ssh-honey
Voili voilou.
z.