In English——På svenska——En español——En français
Wichtiger Hinweis: Leider verfälschen die Google-Übersetzungen die Quellcodes. Bitte öffnet den Quellcode in einem anderen Fenster, wie es das nachstehende Bild zeigt. Von dort lassen sich die Quellcodes auch leichter herauskopieren:
2. März 2023 (aktualisiert am 4. März 2023)
APIBAN ist ein kostenloser Dienst, der nicht nur für Asterisk-SIP-Server laufend aktualisierte Blacklists böswilliger IP-Adressen zur Verfügung stellt, die automatisch in regelmäßigen Abständen in Iptables eingetragen werden. Dies bewerkstelligt ein kleines Skript. Damit die Blacklist in Iptables nicht zu groß wird, lässt sich die maximale Anzahl der Einträge (Regeln) begrenzen. Ältere Einträge werden automatisch aus Iptables entfernt. Man muss sich um die Pflege der Blacklists im Idealfall nicht mehr kümmern. APIBAN kann Fail2Ban nicht gänzlich ersetzen, weshalb ich Fail2Ban weiterhin im Einsatz habe. Doppelt genäht hält besser.
APIBAN ist unter https://www.apiban.org/ vorgestellt. Um APIBAN nutzen zu können, müssen wir uns auf https://www.apiban.org/getkey.html einen kostenlosen Zugangsschlüssel besorgen, der uns per E-Mail zugeschickt wird. Mehr über APIBAN erfahren wir auf https://www.apiban.org/doc.html. Ganz unten auf dieser Seite wird für die Betreiber von Servern ein Bash Client https://github.com/palner/apiban/tree/master/clients/bash und ein Go Client vorgestellt. Den Go Client https://github.com/palner/apiban/tree/master/clients/go habe ich auf meinem Raspberry Pi mit Raspbian Buster leider nicht zum Laufen gebraucht. Deshalb gehe ich hier nur auf den Bash Client ein, den ich mit ein paar Modifikation zum Funktionieren gebracht habe.
Den Bash Client finden wir auf https://github.com/palner/apiban/tree/master/clients/bash. Ich habe ihn etwas modifiziert, da offensichtlich nur absolute Pfadangaben innerhalb der Skripte funktionieren.
Zuerst müssen wir jq installieren, wenn dies nicht schon geschehen ist:
sudo apt-get update sudo apt install jq
Exkurs -Was versteht man unter jq, JSON und curl? jq ist ein plattformübergreifendes Kommandozeilen-Tool für JSON-Verarbeitung. Es wird verwendet, um JSON-Daten auf der Kommandozeile zu filtern, zu transformieren und zu manipulieren. Das Tool ist in vielen Linux-Distributionen verfügbar und kann einfach mit dem Paket-Manager “apt-get” installiert werden. Das Tool ist besonders nützlich, wenn es darum geht, große JSON-Datenmengen schnell und effizient zu verarbeiten. Es wird oft in Kombination mit anderen Linux-Tools wie “curl” und “grep” verwendet, um Daten von APIs und anderen Quellen abzurufen und zu analysieren.
JSON (JavaScript Object Notation) ist ein leichtgewichtiges Datenformat, das für den Datenaustausch zwischen Systemen verwendet wird. Es wurde als Alternative zu XML entwickelt und wird heute von vielen Anwendungen und APIs als bevorzugtes Format für die Datenübertragung verwendet.
curl ist ein plattformübergreifendes Kommandozeilen-Tool, das verwendet wird, um Daten von und zu Servern zu übertragen. Es unterstützt verschiedene Protokolle wie HTTP, HTTPS, FTP, FTPS, SMTP und viele mehr. Mit curl können Benutzer Daten abrufen und senden, indem sie URLs und verschiedene Optionen angeben. Es kann verwendet werden, um Dateien von Servern herunterzuladen oder um Daten an Server zu senden, um Aktionen auszuführen oder Anfragen zu stellen.
Weiter gehts mit der Installation: Nach der Installation von jq gehen wir auf unserem Raspberry in den Ordner /usr/local/bin, in dem sich alles abspielen wird. Hier kopieren wir die Bash-Datei apiban.sh hinein. Besten Dank an den Autor Fred Posner. Sein Skript für die apiban.sh habe ich etwas angepasst, damit es bei mir läuft:
#! /bin/bash # * This file is part of APIBAN.org. # * # * apiban-iptables-client is free software; you can redistribute it and/or modify # * it under the terms of the GNU General Public License as published by # * the Free Software Foundation; either version 2 of the License, or # * (at your option) any later version # * # * apiban-iptables-client is distributed in the hope that it will be useful, # * but WITHOUT ANY WARRANTY; without even the implied warranty of # * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # * GNU General Public License for more details. # * # * You should have received a copy of the GNU General Public License # * along with this program; if not, write to the Free Software # * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA NOW=$(date +"%Y-%m-%d %H:%M:%S") # APIKEY and last known ID are stored in config file CONFIG=/usr/local/bin/apibanconfig.sys # Output to a LOD LOG=/usr/local/bin/apiban-client.log if [ ! -e "${CONFIG}" ] ; then # cant find config file echo "does $CONFIG exist?" echo "unable to locate config file $CONFIG" exit 0 fi # APIKEY and last known ID are stored in apibanconfig.sys source $CONFIG # Exit if no APIKEY if [ -v "$APIKEY" ] ; then echo "$NOW - Cannot determine APIKEY. Exiting." >> $LOG exit 0 fi # If no LKID, make it 100 if [ -v "$LKID" ] ; then LKID="100" fi # check if chain APIBAN exists CURRIPS=$(iptables -S APIBAN | awk '$1 !="-P"' | awk '{print $4}' | awk '{gsub("/32", "");print}') if [ -z "$CURRIPS" ] ; then echo "$NOW - Making target chain, resetting LKID." >> $LOG LKID=100 iptables -N APIBAN iptables -I INPUT -j APIBAN iptables -I FORWARD -j APIBAN fi BANLIST=$(curl -s https://apiban.org/api/$APIKEY/banned/$LKID) IPADDRESS=$(echo $BANLIST | jq -r ".ipaddress? | .[]") CURRID=$(echo $BANLIST | jq -r ".ID?") # No new bans if [ "$CURRID" = "none" ] ; then echo "$NOW - No new bans since $LKID. Exiting." >> $LOG exit 0 fi # If CURRID is not numeric, exit. re='^[0-9]+$' if ! [[ $CURRID =~ $re ]] ; then echo "$NOW - Unexpected response from API ERR1 $CURRID. Exiting." >> $LOG exit 1 fi # update LKID sed -i "s/^\(LKID=\).*$/\1${CURRID}/" $CONFIG # parse through IPs IPADDRESSARR=(${IPADDRESS//$'\"'/}) for i in "${IPADDRESSARR[@]}" do NOW=$(date +"%Y-%m-%d %H:%M:%S") if [[ $CURRIPS =~ "$i" ]]; then echo "$NOW - $i already in APIBAN chain. Bad LKID?" >> $LOG else iptables -I APIBAN -s $i -j DROP echo "$NOW - Adding $i to iptables" >> $LOG fi done echo "$NOW - All done. Exiting." >> $LOG
Diese apiban.sh hat von mir nur zwei kleine Änderungen vom Original erfahren:
# APIKEY and last known ID are stored in config file CONFIG=/usr/local/bin/apibanconfig.sys # Output to a LOD LOG=/usr/local/bin/apiban-client.log
Damit das Bash-Skript die apibanconfig.sys mit dem Passwort findet und eine apiban-client.log für das Log angelegt werden kann, waren absolute Pfadangaben notwendig und deshalb müssen in diesem Fall die Dateien im Ordner /usr/local/bin/ untergebracht werden. Alle hier beschriebenen Dateien gelangen in den Ordner /usr/local/bin/.
Die apibanconfig.sys enthält das Passwort, welches wir per E-Mail erhalten haben. Die apibanconfig.sys besteht aus nur zwei Zeilen:
APIKEY=MYAPIKEY LKID=1
MYAPIKEY ersetzen wir also durch das Passwort, welches uns per E-Mail zugesandt wurde und auf https://www.apiban.org/getkey.html beantragt haben.
Das was im Prinzip schon. Die apiban.sh benötig noch Rechte, damit sie ausführbar ist:
sudo chmod 777 /usr/local/bin/apiban.sh
Wenn wir die Bash-Dateien auf Windows editiert haben, müssen wir sie für Linux anpassen. Dazu installieren wir dos2unix mit
sudo apt-get update sudo apt-get install dos2unix
Dann können wir die Bash-Datei ausführbar machen und fit für Linux machen:
sudo dos2unix /usr/local/bin/apiban.sh sudo chmod 777 /usr/local/bin/apiban.sh
Wenn wir die Dateien unter Windows editiert haben, sollte dies mit Notepad++ geschehen und in Notepad++ sollte die Kodierung auf UTF-8 eingestellt sein, wie es in der Linux-Welt üblich ist.
Nun können wir mit
bash /usr/local/bin/apiban.sh
APIBAN starten. Beim ersten Mal wird ein Hinweis kommen, dass etwas in Iptables fehlt. Trotzdem werden jetzt in der Chain APIBAN in Iptables eine Liste von IPs angelegt, die den Asterisk-Server dadurch idealerweise nicht mehr angreifen können. Außerdem wird die apiban-client.log angelegt. Sie gibt Auskunft über die IP-Adressen, welche in Iptables gespeichert werden.
Mit einem Cron-Job könnten wir den Vorgang automatisieren und die apiban.sh alle 10 Minuten ausführen lassen. Leider habe ich einen Cron-Job wegen einer komplizierten Vergabe von Rechten nicht starten können. Deshalb habe ich zu einer anderen Lösung gegriffen und die apiban.sh mit einer weiteren Bash-Datei alle 10 Minuten ausführen lassen. Diese Datei habe ich startapiban.sh genannt:
#!/bin/bash while true do /usr/local/bin/apiban.sh sleep 600 done
Die Schleife wird alle 600 Sekunden, also alle 10 Minuten ausgeführt und startet die apiban.sh. Die startapiban.sh müssen wir wie folgt für Linux fit machen:
sudo dos2unix /usr/local/bin/startapiban.sh sudo chmod 777 /usr/local/bin/startapiban.sh
Und so führen wir die startapinban.sh aus:
bash /usr/local/bin/startapiban.sh
Nach einem Tag hatten sich dann über 2000 Einträge der Chain APIBAN angehäuft und aus dem Skript ist nicht erkennbar, dass irgendwann ältere Einträge gelöscht werden. Zum Schluss kamen alle 10 Minuten nur noch etwa 2 neue Einträge hinzu. Das macht grob gerechnet etwa 250 neue Einträge pro Tag. Hier der Befehl, der ältere Einträge löscht und dabei die jüngsten 2500 Einträge stehen lässt:
iptables -L APIBAN -n --line-numbers | grep -v "Chain\|num" | sort -k1 -nr | awk 'NR>2500{print $1}' | while read num ; do iptables -D APIBAN $num ; done
Diesen Befehl will ich alle 24 Stunden ausführen lassen:
#!/bin/bash while true do # Befehl zum Löschen von allen Einträgen außer den letzten 2500 in der APIBAN-Kette iptables -L APIBAN -n --line-numbers | grep -v "Chain\|num" | sort -k1 -nr | awk 'NR>2500{print $1}' | while read num ; do iptables -D APIBAN $num ; done # Warte 24 Stunden bevor der Befehl erneut ausgeführt wird sleep 24h done
Die Datei habe ich delete_one_day_apiban.sh genannt. Gestartet wird sie mit:
bash /usr/local/bin/delete_one_day_apiban.sh
OK, das mit den Schleifen ist nicht besonders elegant. Besser ist es natürlich mit Cron Jobs. Aber wenn die aus unerfindlichen Gründen nicht funktionieren wollen, kann man sich auch so behelfen. Ich biete hier nur eine zusätzliche Alternative an, die nicht besonders elegant ist. Hauptsache es funktioniert.
Zusammenfassend wird die apiban.sh alle 10 Minuten ausgeführt, um in Iptables den Chain APIBAN alle 10 Minuten mit neuen böswilligen IPs zu befüllen. Dann werden alle 24 Stunden ältere Einträge in dieser Chain gelöscht, wovon die jüngsten 2500 Einträge verschont bleiben. Davon ausgehend, dass pro Tag 250 neue Einträge entstehen, verbleiben die Einträge im Schnitt 10 Tage. Danach sind in der Regel diese IPs nicht mehr aktiv.
Im Logfile können wir nachschauen und verfolgen, welche IP-Adressen für die Blacklist neu hinzukommen. Es entstehen noch weitere kleinere Dateien, die aber nur scheinbar existieren. Die Einträge verschwinden nach einem Neustart.
Einige interessante Befehle für Iptabels:
# Anzahl der Regeln in der Chain APIBAN iptables -L APIBAN -n --line-numbers | grep -v "Chain\|num" | wc -l # Anzahl der Regeln in APIBAN, die tatsächlich abgewehrt wurden iptables -L APIBAN -n --line-numbers -v | awk '$2 != "0" && NR > 2 {print}' | wc -l # Alle IPs in der Chain APIBAN auflisten, die abgewehrt wurden iptables -L APIBAN --line-numbers -n -v | awk '$2 != "0" {print}' # Fail2Ban zum Vergleich fail2ban-client status asterisk
Hier hat APIBAN zugeschlagen und dem Admin viel Ärger erspart:
root@raspberrypi:/home/pi# iptables -L APIBAN --line-numbers -n -v | awk '$2 != "0" {print}' Chain APIBAN (2 references) num pkts bytes target prot opt in out source destination 189 13 10738 DROP all -- * * 174.138.185.11 0.0.0.0/0 369 1659 613K DROP all -- * * 92.205.30.71 0.0.0.0/0 1241 5 3223 DROP all -- * * 151.106.32.146 0.0.0.0/0 1346 2 882 DROP all -- * * 51.159.91.192 0.0.0.0/0 1465 92 74971 DROP all -- * * 151.106.40.147 0.0.0.0/0 root@raspberrypi:/home/pi#
Der obige Screenshot zeigt, dass auffallend viele IPs mit 151.106 anfangen. Es handelt sich hierbei wahrscheinlich um ein DoS-Angriff. Ein DoS-Angriff (Denial of Service) ist eine Art von Cyberangriff, bei dem ein Angreifer versucht, eine Website, einen Server oder ein Netzwerk zu überlasten oder unzugänglich zu machen, indem er es mit einer großen Anzahl von Anfragen oder Traffic überflutet. Dadurch wird die normale Funktionalität des betroffenen Systems gestört oder vollständig unterbrochen, was zu einem Ausfall oder einer Beeinträchtigung der Dienstleistung führen kann. Fail2Ban hätte hier wahrscheinlich versagt.
Stromausfall: Meinen Asterisk-Server habe ich mehrfach einem Stromausfall unterzogen und er startete danach immer wieder problemlos. Trotzdem gibt es keine Garantie dafür, dass Beschädigungen der Dateien nicht auftregen, weshalb vorher eine Datensicherung unbedingt vorzunehmen ist.
In den nachfolgenden Videos erklärt Fred Posner kurz und knapp wie APIBAN funktioniert:
Fred Posner über APIBAN
Ein etwas längerer Vortrag von Fred Posner über APIBAN
APIBAN erzeugt mit “Honigtöpfen (honeypots)” Blacklists: Was sagt unter Vorbehalt ChatGPT? APIBAN ist ein Tool, das entwickelt wurde, um SIP-Server (Session Initiation Protocol) vor Angriffen durch Brute-Force- oder Denial-of-Service-Attacken zu schützen. Das Tool funktioniert durch Überwachung von Protokoll-Logs auf verschiedenen SIP-Servern, um bösartige Verbindungen zu erkennen. Wenn eine bösartige Verbindung erkannt wird, wird die IP-Adresse des Angreifers in eine Blacklist aufgenommen, um zukünftige Verbindungen von dieser Adresse zu blockieren. Diese Blacklist wird an andere Server verteilt, die sich dadurch rechtzeitig schützen können, ohne das zum Beispiel Fail2Ban eingreifen muss.
Das Tool verwendet die IPtables-Regeln des Linux-Betriebssystems, um den Zugriff von bösartigen IP-Adressen auf den SIP-Server zu blockieren. Wenn eine IP-Adresse in die Blacklist aufgenommen wird, wird eine neue IPtables-Regel erstellt, um den Zugriff dieser IP-Adresse auf den SIP-Server zu blockieren. Die Regeln werden automatisch aktualisiert, wenn neue bösartige Verbindungen erkannt werden und ältere Einträge werden gelöscht, um sicherzustellen, dass die Blacklist nicht zu groß wird und keine unnötige Belastung auf dem System erzeugt.
APIBAN kann auch mit verschiedenen anderen Tools und Technologien integriert werden, um den Schutz des SIP-Servers zu verbessern. Zum Beispiel kann es mit Fail2ban integriert werden, um bösartige Verbindungen zu blockieren, die andere Protokolle wie SSH oder FTP verwenden. Das Tool kann auch mit einer Firewall oder einem Intrusion Detection System (IDS) integriert werden, um den Schutz des SIP-Servers weiter zu verbessern.
Honeypots ( https://de.wikipedia.org/wiki/Honeypot ) sind eine Methode zur Erkennung und Untersuchung von Angriffen auf SIP-Server. Honeypots sind speziell konfigurierte Server oder Endpunkte, die entwickelt wurden, um Angriffe auf sich zu ziehen und aufzuzeichnen, was die Angreifer tun. Indem sie Angriffe simulieren, können Honeypots Angreifer identifizieren und deren Methoden und Taktiken aufdecken.
APIBAN arbeitet mit weltweit verteilten Honeypots, um bösartige SIP-Adressen aufzuspüren und automatisch in eine Blacklist aufzunehmen. Wenn eine bösartige Verbindung zu einem Honeypot-Endpunkt hergestellt wird, erkennt APIBAN das Ereignis und fügt die IP-Adresse des Angreifers automatisch in die Blacklist ein, um zukünftige Verbindungen von dieser Adresse zu blockieren.
Durch die Kombination von Honeypots mit APIBAN können böswillige SIP-Adressen schnell identifiziert und blockiert werden, bevor sie Schaden anrichten können. Honeypots bieten auch zusätzliche Informationen über die Methoden und Taktiken von Angreifern, die zur Verbesserung der Sicherheit des SIP-Servers verwendet werden können.
Insgesamt ist APIBAN ein nützliches Tool, um die Sicherheit von SIP-Servern zu erhöhen, indem es automatisch bösartige Verbindungen blockiert und so den Server vor Angriffen schützt. Durch die Integration mit anderen Tools und Technologien kann der Schutz noch weiter verbessert werden.
Verwandte Themen:
Was für AGI-Skripte gilt, hat auch ganz allgemein Gültigkeit für die Konvertierung ausführbarer Dateien, die unter Windows erstellt wurden und unter Linux ausgeführt werden:
AGI-Skripte für Asterisk unter Windows editieren – Was ist zu beachten? – 9. März 2023: Windows ist weit verbreitet. Deshalb schreiben nicht wenige ihre AGI-Skripte auf Windows, um sie dann in ihren Raspberry Pi zu kopieren. Wer einige Dinge nicht beachtet, wird die Skripte nicht zum Laufen bekommen. Hier sind die Fallstricke beschrieben, die mich viel Zeit gekostet haben. Die Beispiele beziehen sich auf Python. Sie haben für andere Programmiersprachen die entsprechende Gültigkeit. – weiter – |
Fail2Ban für Asterisk installieren und konfigurieren – 28. Februar 2023: Fail2Ban ist ein Programm, das auf einem Server läuft und Log-Dateien von Asterisk überwacht, um ungewöhnliche Aktivitäten aufzuspüren und diese in Echtzeit zu blockieren. Es ist ein wichtiger Bestandteil der Sicherheitsstrategie, da es verhindert, dass unauthorisierte Nutzer auf den Asterisk-Server zugreifen und somit sensible Daten oder Dienste manipulieren oder zerstören. Fail2Ban minimiert das Risiko von Angriffen auf Asterisk, indem es potenzielle Bedrohungen schnell erkennt und automatisch blockiert, bevor sie Schaden anrichten können. – weiter – |
SIP-Scanner blockieren, die Fail2Ban nicht entdecken kann – 17.1.2022: Wenn im Asterisk-CLI Meldungen wie “Timeout on … on non-critical invite transaction.” als “WARNING” auftreten, handelt es sich meistens um einen Angriff durch einen SIP-Scanner. Sie sind für Betreiber von Asterisk-Servern eine Gefahr, da Fail2Ban oft nicht in der Lage ist diese unerwünschten Eindringlinge zu blockieren. Manchmal treten die Attacken der SIP-Scanner massenhaft auf und können sogar den Betrieb eines Asterisk-Servers empfindlich stören. Nachfolgend eine Lösung ohne Einsatz nicht ausreichend getesteter Skripte, die den Asterisk-Server eventuell zum Abstürzen bringen könnten. – weiter –
|
Asterisk: SIP-Scanner-Blacklist für Iptables selbst erstellt – 28. Februar 2023: Da mir Tools für die automatische Beschaffung und Verwaltung von SIP-Scanner-Blacklisten zu unsicher sind und sie das System im schlimmsten Fall beschädigen können, bin ich dazu übergegangen mir die Blacklisten selbst zu erstellen. Mit entsprechenden Python-Skripten beschränkt sich der wöchentliche Aufwand nur auf ein paar Minuten. – weiter – |
Übergeordnet:
Asterisk-Telefonserver auf einem Raspberry Pi – Installation, Konfiguration, Programmierung, SIP, IAX2, AGI-Skripte, Sicherheit und Tipps zum praktischen Betrieb – 2.11.2022: Diese Seite richtet sich an jene, welche einen Asterisk-Telefon-Server auf einem Raspberry Pi betreiben möchten und später ein kleines Netzwerk aus Asterisk-Servern planen, um ein eigenständiges Telefonnetz aufzubauen. Los geht es mit der Installation von Raspbian und Asterisk auf einem Raspberry Pi und dann nach Lust und Laune immer tiefer in die Programmierung von Asterisk. Die Themen werden laufend erweitert.
Selbstverständlich muss es nicht unbedingt ein Raspberry Pi sein. Andere Linux-Rechner gehen auch. – weiter – |