
Un'app django riutilizzabile semplice e super veloce che blocca le persone dai tentativi di login con forza bruta.
.. image:: https://jazzband.co/static/img/badge.svg :target: https://jazzband.co/ :alt: Jazzband
.. image:: https://img.shields.io/pypi/pyversions/django-defender.svg :alt: Versioni Python supportate :target: https://pypi.org/project/django-defender/
.. image:: https://img.shields.io/pypi/djversions/django-defender.svg :target: https://pypi.org/project/django-defender/ :alt: Versioni Django supportate
.. image:: https://github.com/jazzband/django-defender/workflows/Test/badge.svg :target: https://github.com/jazzband/django-defender/actions :alt: GitHub Actions
.. image:: https://codecov.io/gh/jazzband/django-defender/branch/master/graph/badge.svg :target: https://codecov.io/gh/jazzband/django-defender :alt: Copertura
.. image:: https://readthedocs.org/projects/django-defender/badge/?version=latest :alt: Stato della documentazione :target: https://django-defender.readthedocs.io/en/latest/?badge=latest
Un'app riutilizzabile Django semplice che impedisce attacchi di forza bruta ai tentativi di login. L'obiettivo è renderla il più veloce possibile, per non rallentare i tentativi di accesso.
Utilizzeremo una cache in modo da non dover interrogare il database a ogni tentativo di login. La prima versione sarà basata su Redis, ma l'obiettivo è renderlo configurabile in modo che le persone possano usare il backend più adatto alle loro esigenze.
Se usi defender sul tuo sito, invia una PR per aggiungerlo all'elenco.
La documentazione è disponibile su Read the Docs:
https://django-defender.readthedocs.io
Registra tutti i tentativi di login nel database
Supporto per proxy inversi con diverse intestazioni per gli indirizzi IP
Limite di frequenza basato su
Usa Redis per la lista nera
Configurazione
Server Redis
Durata del blocco
Numero di tentativi errati prima del blocco
Copertura del codice al 95%
Documentazione completa
Possibilità di memorizzare i tentativi di login nel database
Comando di amministrazione per pulire la tabella dei tentativi di login
Pagine di amministrazione
Può essere facilmente adattato a metodi di autenticazione personalizzati.
Vengono inviati segnali quando si blocca un nome utente o un IP
Pagine di amministrazione
.. image:: https://cloud.githubusercontent.com/assets/261601/5950540/8895b570-a729-11e4-9dc3-6b00e46c8043.png :target: https://cloud.githubusercontent.com/assets/261601/5950540/8895b570-a729-11e4-9dc3-6b00e46c8043.png :alt: alt tag
.. image:: https://cloud.githubusercontent.com/assets/261601/5950541/88a35194-a729-11e4-981b-3a55b44ef9d5.png :target: https://cloud.githubusercontent.com/assets/261601/5950541/88a35194-a729-11e4-981b-3a55b44ef9d5.png :alt: alt tag
Scarica il codice ed esegui il setup in uno dei seguenti modi, a seconda del metodo.
Per installare la versione pronta per la produzione da PyPI:
.. code-block:: bash
pip install django-defender
Per installare la versione di sviluppo dal codice sorgente dopo il download:
.. code-block:: bash
python setup.py install
Per installare la versione di sviluppo del branch master dal repository GitHub:
.. code-block:: bash
pip install -e git+http://github.com/kencochran django-defender.git#egg=django_defender-dev
Prima di tutto, devi aggiungere questo progetto alla tua lista di INSTALLED_APPS in
settings.py
.. code-block:: python
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', # ... 'defender', # ... ]
Successivamente, installa il middleware FailedLoginMiddleware
.. code-block:: python
MIDDLEWARE_CLASSES = [ 'django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'defender.middleware.FailedLoginMiddleware', ]
Se vuoi gestire gli utenti bloccati tramite l'amministrazione di Django, aggiungi
quanto segue al tuo urls.py
.. code-block:: python
urlpatterns = [ path('admin/defender/', include('defender.urls')), # admin defender path('admin/', admin.site.urls), # admin normale # i tuoi pattern seguono... ]
Migrazioni
Dovrai creare le tabelle nel tuo database necessarie per il funzionamento.
.. code-block:: bash
python manage.py migrate defender
Comandi di gestione
cleanup_django_defender
Se hai un sito web con molto traffico, la tabella AccessAttempts si riempirà abbastanza rapidamente. Se non hai bisogno di conservare i dati a fini di audit, c'è un comando di gestione per aiutarti a mantenerla pulita.
Esaminerà l'impostazione DEFENDER_ACCESS_ATTEMPT_EXPIRATION per determinare
quali record verranno eliminati. Il valore predefinito, se non specificato, è 24 ore.
.. code-block:: bash
$ python manage.py cleanup_django_defender
Puoi impostarlo come cron job giornaliero o settimanale per mantenere la dimensione della tabella ridotta.
.. code-block:: bash
24 0 * * * /usr/bin/python manage.py cleanup_django_defender >> /var/log/django_defender_cleanup.log
Prestazioni
L'obiettivo di defender è renderlo il più veloce possibile in modo da non rallentare il processo di login. Per assicurarci di raggiungere i nostri obiettivi, abbiamo bisogno di un modo per testare l'applicazione e verificare di essere sulla strada giusta. Il modo migliore per farlo è confrontare la velocità di un normale login Django con defender e django-axes.
Il normale login Django sarebbe la nostra base di riferimento, e ci aspettiamo che sia il più veloce dei 3 metodi, perché non ci sono ulteriori controlli in corso.
Il login con defender sarà molto probabilmente più lento del login Django, e si spera più veloce del login django-axes. L'obiettivo è rendere la differenza il più piccola possibile tra il login normale e defender.
La velocità del login django-axes sarà probabilmente la più lenta dei tre poiché esegue più controlli e molte query al database.
Il modo migliore per determinare la velocità di un login è fare un test di carico contro un applicazione con ciascuna configurazione e confrontare i tempi di login per ogni tipo.
Test di carico
Per assicurarci di coprire tutti i diversi tipi di login, nel nostro test di carico dobbiamo avere più di un test.
#. Tutti successi: Eseguiremo un test di carico solo con login riusciti.