PiAlert V1 en garde pour la sécurité des serveurs

Un jour, j'ai eu une idée. Cette idée a été incarnée dans le projet PiAlert. Vous pouvez savoir ce qu'il est de cettevidéo. En un mot, PiAlert s'avère être un appareil sur lequel, s'il y a des tentatives d'intrusion sur les serveurs, des lumières colorées s'allument. Le système calcule le nombre total de ces événements. J'ai surtout regardé essayer de me connecter au port 22 (SSH) sur mes serveurs. Habituellement, ces événements sont le résultat de l'activité du bot. Au cours de la journée, sur l'un de mes VPS, où le système de connexion habituel était activé, 1633 tentatives d'intrusion ont été enregistrées. Sur un autre serveur, où une connexion sans mot de passe a été utilisée, à l'aide d'une clé SSH, 9 attaques ont été enregistrées. Une tentative non autorisée de connexion au tableau de bord du projet WordPress a été détectée une fois. La vidéo ci-dessus montre un test du système avant sa mise en service.



Et voici quelques clichés.





PiAlert en action





Appareil éteint, vue de face





Appareil désactivé, vue de côté



Je dois dire que ce que j'ai, au mieux, peut être appelé une version alpha de l'appareil. J'ai partagé le code duprojet et le modèle pour l'impression 3D du boîtier dans le domaine public dans l'espoir que si quelqu'un s'intéresse à mon projet, il m'aidera à l'améliorer pour le bien commun.



Aperçu du projet



Après un incident récent avec l'un de mes serveurs, j'ai réalisé que j'aime vraiment fouiller dans les journaux et comprendre ce qui s'est passé. J'utilise généralement les commandes suivantes:



tail -n 80 -f /var/log/apache2/error.log
tail -n 80 -f /var/log/apache2/access.log
tail -n 80 -f /var/log/auth.log


Il est intéressant de voir à quelles pages les robots essaient d'accéder de nulle part, ou à quels comptes ils essaient de se connecter via SSH. Cela ressemble également à des films de hackers. Ensuite, j'ai pensé que je pourrais créer quelque chose qui semble beaucoup plus attrayant qu'une fenêtre de terminal. A ce moment, le projet est né, dont je parle ici.



Les résultats de la surveillance des tentatives de connexion ont changé récemment. Cela s'est produit après avoir mis en œuvre une procédure de connexion plus stricte. À savoir, le nombre de tentatives de connexion au système a considérablement diminué. Cela est devenu évident après que le système de surveillance du serveur que j'ai créé a fonctionné pendant 24 heures. Ci-dessous, je vais en parler.



Ce matériel est divisé en trois sections. Le premier concerne le matériel, le second la configuration des serveurs et le troisième les programmes pour le Raspberry Pi.



Matériel



Mon appareil est assemblé à partir des composants suivants:





Voici le schéma de connexion.





Schéma de connexion des composants à la carte



Pour connecter le panneau LED Blinkt au Raspberry Pi! Des fils de connexion DuPont ont été utilisés. D'une part, je les ai découpés et soudés aux broches correspondantes du port GPIO 40 broches du panneau. Je ne pouvais pas le connecter directement à la carte, car je devais encore y connecter un écran.



Il m'a fallu beaucoup de temps pour faire fonctionner le panneau. Au début, je pensais que mon instance souffrait de mauvaises connexions dans le connecteur. Et pour comprendre cela, j'ai dû passer par essais et erreurs, passer beaucoup plus de temps que je ne voudrais y consacrer. Après avoir contacté Pimoroni via Twitter, il s'est avéré que les premières versions de Blinkt! utilisez la broche n ° 2 pour 5V, pas la broche n ° 4 comme indiqué sur pinout.xyz . Cependant, jusqu'à ce que j'aie compris, j'ai commandé à la hâte un autre panneau LED Blinkt! Au cas où le mien ne fonctionnerait pas. Et maintenant, après avoir réussi à lancer le premier, j'ai besoin de réfléchir à un nouveau projet dans lequel je pourrais utiliser le second.



J'ai placé tous ces composants dans un boîtier que j'ai conçu dans Tinkercad... Le corps a été imprimé sur mon imprimante 3D Ender 3 Pro. J'ai eu l'étui, mais je ne pouvais toujours pas penser à comment fabriquer ses pièces de manière à ce qu'elles s'emboîtent étroitement les unes dans les autres ou soient fixées les unes aux autres avec des loquets. En conséquence, j'ai formé quelques poteaux sur l'une des parties du corps, conçus pour les vis M5, que j'ai utilisées pour assembler l'appareil fini. Ces poteaux sont placés le long des bords afin qu'il y ait suffisamment de place dans le boîtier pour le Raspberry Pi.



Pour imprimer le boîtier, j'ai utilisé du PLA d'un fabricant inconnu (température d'impression - 217 ° C, taux de remplissage - 10%). J'ai appliqué les paramètres habituels après avoir regardé diverses vidéos sur YouTube .





Résultats de plusieurs tentatives d'impression d'un corpus





Assemblage du boîtier



Je n'ai réussi à créer un panneau avant décent que lors de mon neuvième essai. Chaque fois que je l'ai tapé, il s'est avéré que quelque chose devait être légèrement déplacé, ou que quelque part, bien qu'un peu, quelque chose devait être corrigé. Je n'ai utilisé Tinkercad que quelques fois lors de l'édition du modèle, et j'ai dû commencer à travailler dessus presque depuis le début. Je voulais réparer la barre LED Blinkt! en utilisant des snaps, mais après quelques tentatives infructueuses, j'ai abandonné cette idée et résolu le problème avec un pistolet à colle (j'adore cette chose!). En conséquence, j'ai réparé à la fois l'écran et la carte Raspberry Pi avec. Finissant le travail sur le cas, je résolvais le problème de placer la planche dedans. Au début, je n'ai pas du tout réparé la carte dans le boîtier, mais à cause de cela, y connecter un câble USB s'est transformé en une véritable aventure.Dans la version finale du boîtier (si nous pouvons dire que certaines de ses versions seront «définitives»), je voudrais me débarrasser des vis, des trous pour elles et des poteaux à l'intérieur du boîtier, et trouver un moyen de connecter les parties du boîtier, par exemple, avec à l'aide de loquets. Si quelqu'un veut participer au travail sur le corpus et tout changer, vous êtes les bienvenus! Et je veux aussi fermer le panneau avant du boîtier avec quelque chose comme du verre translucide ou un morceau d'acrylique. Cela donnerait à l'appareil un aspect fini, cachant des détails trop «techniques».Si quelqu'un veut participer au travail sur le corpus et tout changer, vous êtes les bienvenus! Et je veux aussi fermer le panneau avant du boîtier avec quelque chose comme du verre translucide ou un morceau d'acrylique. Cela donnerait à l'appareil un aspect fini, cachant des détails trop «techniques».Si quelqu'un veut participer au travail sur le corpus et tout changer, vous êtes les bienvenus! Et je veux aussi fermer le panneau avant du boîtier avec quelque chose comme du verre translucide ou un morceau d'acrylique. Cela donnerait à l'appareil un aspect fini, cachant des détails trop «techniques».



La carte Raspberry Pi sur laquelle ce projet est basé a déjà été utilisée dans un autre projet qui nécessitait un port GPIO à 40 broches à monter à l'arrière de la carte. Cela s'est avéré être un plus. La carte est fermement fixée dans le boîtier, je ne l'utiliserai probablement pas dans d'autres projets. Par conséquent, j'ai plié certaines des broches afin de mieux placer tout dans le boîtier.





Tout va bien!



En fin de compte, j'ai eu une autre idée, c'est que je devrais équiper l'appareil d'au moins quelques boutons. Peut-être même pas les faire sortir, mais simplement les cacher quelque part dans l'étui. Il en faut un pour basculer entre différents types d'attaques fixes et pour afficher leur nombre. Et le second devrait, avec une courte pression, éteindre l'écran, et avec un appui long, arrêter doucement le Raspberry Pi. Si j'en ai besoin, je peux toujours me connecter à mon appareil via SSH, et si j'en ai vraiment besoin, je peux créer une route URL qui appelle la commandesudo halt.



Configuration du serveur



Lorsque, après l'incident susmentionné, je renforçais la protection des serveurs et mettais en place une surveillance, j'ai vérifié que le programme fail2ban serait installé sur eux . C'est merveilleux FOSS-projet. Fail2ban surveille les journaux sur le serveur et enregistre des informations sur quelque chose qui, dans des conditions normales, ne devrait pas se produire, comme plusieurs tentatives de connexion SSH ayant échoué. Ensuite, le programme interdit l'adresse IP à partir de laquelle les demandes suspectes proviennent, ce faisant dans le cas où il s'agit d'un problème potentiellement sérieux, ou si certains événements se répètent dans une période de temps prédéterminée. Par défaut, fail2ban surveille le trafic SSH, mais le programme peut être configuré pour garder un œil sur autre chose, comme le nombre d'erreurs 404 ou le nombre de tentatives infructueuses de connexion au panneau d'administration d'un projet WordPress .



Fail2ban vous permet de créer vos propres actions qui sont appelées lorsque divers événements se produisent. Cela s'est avéré plus compliqué que de faire quelque chose comme une simple demande de curl, alors j'ai fini par me tourner vers GitHub pour obtenir de l'aide. Peu importe ce que j'ai fait, je ne pouvais pas faire fonctionner le système comme il se doit. Afin de vous permettre de résoudre plus facilement un problème similaire, je vais vous expliquer comment j'ai finalement réussi à tout mettre en place. À savoir, nous parlons d'utiliser fail2ban sur un serveur basé sur Debian.



Créons un fichier jail.localet ajoutons-y les éléments suivants:



[sshd]
enabled = true
port = ssh
banaction = pinotifyred[myhost="SCRIPTHOSTSERVER"]


Ici, SCRIPTHOSTSERVERvous devez le remplacer par une URL appropriée (par exemple - sur dev.testing:8080). Notez qu'il n'y a aucune information de protocole au début de cette URL, il n'y a pas de chemin à la fin et l'adresse ne doit pas se terminer par une barre oblique.



En conséquence, il s'avère que nous aurons les actions habituelles liées au SSHD, le programme continuera à interdire les adresses IP suspectes, mais nous pourrons également créer des actions supplémentaires. Malheureusement, vous ne pouvez pas simplement décrire la commande qui sera exécutée ici (c'était mon problème). Au lieu de cela, vous devez indiquer exactement au système les mesures à prendre. L'action est appelée à partir d'un fichier stocké dans un dossier action.d. Les noms des fichiers .conf dans ce dossier correspondent aux noms des actions (dans notre cas, ceci pinotifyred.conf). Voici à quoi ressemblent ces fichiers:



[Definition]
#  get-  "http://example.com/red"

actionban = curl --fail "http://<my-host>/red" >> /dev/null

[Init]
#     jail-    :
my-host = SCRIPTHOSTSERVER


Ici encore, vous devez passer SCRIPTHOSTSERVERà une URL appropriée (en quelque sorte dev.testing:8080), en respectant les mêmes règles que celles décrites ci-dessus dans la description du fichier jail.local.



Le code appelle l'action et change la variable my-host. Je ne pourrais pas tout faire fonctionner sans une telle variable.



Ce code exécute la commande requise. Il déclare certaines variables nécessaires au fonctionnement de fail2ban. De plus, la façon dont cela est configuré signifie que nous avons la possibilité d'envoyer des requêtes curl ou wget avec différents paramètres. Parmi ces paramètres, par exemple, il peut y avoir des informations sur la propriété intellectuelle interdite et à quel moment exactement cela s'est produit. Par conséquent, si vous souhaitez recevoir des informations plus détaillées sur les attaques que, comme dans mon cas, uniquement des données sur leur nombre, vous pouvez les utiliser. À savoir, pour ce faire, vous pouvez placer un action.dfichier avec le contenu suivant dans le dossier :



[Definition]
# get-  "http://example.com/ban.php?jail=sshd&ip=192.0.2.100":

actionban = curl -G --data-urlencode "jail=%(name)s" --data-urlencode "ip=" --fail "http://<my-host>/ban.php"

[Init]
#     jail-    :
my-host = SCRIPTHOSTSERVER


Je tiens à souligner qu'il y a probablement un bogue ici, puisque l'action est appelée deux fois - lorsque l'IP est bloquée et lorsqu'elle est débloquée. J'ai l'intention de m'attaquer à cela plus tard, cela conduira peut-être à un doublement du nombre d'attaques.



Logiciel Raspberry Pi



Pour être honnête, mon code est un désordre complet. Il a été écrit en Python 3 par une personne (moi) qui ne connaît pas Python, mais qui est capable de rechercher des réponses à des questions sur Internet. Ceci, couplé à des connaissances générales en programmation, m'a permis d'écrire un programme en Python.



Je ne parlerai pas ici de la préparation du Raspberry Pi pour le travail SSH, car de nombreuses personnes en ont déjà parlé . Le code en question est hébergé sur GitHub . Il est représenté par quelques fichiers. Le premier fichier est celui pialert.py-ci, il démarre au démarrage du système. Le deuxième fichier tm1637.pyest une bibliothèque que j'ai tirée de ce matériel sur le site RaspberryTips .



Mon programme Python agit comme un serveur HTTP (je sais que ce n'est pas pour la production, mais c'est toujours un simple projet domestique) à l'écoute de toutes les demandes. Il s'agit d'un programme à thread unique, donc s'il y a beaucoup de demandes, il échouera probablement. Le programme attend que l'URL arrive, et s'il est enregistré avec elle, il exécute l'action. L'action consiste à allumer la LED sur Blinkt!, Dans le style Larson Scanner , et d'augmenter le compteur. Le choix de la couleur de la LED dépend de l'URL.



J'utilise 4 couleurs:



  1. Bleu - Indique qu'une attaque a été effectuée sur mon site WordPress .
  2. Rouge - Attaque SSH sur le serveur A.
  3. Violet - Attaque SSH sur le serveur B.
  4. Vert - attaque d'URL sur le serveur C.


Peut-être qu'avec le temps, j'élargirai l'ensemble des attaques enregistrées par l'appareil. Mais même ce qui est maintenant vous permet de vous tenir au courant des événements sans vous connecter aux serveurs.



Dans mon code, les erreurs ne sont pas gérées et les éventuels dépassements de compteur ne sont pas surveillés. Le programme, entre autres, me montre que même mon réseau domestique est constamment attaqué sous la forme de demandes d'URL spéciales. Les attaquants essaient d'accéder au réseau via toute vulnérabilité qu'ils découvrent (cela lève des exceptions, mais cela n'arrête pas le programme).



L'une des dernières tâches que j'ai dû résoudre en travaillant sur le projet était de configurer le Raspberry Pi. À savoir, j'avais besoin du tableau pour lancer le script immédiatement après le chargement, et ensuite tout fonctionnerait. Ce problème est résolu en éditant le fichier /etc/rc.local. J'ai utilisé l'éditeur vi pour ajouter une commande au fichier qui est généralement utilisé pour démarrer des programmes:



python3 /home/pi/PiAlert/pialert.py &


Après cela, je n'avais plus qu'une tâche à résoudre. Il s'agissait de fournir un accès ininterrompu pour mon VPS au Raspberry Pi, qui se trouvait sur le réseau domestique, derrière un pare-feu et avait une adresse IP dynamique. Je pourrais utiliser Dynamic DNS ou l'un des innombrables services disponibles. Cependant, quelqu'un de la communauté Reddit auto - hébergée a créé un service gratuit freemyip.com, qui résout exactement le problème que je devais résoudre. Et il le résout bien. Le service n'est pas encore très populaire et je suis sûr qu'il ne le restera pas longtemps en raison de son coût gratuit. Mais étant donné la facilité de travailler avec, je paierais volontiers pour cela. J'ai trouvé un autre service intéressant dans la même communauté, sliceport.com . J'essaierai aussi un jour.



Résultat





La



démonstration PiAlert est un appareil qui ne peut être comparé à certains des trucs de piratage les plus cool des films. Son but est de vous rappeler que chaque jour, des milliers de robots tentent d'accéder à quelque chose auquel ils ne devraient pas avoir accès. L'appareil que j'ai créé transfère simplement des informations sur de telles tentatives dans le monde réel, nous les rappelant. Il est également sorti assez mignon.



Quelles autres bonnes choses puis-je dire à propos de PiAlert? L'appareil a l'air neutre et est très flexible. Si je décide que je n'en ai plus besoin tel quel, je peux réécrire le code et le transformer en horloge. Ou je peux en faire un compteur de visites sur les pages de mon site. En fait, il existe des tonnes d'options pour utiliser des LED RVB et un affichage à 4 chiffres. De plus, l'appareil s'est avéré compact. Il se tient devant moi sur mon bureau lorsque j'écris du code et me rappelle qu'il y a des gens dans le monde qui font de mauvaises choses. Le PiAlert nécessite très peu d'énergie pour fonctionner, il peut donc fonctionner sur piles. Il peut être placé n'importe où dans la maison tant qu'il peut se connecter à un réseau WiFi. Là, il fera simplement son travail.Et si j'ai besoin d'un autre réseau, il suffira de me connecter au Raspberry Pi via SSH ou de créer un nouveau fichierwpa_supplicant.confdans /boot.



En conséquence, je tiens à noter que mon code, bien sûr, ne semble pas très bon. Il peut et doit être remanié. Si jamais j'apprends Python, je le ferai ici. Le cas peut également être amélioré et moi, encore une fois, si je maîtrise une sorte de programme de modélisation 3D, je travaillerai sur le cas. Mais, si vous ne tenez pas compte de cela, je peux dire que je suis content de ce que j'ai fait.



Envisagez-vous de créer un appareil de type PiAlert?



All Articles