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:
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 istlocalhost
.redis_port
: Port-Nummer für eine Redis-TCP/IP-Verbindung. Der Standard ist6397
.redis_db
: Die Redis-Datenbank-Nummer. Der Standard ist0
.redis_use_socket
: Wenn ein Unix-Socket statt einer TCP/IP-Verbindung verwendet werden soll, muss dieser Parameter aufTrue
gesetzt werden. Der Standard istFalse
.
- 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 ist180
, 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 hier86400
, 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 ist3
, 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 unterblackred.BlackRed.Settings.BLACKLIST_TTL_SECONDS
konfigurierten Wert zu setzen. Der Standard istTrue
.
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 istlocalhost
.blackred.BlackRed.Settings.REDIS_PORT
: Das TCP-Port für die Redis-Instanz. Der Standard ist6379
.blackred.BlackRed.Settings.REDIS_DB
: Die Redis-Datenbank-Nummer. Der Standard ist0
.blackred.BlackRed.Settings.REDIS_USE_SOCKET
: Es soll eine Verbindung über einen Socket statt TCP/IP hergestellt werden. Der Standard istFalse
.
Links
- Build-Status: https://travis-ci.org/edelbluth/blackred
- Projekt-Webseite: https://github.com/edelbluth/blackred
- PyPi-Seite: https://pypi.python.org/pypi/blackred
Lizenz
BlackRed steht unter der Apache License 2.0.
Quelle: github.com/edelbluth/blackred
Autor:
Jürgen Edelbluth
Themen:
Software-Entwicklung Python
Veröffentlicht:
14.06.2015 14:46
Zuletzt aktualisiert:
13.03.2020 16:57