PiAlert V1 für Server-Sicherheit auf der Hut

Eines Tages hatte ich eine Idee. Diese Idee wurde im PiAlert-Projekt umgesetzt. Daraus können Sie herausfinden, was es istVideo. Kurz gesagt, PiAlert stellt sich als Gerät heraus, bei dem bei Versuchen, in Server einzudringen, farbige Lichter aufleuchten. Das System berechnet die Gesamtzahl solcher Ereignisse. Ich habe meistens versucht, eine Verbindung zu Port 22 (SSH) auf meinen Servern herzustellen. Normalerweise sind diese Ereignisse das Ergebnis von Bot-Aktivitäten. Tagsüber wurden auf einem meiner VPS, auf dem das übliche Anmeldesystem aktiviert war, 1.633 Einbruchsversuche aufgezeichnet. Auf einem anderen Server, der eine kennwortlose Anmeldung mit einem SSH-Schlüssel verwendete, wurden 9 Angriffe aufgezeichnet. Ein nicht autorisierter Versuch, sich beim WordPress-Projekt-Dashboard anzumelden, wurde einmal erkannt. Das oben genannte Video zeigt einen Test des Systems vor dessen Inbetriebnahme.



Und hier sind einige Aufnahmen.





PiAlert in Aktion





Gerät ausgeschaltet, Vorderansicht





Gerät deaktiviert, Seitenansicht



Ich muss sagen, dass das, was ich bekommen habe, bestenfalls als Alpha-Version des Geräts bezeichnet werden kann. Ich teilte dasProjekt Code und Modell für 3D-Druck des Falles in der Öffentlichkeitin der Hoffnungdasswenn jemand in meinem Projekt interessiert ist, werden sie mich für das Gemeinwohl verbessern helfen.



Projektübersicht



Nach einem kürzlichen Vorfall mit einem meiner Server wurde mir klar, dass ich wirklich gerne in den Protokollen stöbere und herausfinde, was passiert ist. Normalerweise benutze ich die folgenden Befehle:



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


Es ist interessant zu sehen, auf welche Seiten die Bots aus dem Nichts zugreifen möchten oder auf welche Konten sie sich über SSH anmelden möchten. Es sieht auch aus wie Hackerfilme. Dann dachte ich, ich könnte etwas schaffen, das viel attraktiver aussieht als ein Terminalfenster. In diesem Moment wurde das Projekt geboren, über das ich hier spreche.



Die Ergebnisse der Überwachung von Anmeldeversuchen haben sich kürzlich geändert. Dies geschah, nachdem ich ein strengeres Anmeldeverfahren implementiert hatte. Die Anzahl der Anmeldeversuche beim System ist nämlich dramatisch gesunken. Dies wurde deutlich, nachdem das von mir erstellte Serverüberwachungssystem 24 Stunden lang lief. Im Folgenden werde ich darüber sprechen.



Dieses Material ist in drei Abschnitte unterteilt. Bei der ersten geht es um Hardware, bei der zweiten um das Einrichten von Servern und bei der dritten um Programme für den Raspberry Pi.



Hardware



Mein Gerät besteht aus folgenden Komponenten:





Hier ist der Anschlussplan.





Diagramm zum Anschließen von Komponenten an die Platine



Zum Anschließen des Blinkt-LED-Panels an den Raspberry Pi! Es wurden DuPont- Verbindungsdrähte verwendet. Einerseits habe ich sie geschnitten und an die entsprechenden Stifte des 40-poligen GPIO-Anschlusses des Panels gelötet. Ich konnte es nicht direkt an die Platine anschließen, da ich immer noch ein Display daran anschließen musste.



Ich habe lange gebraucht, um das Panel zum Laufen zu bringen. Zuerst dachte ich, dass meine Instanz unter schlechten Verbindungen im Connector leidet. Und um das herauszufinden, musste ich Versuch und Irrtum durchlaufen und viel mehr Zeit damit verbringen, als ich gerne dafür ausgeben würde. Nachdem ich Pimoroni über Twitter erreicht hatteEs stellte sich heraus, dass frühe Versionen von Blinkt! Verwenden Sie Pin 2 für 5 V, nicht Pin 4, wie auf Pinout.xyz gezeigt . Ich habe jedoch, bis ich es herausgefunden habe, in Eile ein weiteres Blinkt! LED-Panel bestellt, falls meins nicht funktioniert. Und jetzt, nachdem ich es geschafft habe, das erste zu starten, muss ich über ein neues Projekt nachdenken, in dem ich das zweite verwenden könnte.



Ich habe all diese Komponenten in einen Koffer gelegt, den ich in Tinkercad entworfen habe... Der Körper wurde auf meinem Ender 3 Pro 3D-Drucker gedruckt. Ich bekam den Koffer, konnte mir aber immer noch nicht vorstellen, wie ich seine Teile so herstellen sollte, dass sie entweder fest ineinander passen oder mit Riegeln aneinander befestigt werden. Als Ergebnis bildete ich ein Paar Pfosten an einem der Körperteile, die für M5-Schrauben ausgelegt waren und mit denen ich das fertige Gerät zusammenbaute. Diese Pfosten sind an den Rändern platziert, sodass im Gehäuse genügend Platz für den Raspberry Pi ist.



Zum Bedrucken des Gehäuses habe ich PLA-Kunststoff eines unbekannten Herstellers verwendet (Drucktemperatur - 217 ° C, Füllrate - 10%). Ich habe die üblichen Einstellungen angewendet, die nach dem Ansehen verschiedener Videos auf YouTube übernommen wurden .





Ergebnisse mehrerer Versuche, einen Korpus zu drucken





Karosseriebaugruppe



Ich habe es erst bei meinem neunten Versuch geschafft, eine anständig aussehende Frontplatte zu erstellen. Jedes Mal, wenn ich es druckte, stellte sich heraus, dass etwas leicht bewegt werden musste oder dass irgendwo, wenn auch ein wenig, etwas korrigiert werden musste. Ich habe Tinkercad beim Bearbeiten des Modells nur ein paar Mal verwendet und musste fast von Anfang an daran arbeiten. Ich wollte die Blinkt LED-Leiste reparieren! mit Druckknöpfen, aber nach ein paar erfolglosen Versuchen gab diese Idee auf und löste das Problem mit einer Klebepistole (ich liebe dieses Ding!). Infolgedessen habe ich sowohl das Display als auch das Raspberry Pi-Board damit repariert. Als ich die Arbeit an dem Fall beendet hatte, löste ich das Problem, das Board darin zu platzieren. Anfangs habe ich das Board in keiner Weise in dem Gehäuse repariert, aber aus diesem Grund wurde das Anschließen des USB-Kabels zu einem echten Abenteuer.In der endgültigen Version des Gehäuses (wenn wir überhaupt sagen können, dass einige seiner Versionen „endgültig“ sein werden) möchte ich die Schrauben, die Löcher für sie und die Pfosten im Gehäuse entfernen und einen Weg finden, die Teile des Gehäuses beispielsweise mit zu verbinden mit Riegeln. Wenn jemand an der Arbeit am Korpus teilnehmen und alles daran ändern möchte, sind Sie herzlich willkommen! Und ich möchte auch die Frontplatte des Gehäuses mit etwas wie durchscheinendem Glas oder einem Stück Acryl verschließen. Dies würde dem Gerät ein fertiges Aussehen verleihen und zu "technische" Details verbergen.Wenn jemand an der Arbeit am Korpus teilnehmen und alles daran ändern möchte, sind Sie herzlich willkommen! Und ich möchte auch die Frontplatte des Gehäuses mit etwas wie durchscheinendem Glas oder einem Stück Acryl verschließen. Dies würde dem Gerät ein fertiges Aussehen verleihen und zu "technische" Details verbergen.Wenn jemand an der Arbeit am Korpus teilnehmen und alles daran ändern möchte, sind Sie herzlich willkommen! Und ich möchte auch die Frontplatte des Gehäuses mit etwas wie durchscheinendem Glas oder einem Stück Acryl abdecken. Dies würde dem Gerät ein fertiges Aussehen verleihen und zu "technische" Details verbergen.



Die Raspberry Pi-Karte, auf der dieses Projekt basiert, wurde bereits in einem anderen Projekt verwendet, bei dem ein 40-poliger GPIO-Anschluss auf der Rückseite der Karte angebracht werden musste. Es stellte sich als Plus heraus. Das Board ist fest in dem Fall fixiert, in anderen Projekten werde ich es wahrscheinlich nicht verwenden. Deshalb habe ich einige der Stifte gebogen, um alles besser im Gehäuse zu platzieren.





Alles passt!



Am Ende hatte ich eine andere Idee, nämlich dass ich das Gerät mit mindestens ein paar Tasten ausstatten sollte. Vielleicht bringen Sie sie nicht einmal heraus, sondern verstecken sie einfach irgendwo im Koffer. Man muss zwischen verschiedenen Arten von festen Angriffen wechseln und deren Anzahl anzeigen. Und die zweite sollte mit einem kurzen Druck das Display ausschalten und mit einem langen Druck den Raspberry Pi vorsichtig herunterfahren. Bei Bedarf kann ich jederzeit über SSH eine Verbindung zu meinem Gerät herstellen. Wenn ich es wirklich benötige, kann ich eine URL-Route erstellen, die den Befehl aufruftsudo halt.



Serverkonfiguration



Als ich nach dem oben genannten Vorfall den Schutz der Server verstärkte und die Überwachung einrichtete , überprüfte ich, ob das Programm fail2ban auf ihnen installiert war . Das ist wunderbar FOSS-Projekt. Fail2ban überwacht die Protokolle auf dem Server und zeichnet Informationen zu etwas auf, das unter normalen Bedingungen nicht passieren sollte, z. B. mehrere erfolglose Versuche, sich über SSH beim Server anzumelden. Als nächstes verbietet das Programm die IP-Adresse, von der verdächtige Anforderungen stammen, und zwar in dem Fall, dass es sich um ein potenziell schwerwiegendes Problem handelt oder wenn sich einige Ereignisse innerhalb eines festgelegten Zeitraums wiederholen. Standardmäßig überwacht fail2ban den SSH-Verkehr, aber das Programm kann so konfiguriert werden, dass es etwas anderes im Auge behält, z. B. die Anzahl der 404-Fehler oder die Anzahl der erfolglosen Versuche, sich im Admin-Bereich eines WordPress- Projekts anzumelden .



Mit Fail2ban können Sie eigene Aktionen erstellen, die aufgerufen werden, wenn verschiedene Ereignisse auftreten. Es stellte sich heraus, dass es komplizierter war als eine einfache Curl-Anfrage, und so wandte ich mich an GitHub, um Hilfe zu erhalten. Egal was ich tat, ich konnte das System nicht so zum Laufen bringen, wie es sollte. Um Ihnen die Lösung eines ähnlichen Problems zu erleichtern, werde ich Ihnen erzählen, wie ich es am Ende geschafft habe, alles einzurichten. Wir sprechen nämlich über die Verwendung von fail2ban auf einem Debian-basierten Server.



Lassen Sie uns eine Datei erstellen jail.localund Folgendes hinzufügen:



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


Hier müssen SCRIPTHOSTSERVERSie es durch eine geeignete URL ersetzen (zum Beispiel - on dev.testing:8080). Beachten Sie, dass am Anfang dieser URL keine Protokollinformationen, am Ende kein Pfad und die Adresse nicht mit einem Schrägstrich enden dürfen.



Infolgedessen stellt sich heraus, dass wir die üblichen Aktionen im Zusammenhang mit SSHD haben werden. Das Programm wird weiterhin verdächtige IP-Adressen verbieten, aber wir können auch zusätzliche Aktionen erstellen. Leider können Sie den Befehl, der hier ausgeführt wird, nicht einfach beschreiben (dies war mein Problem). Stattdessen müssen Sie dem System genau mitteilen, welche Maßnahmen zu ergreifen sind. Die Aktion wird aus einer in einem Ordner gespeicherten Datei aufgerufen action.d. Die Namen der .conf-Dateien in diesem Ordner entsprechen den Namen der Aktionen (in unserem Fall dies pinotifyred.conf). So sehen diese Dateien aus:



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

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

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


Auch hier müssen Sie SCRIPTHOSTSERVERzu einer geeigneten URL (Art dev.testing:8080) wechseln und dabei dieselben Regeln einhalten, die oben in der Dateibeschreibung erläutert wurden jail.local.



Der Code ruft die Aktion auf und ändert die Variable my-host. Ohne eine solche Variable könnte ich nicht alles zum Laufen bringen.



Dieser Code führt den erforderlichen Befehl aus. Es deklariert einige Variablen, die erforderlich sind, damit fail2ban funktioniert. Darüber hinaus bedeutet die Art und Weise, wie dies konfiguriert ist, dass wir Curl- oder Wget-Anforderungen mit unterschiedlichen Parametern senden können. Unter diesen Parametern kann es beispielsweise Informationen darüber geben, welche IP gesperrt wurde und wann genau dies geschehen ist. Wenn Sie detailliertere Informationen über Angriffe erhalten möchten, als wie in meinem Fall nur Daten zu deren Anzahl, können Sie diese verwenden. Dazu können Sie nämlich eine action.dDatei mit folgendem Inhalt in den Ordner legen :



[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


Ich möchte darauf hinweisen, dass es hier wahrscheinlich einen Fehler gibt, da die Aktion zweimal aufgerufen wird - wenn die IP blockiert ist und wenn sie nicht blockiert ist. Ich habe vor, dies später in Angriff zu nehmen. Vielleicht führt dies zu einer Verdoppelung der Anzahl der Angriffe.



Himbeer-Pi-Software



Um ehrlich zu sein, ist mein Code ein komplettes Durcheinander. Es wurde in Python 3 von einer Person (mir) geschrieben, die Python nicht kennt, aber im Internet nach Antworten auf Fragen suchen kann. Zusammen mit allgemeinen Programmierkenntnissen konnte ich ein Programm in Python schreiben.



Ich werde hier nicht über die Vorbereitung des Raspberry Pi für die SSH-Arbeit sprechen, da viele Leute bereits darüber gesprochen haben . Der betreffende Code wird auf GitHub gehostet . Es wird durch einige Dateien dargestellt. Die erste Datei ist diese pialert.py, sie beginnt beim Systemstart. Die zweite Datei tm1637.pyist eine Bibliothek, die ich aus diesem Material von der RaspberryTips- Site entnommen habe .



Mein Python-Programm fungiert als HTTP-Server (ich weiß, es ist nicht für die Produktion gedacht, aber es ist immer noch ein einfaches Heimprojekt) und wartet auf alle Anforderungen. Dies ist ein Single-Thread-Programm. Wenn also viele Anforderungen vorliegen, schlägt es höchstwahrscheinlich fehl. Das Programm wartet auf das Eintreffen der URL und führt die Aktion aus, wenn es bei ihr registriert ist. Die Aktion besteht darin, die LED auf Blinkt! Im Larson-Scanner- Stil einzuschalten und den Zähler zu erhöhen. Die Wahl der LED-Farbe hängt von der URL ab.



Ich benutze 4 Farben:



  1. Blau - Zeigt an, dass ein Angriff auf meine WordPress-Site ausgeführt wurde .
  2. Rot - SSH-Angriff auf Server A.
  3. Lila - SSH-Angriff auf Server B.
  4. Grün - URL-Angriff auf Server C.


Vielleicht werde ich im Laufe der Zeit die Anzahl der vom Gerät aufgezeichneten Angriffe erweitern. Aber selbst das, was jetzt ist, ermöglicht es Ihnen, über Ereignisse auf dem Laufenden zu bleiben, ohne eine Verbindung zu den Servern herzustellen.



In meinem Code werden Fehler nicht behandelt und mögliche Zählerüberläufe werden nicht überwacht. Das Programm zeigt mir unter anderem, dass sogar mein Heimnetzwerk ständig in Form von Anfragen nach speziellen URLs angegriffen wird. Die Angreifer versuchen, über eine entdeckte Sicherheitslücke auf das Netzwerk zuzugreifen (dies löst Ausnahmen aus, das Programm wird jedoch nicht gestoppt).



Eine der letzten Aufgaben, die ich während der Arbeit am Projekt lösen musste, war das Einrichten des Raspberry Pi. Ich brauchte nämlich das Board, um das Skript sofort nach dem Laden zu starten, und dann funktioniert einfach alles. Dieses Problem wird durch Bearbeiten der Datei /etc/rc.local gelöst . Ich habe den vi-Editor verwendet, um der Datei einen Befehl hinzuzufügen, der normalerweise zum Starten von Programmen verwendet wird:



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


Danach gab es nur noch ein Problem, das ich lösen musste. Es sollte meinem VPS einen ununterbrochenen Zugriff auf den Raspberry Pi ermöglichen, der sich im Heimnetzwerk hinter einer Firewall befand und eine dynamische IP-Adresse hatte. Ich könnte Dynamic DNS oder einen der unzähligen Dienste da draußen verwenden. Aber jemand aus der selfhosted Reddit Gemeinschaft einen kostenlosen Service erstellt freemyip.com, was genau das Problem löst, das ich lösen musste. Und er löst es gut. Der Service ist noch nicht sehr beliebt, und ich bin sicher, dass er aufgrund seiner kostenlosen Kosten nicht lange so bleiben wird, wie er ist. Aber wenn man bedenkt, wie einfach es ist, damit zu arbeiten, würde ich gerne dafür bezahlen. Ich habe in derselben Community einen weiteren interessanten Dienst gefunden, Sliceport.com . Ich werde es auch eines Tages versuchen.



Ergebnis





Die



PiAlert-Demonstration ist ein Gerät, das nicht mit den coolsten Hacking-Dingen aus den Filmen verglichen werden kann. Ihr Zweck ist es, Sie daran zu erinnern, dass jeden Tag Tausende von Bots versuchen, auf etwas zuzugreifen, auf das sie keinen Zugriff haben sollten. Das Gerät, das ich erstellt habe, überträgt einfach Informationen über solche Versuche in die reale Welt und erinnert uns daran. Es kam auch ziemlich süß heraus.



Welche anderen guten Dinge kann ich über PiAlert sagen? Das Gerät sieht neutral aus und ist sehr flexibel. Wenn ich beschließe, dass ich es nicht mehr brauche, kann ich den Code umschreiben und in eine Uhr verwandeln. Oder ich kann daraus einen Zähler für Besuche auf den Seiten meiner Website machen. Tatsächlich gibt es unzählige Optionen für die Verwendung von RGB-LEDs und einer 4-stelligen Anzeige. Außerdem erwies sich mein Gerät als kompakt. Es steht vor mir auf dem Tisch, wenn ich Code schreibe, und erinnert mich daran, dass es Menschen auf der Welt gibt, die schlechte Dinge tun. Der PiAlert benötigt zum Betrieb nur sehr wenig Strom, sodass er mit Batterien betrieben werden kann. Es kann überall im Haus platziert werden, solange es eine Verbindung zu einem WiFi-Netzwerk herstellen kann. Dort wird es einfach seinen Job machen.Und wenn ich ein anderes Netzwerk benötige, reicht es aus, über SSH eine Verbindung zum Raspberry Pi herzustellen oder eine neue Datei zu erstellenwpa_supplicant.confin /boot.



Aus diesem Grund möchte ich darauf hinweisen, dass mein Code natürlich nicht sehr gut aussieht. Es kann und sollte überarbeitet werden. Wenn ich jemals Python lerne, mache ich es genau dort. Der Körper kann auch verbessert werden, und wenn ich wieder eine Art 3D-Modellierungsprogramm beherrsche, werde ich am Körper arbeiten. Aber wenn Sie dies nicht berücksichtigen, kann ich sagen, dass ich mit dem, was ich getan habe, zufrieden bin.



Planen Sie ein PiAlert-ähnliches Gerät?



All Articles