APIBAN schützt SIP-Telefon-Server automatisch vor bösartigen Angriffen aus dem Internet

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 läuft bei mir auf einem Raspberry Pi mit Raspbian und Asterisk.
Belastung der CPU meines Raspberry Pi 3 B+ beträgt gerade mal 2,6%. Das im Hintergrund laufende APIBAN stellt keine Belastung dar. Diesen Wert erreichte ich auch vor der Installation von APIBAN. Der CPU-Test kann mit “top” im Linux-CLI erfolgen und wird mit q beendet.

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.

Auszug aus der Log-Datei von APIBAN. Im Abstand von 10 Minuten wird die Blacklist in Iptables aktualisiert.
APIBAN legt in Iptables einen neuen Chain APIBAN an und befüllt ihn mit böswilligen IP-Adressen. Wir können das selbt mit “iptables -L -n -v”. überprüfen.

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#
APIBAN war über Nacht sehr fleißig. Es ist ein kraftvolles Werkzeug und hat innerhalb von 24 Stunden Angriffe von fast 40 IPs abgewehrt. APIBAN hat in meiner Liste fast 1000 IPs geblockt. Fail2Ban hat fast nichts mehr zu tun.
APIBAN war über Nacht sehr fleißig. Es ist ein kraftvolles Werkzeug und hat innerhalb von 24 Stunden Angriffe von fast 40 IPs abgewehrt. APIBAN hat in meiner Liste fast 1000 IPs geblockt. Fail2Ban hat fast nichts mehr zu tun.

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:

Der Programmier-Code ist fehlerfrei. Trotzdem läuft das AGI-Skript nicht. Warum verflixt noch einmal?
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 bietet bereits vorgefertigte Regeln für dem Schutz eines Asterisk-Servers an.
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

Liste der von Iptables gesperrter SIP-Scanner
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

 

https://www.kwancro.com/honeypotdata/ Hier gibt es die Daten für die Erstellung von Blacklisten zum Schutz von SIP-Servern
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:

Auf einem Raspberry Pi lässt sich ein kompletter Telefonserver betreiben, der seinen Teilnehmern über Landesgrenzen hinweg kostenloses Telefonieren von unterwegs oder daheim ermöglicht.
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