Mit BlackRed Benutzer-Logins absichern

Mit dem Python-Package »BlackRed« lässt sich eine Benutzeranmeldung zusätzlich gegen Brute-Force-Angriffe absichern. Als Datenbank dafür dient »Redis«.

Funktionsweise

Mit dem Python-Modul »BlackRed« protokolliert man Fehlversuche bei der Benutzeranmeldung in einer Redis-Datenbank. Dabei kann wählen, ob man eine IP-Adresse, von der aus der Login versucht wird, oder den Benutzernamen, mit dem der Login versucht wurde, aufzeichnet. Gibt es 3 Aufzeichnungen innerhalb einer gewissen Zeit, kommt die IP-Adresse (respektive der Benutzername) auf eine Blacklist - und für einen längeren Zeitraum werden Login-Anforderungen nicht einmal mehr bearbeitet, selbst wenn die Benutzerdaten korrekt sind.

BlackRed verwendet dazu zwei Listen: Eine Beobachtungsliste, auf der Fehlversuche gezählt werden und eine schwarze Liste, auf der Einträge festgehalten werden, für die es zu viele Fehlversuche gab.

Die Zeiträume für die Zählung von Fehlversuchen und den Verbleib auf der schwarzen Liste sowie die Anzahl der Fehlversuche, bevor ein Eintrag auf die schwarze Liste kommt, sind frei im Sekundenraster konfigurierbar.

Standardmäßig kommt ein Eintrag nach drei Fehlversuchen innerhalb von drei Minuten (die Zeitzählung beginnt mit jedem Fehlversuch neu) für 24 Stunden auf die schwarze Liste. Wird innerhalb dieser 24 Stunden ein weiterer Versuch unternommen, wird die verbleibende Zeit auf der schwarzen Liste wieder auf 24 Stunden erhöht (abschaltbar).

BlackRed wurde für Python 3.2, 3.3, 3.4, 3.5 und PyPy 3 entwickelt.

Der größte Teil dieses Artikels ist eine leicht angepasste Übersetzung der englischsprachigen README-Datei des Pakets.

Installation

BlackRed kann ganz einfach mit pip installiert werden:

$ pip install blackred

Nutzung von BlackRed

Eine typische Verwendung von BlackRed würde so aussehen:

Typische Verwendung von BlackRed

Oder in Python-Code:

import blackred

def login(username, password, request_ip):
    br = blackred.BlackRed()
    if br.is_blocked(request_ip):
        return False
    if not authenticate(username, password):
        br.log_fail(request_ip)
        return False
    br.unblock(request_ip)
    return True

API-Dokumentation

BlackRed hat eine sehr einfache und intuitiv nutzbare API.

  • Der Konstruktor blackred.BlackRed akzeptiert diese optionalen Parameter:
    • redis_host: Hostname, IP-Adresse oder Socket. Der Standard ist localhost.
    • redis_port: Port-Nummer für eine Redis-TCP/IP-Verbindung. Der Standard ist 6397.
    • redis_db: Die Redis-Datenbank-Nummer. Der Standard ist 0.
    • redis_use_socket: Wenn ein Unix-Socket statt einer TCP/IP-Verbindung verwendet werden soll, muss dieser Parameter auf True gesetzt werden. Der Standard ist False.
  • Mit der Methode log_fail lässt man einen Fehlversuch aufzeichnen. Sie benötigt genau einen Parameter:
    • item: IP-Adresse, Benutzername oder was auch immer zur Identifizierung des Versuchs.
  • Um zu überprüfen, ob ein bestimmter Eintrag schon auf der schwarzen Liste steht, verwendet man die Methode is_blocked oder - um das Gegenteil zu überprüfen - is_not_blocked. Auch sie benötigt exakt einen Parameter:
    • item: IP-Adresse, Benutzername oder was auch immer zur Identifizierung des Versuchs.
  • Um etwas wieder von der Beobachtungsliste bzw. der schwarzen Liste zu nehmen, verwendet man die Methode unblock. Auch diese benötigt exakt einen Parameter:
    • item: IP-Adresse, Benutzername oder was auch immer zur Identifizierung des Versuchs.

Redis-Verbindungsparameter

Es gibt zwei Möglichkeiten, die Redis-Verbindungsparameter anzugeben. Entweder verwendet man den Konstruktor der BlackRed-Klasse (siehe oben) oder man verändert die Standardvorgaben (siehe nächster Absatz).

Eine Besonderheit ist die Verwendung von Unix-Sockets. Hier übergibt man dem Konstruktor den Pfad zum Socket als Parameter redis_host und setzt redis_use_socket auf True:

import blackred

br = blackred.BlackRed(redis_host='/var/run/redis/redis.sock', redis_use_socket=True)

Natürlich lässt sich auch die Verwendung von Sockets auch in den Standard-Vorgaben konfigurieren.

Einstellungen und Standardwerte

Die Einstellungen für BlackRed werden in der Klasse blackred.BlackRed.Settings vorgenommen. Dabei sind alle Einstellungen global gültig für alle BlackRed-Instanzen. Eine Ausnahme bilden die Verbindungsparameter. Sie gelten nur für neue Instanzen, die nach der Änderung der Einstellungen entstehen.

Globale Einstellungen

  • blackred.BlackRed.Settings.WATCHLIST_KEY_TEMPLATE: Die Vorlage für die Erstellung von Beobachtungslisten-Schlüssel in der Redis-Datenbank. Der Standard ist 'BlackRed:WatchList:{:s}' und sollte nur dann geändert werden, wenn diese Vorlage mit bereits verwendeten Namensräumen kollidiert.
  • blackred.BlackRed.Settings.BLACKLIST_KEY_TEMPLATE: Vorlage für die Erstellung von Schlüsseln für die schwarze Liste. Der Standard ist 'BlackRed:BlackList:{:s}'. Auch diese Einstellung sollte nur bei Namensraum-Kollisionen geändert werden.
  • blackred.BlackRed.Settings.WATCHLIST_TTL_SECONDS: Zeit in Sekunden, für die ein Fehlversuch protokolliert bleibt. Wenn innerhalb dieser Zeit ein neuer Fehlversuch protokolliert wird, wird die Lebensdauer des Eintrags wieder auf diesen Wert gesetzt. Der Standard ist 180, also 3 Minuten.
  • blackred.BlackRed.Settings.BLACKLIST_TTL_SECONDS: Zeit in Sekunden, für die ein Eintrag auf der schwarzen Liste bleibt. Der Standard ist hier 86400, also 24 Stunden.
  • blackred.BlackRed.Settings.WATCHLIST_TO_BLACKLIST_THRESHOLD: Anzahl der protokollierten Fehlversuche, bis ein Eintrag von der Beobachtungsliste auf die schwarze Liste wandert. Der Standard ist 3, so erfolgt nach dem dritten Fehlversuch der Eintrag auf der schwarzen Liste.
  • blackred.BlackRed.Settings.BLACKLIST_REFRESH_TTL_ON_HIT: Legt fest, ob bei einem Anmeldeversuch eines Eintrages, der sich schon auf der schwarzen Liste befindet, die übrige Zeit auf der schwarzen Liste wieder auf den unter blackred.BlackRed.Settings.BLACKLIST_TTL_SECONDS konfigurierten Wert zu setzen. Der Standard ist True.

Einstellungen für neue Instanzen

Diese Einstellungen legen die Standardwerte für die Parameter des Konstruktors fest.

  • blackred.BlackRed.Settings.REDIS_HOST: Hostname, IP-Adresse oder Socket der Redis-Instanz. Standard ist localhost.
  • blackred.BlackRed.Settings.REDIS_PORT: Das TCP-Port für die Redis-Instanz. Der Standard ist 6379.
  • blackred.BlackRed.Settings.REDIS_DB: Die Redis-Datenbank-Nummer. Der Standard ist 0.
  • blackred.BlackRed.Settings.REDIS_USE_SOCKET: Es soll eine Verbindung über einen Socket statt TCP/IP hergestellt werden. Der Standard ist False.

Links

Lizenz

BlackRed steht unter der Apache License 2.0.


Quelle: github.com/edelbluth/blackred


Kommentare

Noch keine Kommentare.