Skripte um die Synology-DSM-Blockierungsliste zu bearbeiten

Der Hersteller Synology stellt in deren DSM (Disk Station Manager) auf ihren NAS (Network Attached Storage) eine Blockierungsdatenbank bereit, die so konfiguriert werden kann, dass IP Adressen von denen fehlgeschlagene Anmeldeversuche registriert werden, für einen bestimmten Zeitraum oder dauerhaft blockiert werden. Diese Funktion findest du im Bereich Systemsteuerung -> Sicherheit -> Schutz -> Automatische Blockierung.

Als Auslöser für eine automatische Blockierung, empfiehlt es sich eine relative geringe Anzahl von Login-Versuchen in einem relativ großen Zeitfenster einzustellen (zum Beispiel 3 fehlgeschlagene Login-Versuche in einem Zeitraum von 240 Minuten).

Die Freigabe-/Blockierungsliste der Blockierungsdatenbank lässt sich an dieser Stelle auch einsehen und anpassen. Es können IP Adressen und/oder Subnetze jeweils der Freigabe- oder der Blockierungsliste hinzugefügt werden. Dies geschieht unabhängig vom automatischen Hinzufügen blockierter IP Adressen zur Blockierungsliste.

Um größere Mengen an Daten zu bearbeiten, oder ein Bearbeiten zu automatisieren (wie zum Beispiel ein automatisches Auffüllen der Blockierungsliste mit IP Adressen die von blocklist.de bereitgestellt werden) empfiehlt sich die Nutzung von Skripten. Diese können entweder direkt auf dem NAS per Aufgabenplaner oder per Secure-Shell-Zugriff (SSH) ausgeführt, oder zentral verwaltet über zum Beispiel CMS (Central Management System) oder Ansible angestoßen werden.

Hinweis: für das Ausführen der nachfolgenden Skripte oder der jeweiligen einzelnen Befehle, werden root-Berechtigungen benötigt. Hierzu muss im Aufgabenplaner, als ausführender Benutzer, root gewählt werden. Wenn die Skripte oder die jeweiligen einzelnen Befehle per Secure-Shell-Zugriff (SSH) ausgeführt werden, muss dieses entweder unter der Verwendung von sudo, oder eben entsprechend auch als Benutzer root ausgeführt werden.

Leeren (flush) der Sperrliste

Das nachfolgende Skript löscht alle Einträge des ausgewählten Listentyp aus der Blockierungsdatenbank. Durch anpassen des Schalters export listentyp= (Freigabeliste=0, Sperrliste=1) wird bestimmt aus welchem Bereich die Einträge in der Blockierungsdatenbank gelöscht werden sollen.

Dies ist eventuell dann nützlich wenn du von deinem NAS die Information erhältst, dass deine Blockierungsliste auf eine enorme Größe angewachsen ist. Der Lauf des Skriptes security_blocklist_flush_deny.sh sollte von einem Aufruf des Skriptes security_blocklist_update.sh gefolgt werden um die Datenbank nicht nur zu leeren, sondern diese anschließend mit den aktuellen, zu blockierenden IP Adressen zu bestücken.

#!/bin/bash
# Titel: 'security_blocklist_flush_deny.sh'
# Autor: 'Holger Näther'
# Version: '1.0'

# Welcher Listentyp soll verwendet werden: Freigabeliste=0, Sperrliste=1
export listentyp="1"

# Pfad und Name der Blockierungsdatenbank
export datenbank=/etc/synoautoblock.db

# Datenbank leeren
sqlite3 $datenbank "DELETE FROM AutoBlockIP WHERE Deny IS $listentyp"

Hinzufügen von auf blocklist.de gelisteten Adressen

Auf der Webseite von blocklist.de gibt es verschiedene Blockierungslisten, die mit dem nachfolgenden Skript abgefragt und deren Einträge, abhängig vom gesetzten Schalter export blockliste= (zur Auswahl stehen unter anderen all, apache, bots, bruteforcelogin, ftp, imap, ircbot, mail, sip, ssh, strongips), in die Blockierungsdatenbank hinzugefügt werden können.

Dieses Script könnte automatisch, einmal täglich mit dem Aufgabenplaner laufen gelassen werden, um somit eine ständig aktualisierte Blockierungsdatenbank zu erhalten.

#!/bin/bash
# Titel: 'security_blocklist_update.sh'
# Autor: 'Holger Näther'
# Version: '2.3'

# Welcher Adressentyp soll verwendet werden: Einzeladresse=0, Subnetzadresse=3
export adressentyp="0"

# Welche Blockierungsliste soll von blocklist.de geladen werden: "all", "apache", "bots", "bruteforcelogin", "ftp", "imap", "ircbot", "mail", "sip", "ssh", "strongips"
export blockliste="all"

# Welcher Listentyp soll verwendet werden: Freigabeliste=0, Sperrliste=1
export listentyp="1"

# Pfad und Name der Blockierungsdatenbank
export datenbank=/etc/synoautoblock.db

# Zeitstempel in Sekunden seit 1970-01-01 00:00:00 UTC (UNIX Time) setzen
export systemzeit=`date +%s`

# Gewählte Blockliste von blocklist.de herunterladen und in temporäre Datei schreiben
wget -q "https://lists.blocklist.de/lists/$blockliste.txt" -O /tmp/blockliste.txt

# Enthaltene IPv4-Adressen aus der temporären Datei auslesen
cat "/tmp/blockliste.txt" | while read blockierte_ip

do
  # Überprüfen ob die gelistete IPv4-Adresse im richtigen Format vorliegt
  validiere_ipv4=`echo "$blockierte_ip" | grep -Eo "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$" | wc -l`
    if [[ $validiere_ipv4 -eq 1 ]]; then
      # Die gelistete IPv4-Adresse in eine IPv6 Adresse umwandeln
      ipv4=`echo $blockierte_ip | sed 's/\./ /g'`
      ipv6=`printf "0000:0000:0000:0000:0000:FFFF:%02X%02X:%02X%02X" $ipv4`
      # Überprüfen ob die gelistete IPv4-Adresse bereits in der Blockierungsdatenbank vorhanden ist
      validiere_existenz=`sqlite3 $datenbank "SELECT DENY FROM AutoBlockIP WHERE IP = '$blockierte_ip'" | wc -l`
      if [[ $validiere_existenz -lt 1 ]]; then
        # Wenn die gelistete IPv4-Adresse nicht vorhanden ist, diese in die Blockierungsdatenbank schreiben
        INSERT=`sqlite3 $datenbank "INSERT INTO AutoBlockIP VALUES ('$blockierte_ip','$systemzeit','0','$listentyp','$ipv6','$adressentyp','')"`
        # Informationsausgabe das die gelistete IPv4-Adresse der Datenbank hinzugefügt wurde
        echo "IPv4-Adresse wurde der Datenbank hinzugefügt!   -->  $blockierte_ip"
      else
        # Informationsausgabe das die gelistete IPv4-Adresse bereits in der Datenbank vorhanden ist
        echo "IPv4-Adresse bereits in der Datenbank vorhanden! -->  $blockierte_ip"
      fi
    else
      # Informationsausgabe das die gelistete IPv4-Adresse nicht im erwarteten Format vorliegt
      echo "IPv4-Adresse liegt nicht im erwarteten Format vor! -->  $blockierte_ip"
    fi
done

# Löschen der temporären Datei
rm /tmp/blockliste.txt

exit 0

4 Kommentare

  1. Danke für Deinen Hinweis Matti! Und ja, dies hätte durchaus direkt hervorgehoben werden müssen. Ich habe dies nun, als Hinweis, dem Beitrag entsprechend hinzugefügt.

  2. Das Script zum Löschen der Blockierliste muss unter Benutzer: „Root“ ausgeführt werden im Aufgabenplaner. Ansonsten funktioniert es nicht (oder die anderen Benutzer haben nicht die notwendigen Rechte).

    Ansonsten vielen Dank an den Autor, war mir eine große Hilfe.

  3. Hallo Gerhard, auf welchem Systemstand setzt Du dieses Script denn ein? Ich habe es soeben auf DSM 7.2.1-69057 Update 3 getestet und sowohl das Script an sich, als auch die manuelle Eingabe der drei Schritte führt zum leeren der Datenbank:

    export listentyp="1"
    export datenbank=/etc/synoautoblock.db
    sqlite3 $datenbank "DELETE FROM AutoBlockIP WHERE Deny IS $listentyp"

    Was passiert denn, wenn Du den Befehl direkt aufrufst:

    sqlite3 /etc/synoautoblock.db "DELETE FROM AutoBlockIP WHERE Deny IS 1"

    Eventuell könnte die Kaskadierung der Anführungszeichen zu einem Problem führen. Probier doch mal das Setzen des Listen-Typs wie folgt anzupassen:

    export listentyp=1

    Mit welchem Benutzer führst Du das Script aus? Die Datenbank /etc/synoautoblock.db kann nur vom Benutzer root gelesen und beschrieben werden. Hier also bitte auf die entsprechende Benutzerwahl achten.

  4. Das Script, welches die Blockierungsliste löscht, funktioniert nicht. Das Script läuft ohne Fehlermeldung durch, in der Liste stehen aber noch immer mehr als 21.000 Einträge.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.