
Простое сверхбыстрое переиспользуемое приложение Django, которое блокирует попытки брутфорса входа.
.. 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: Поддерживаемые версии Python :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: Поддерживаемые версии Django
.. 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: Покрытие
.. image:: https://readthedocs.org/projects/django-defender/badge/?version=latest :alt: Статус документации :target: https://django-defender.readthedocs.io/en/latest/?badge=latest
Простое переиспользуемое Django-приложение, которое блокирует попытки подбора пароля (brute force). Цель — сделать его максимально быстрым, чтобы не замедлять процесс входа.
Мы будем использовать кеш, чтобы не обращаться к базе данных при каждой проверке попытки входа. Первая версия основана на Redis, но цель — сделать это настраиваемым, чтобы каждый мог использовать тот бэкенд, который лучше всего подходит для его задач.
Если вы используете defender на своём сайте, отправьте PR, чтобы добавить его в список.
Документация доступна на Read the Docs:
https://django-defender.readthedocs.io
Логирование всех попыток входа в базу данных
Поддержка обратных прокси с различными заголовками для IP-адресов
Ограничение скорости на основе
Использование Redis для чёрного списка
Конфигурация
Redis сервер
Время блокировки
Количество неверных попыток до блокировки
95% покрытие кода
Полная документация
Возможность сохранять попытки входа в базу данных
Команда управления для очистки таблицы попыток входа
Страницы администрирования
Легко адаптируется под кастомные методы аутентификации.
При блокировке имени пользователя или IP отправляются сигналы (signals)
Страницы администрирования
.. 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
Скачайте код и запустите setup одним из следующих способов.
Чтобы установить готовую к использованию версию из PyPI:
.. code-block:: bash
pip install django-defender
Чтобы установить версию для разработки из исходного кода после загрузки:
.. code-block:: bash
python setup.py install
Чтобы установить версию для разработки из ветки master из репозитория GitHub:
.. code-block:: bash
pip install -e git+http://github.com/kencochran django-defender.git#egg=django_defender-dev
Прежде всего, необходимо добавить этот проект в список INSTALLED_APPS в
settings.py
.. code-block:: python
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', # ... 'defender', # ... ]
Затем установите middleware FailedLoginMiddleware
.. code-block:: python
MIDDLEWARE_CLASSES = [ 'django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'defender.middleware.FailedLoginMiddleware', ]
Если вы хотите управлять заблокированными пользователями через админку Django, добавьте
следующее в ваш urls.py
.. code-block:: python
urlpatterns = [ path('admin/defender/', include('defender.urls')), # админка defender path('admin/', admin.site.urls), # обычная админка # ваши собственные шаблоны далее... ]
Миграции
Вам потребуется создать таблицы в базе данных, необходимые для работы.
.. code-block:: bash
python manage.py migrate defender
Команды управления
cleanup_django_defender
Если у вас сайт с высокой посещаемостью, таблица AccessAttempts будет заполняться довольно быстро. Если вам не нужно хранить данные для аудита, существует команда управления, которая поможет поддерживать её в чистоте.
Она будет проверять вашу настройку DEFENDER_ACCESS_ATTEMPT_EXPIRATION, чтобы определить,
какие записи будут удалены. По умолчанию, если не указано, — 24 часа.
.. code-block:: bash
$ python manage.py cleanup_django_defender
Вы можете настроить это как ежедневную или еженедельную задачу cron, чтобы уменьшить размер таблицы.
.. code-block:: bash
24 0 * * * /usr/bin/python manage.py cleanup_django_defender >> /var/log/django_defender_cleanup.log
Производительность
Цель defender — сделать его максимально быстрым, чтобы он не замедлял процесс входа. Чтобы убедиться, что мы достигаем наших целей, нам нужен способ тестирования приложения. Лучший способ — сравнить скорость обычного входа в Django с defender и django-axes.
Обычный вход в Django — это наш базовый уровень, и мы ожидаем, что он будет самым быстрым из трёх методов, поскольку не выполняется никаких дополнительных проверок.
Вход с defender, скорее всего, будет медленнее, чем вход в Django, и, надеемся, быстрее, чем вход с django-axes. Цель — сделать разницу между обычным входом и defender как можно меньше.
Скорость входа с django-axes, вероятно, будет самой медленной из трёх, поскольку выполняется больше проверок и много запросов к базе данных.
Лучший способ определить скорость входа — провести нагрузочное тестирование приложения с каждой конфигурацией и сравнить время входа для каждого типа.
Нагрузочное тестирование
Чтобы убедиться, что мы охватываем все различные типы входов, в нашем нагрузочном тесте нам нужно больше одного теста.
#. Все успешные: Load-тест только с успешными входами.
#. Смешанные: часть успешных, часть неудачных: Load-тест с некоторыми успешными и некоторыми неудачными входами, чтобы увидеть, как неудачи влияют на производительность.
#. Все неудачные: Load-тест со всеми неудачными входами и посмотреть разницу в производительности.