
Um aplicativo Django reutilizável simples e super rápido que impede tentativas de login por força 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: Versões Python suportadas :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: Versões Django suportadas
.. 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: Cobertura
.. image:: https://readthedocs.org/projects/django-defender/badge/?version=latest :alt: Status da Documentação :target: https://django-defender.readthedocs.io/en/latest/?badge=latest
Um aplicativo Django reutilizável simples que bloqueia tentativas de login por força bruta. O objetivo é tornar isso o mais rápido possível, para não atrasar as tentativas de login.
Usaremos um cache para que não precise acessar o banco de dados a cada tentativa de login. A primeira versão será baseada em Redis, mas o objetivo é tornar isso configurável para que as pessoas possam usar o backend que melhor atender às suas necessidades.
Se você estiver usando defender no seu site, envie um PR para adicionar à lista.
A documentação está disponível no Read the Docs:
https://django-defender.readthedocs.io
Registrar todas as tentativas de login no banco de dados
Suporte para proxies reversos com diferentes cabeçalhos para endereços IP
Limitação de taxa baseada em
Usar Redis para a lista de bloqueio
Configuração
Servidor Redis
Duração do bloqueio
Número de tentativas incorretas antes do bloqueio
95% de cobertura de código
Documentação completa
Capacidade de armazenar tentativas de login no banco de dados
Comando de gerenciamento para limpar a tabela de tentativas de login
Páginas de administração
Pode ser facilmente adaptado para método de autenticação personalizado.
Sinais são enviados ao bloquear nome de usuário ou IP
Páginas de Administração
.. 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
Baixe o código e execute a configuração de uma das seguintes maneiras, dependendo do método.
Para instalar a versão pronta para produção do PyPI:
.. code-block:: bash
pip install django-defender
Para instalar a versão de desenvolvimento a partir do código-fonte após o download:
.. code-block:: bash
python setup.py install
Para instalar a versão de desenvolvimento do branch master do repositório GitHub:
.. code-block:: bash
pip install -e git+http://github.com/kencochran django-defender.git#egg=django_defender-dev
Primeiro, você deve adicionar este projeto à sua lista de INSTALLED_APPS no settings.py
.. code-block:: python
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', # ... 'defender', # ... ]
Em seguida, instale o 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 você deseja gerenciar os usuários bloqueados através do admin do Django, adicione o seguinte ao seu urls.py
.. code-block:: python
urlpatterns = [ path('admin/defender/', include('defender.urls')), # admin do defender path('admin/', admin.site.urls), # admin normal # seus próprios padrões seguem... ]
Migrações
Você precisará criar tabelas no banco de dados que são necessárias para a operação.
.. code-block:: bash
python manage.py migrate defender
Comandos de gerenciamento
cleanup_django_defender
Se você tem um site com muito tráfego, a tabela AccessAttempts encherá rapidamente. Se você não precisa manter os dados para fins de auditoria, existe um comando de gerenciamento para ajudar a mantê-la limpa.
Ele olhará para sua configuração DEFENDER_ACCESS_ATTEMPT_EXPIRATION para determinar quais registros serão excluídos. O padrão, se não especificado, é 24 horas.
.. code-block:: bash
$ python manage.py cleanup_django_defender
Você pode configurar isso como uma tarefa cron diária ou semanal para manter o tamanho da tabela reduzido.
.. code-block:: bash
24 0 * * * /usr/bin/python manage.py cleanup_django_defender >> /var/log/django_defender_cleanup.log
Desempenho
O objetivo do defender é torná-lo o mais rápido possível para não atrasar o processo de login. Para garantir que nossas metas sejam alcançadas, precisamos de uma maneira de testar a aplicação para garantir que estamos no caminho certo. A melhor maneira de fazer isso é comparar a velocidade de um login normal do Django com defender e django-axes.
O login normal do Django seria nossa linha de base, e esperamos que seja o mais rápido dos 3 métodos, pois não há verificações adicionais.
O login com defender provavelmente será mais lento que o login do Django, e esperamos que seja mais rápido que o login com django-axes. O objetivo é que a diferença entre o login bruto regular e o defender seja a menor possível.
A velocidade do login com django-axes provavelmente será a mais lenta dos três, pois faz mais verificações e muitas consultas ao banco de dados.
A melhor maneira de determinar a velocidade de um login é fazer um teste de carga contra uma aplicação com cada configuração e comparar os tempos de login para cada tipo.
Teste de carga
Para garantir que cubramos todos os diferentes tipos de login, em nosso teste de carga precisamos ter mais de um teste.
#. Todos com sucesso: Faremos um teste de carga com apenas logins bem-sucedidos.