
로그인 무차별 대입 공격을 차단하는 간단하고 매우 빠른 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
로그인 시도를 무차별 대입(brute force)하는 사람들을 차단하는 간단한 Django 재사용 가능 앱입니다. 목표는 로그인 속도를 늦추지 않도록 최대한 빠르게 만드는 것입니다.
각 로그인 시도마다 데이터베이스를 확인하기 위해 데이터베이스에 접근하지 않아도 되도록 캐시를 사용합니다. 첫 번째 버전은 Redis를 기반으로 하지만, 사람들이 자신의 필요에 가장 잘 맞는 백엔드를 사용할 수 있도록 구성 가능하게 만드는 것이 목표입니다.
사이트에서 defender를 사용하고 있다면, 목록에 추가할 PR을 제출해 주세요.
문서는 Read the Docs에서 확인할 수 있습니다:
https://django-defender.readthedocs.io
모든 로그인 시도를 데이터베이스에 기록
IP 주소에 대해 다른 헤더를 사용하는 리버스 프록시 지원
다음 기준으로 속도 제한
블랙리스트에 Redis 사용
구성
Redis 서버
차단 기간
차단 전 허용되는 잘못된 시도 횟수
95% 코드 커버리지
완전한 문서
로그인 시도를 데이터베이스에 저장하는 기능
로그인 시도 데이터베이스 테이블을 정리하는 관리 명령어
관리자 페이지
사용자 정의 인증 방법에 쉽게 적용 가능
사용자 이름 또는 IP 차단 시 신호(signal) 전송
관리자 페이지
.. 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: 대체 태그
.. 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: 대체 태그
코드를 다운로드하고, 방법에 따라 다음 중 하나의 방식으로 setup을 실행합니다.
PyPI에서 프로덕션 준비 버전을 설치하려면:
.. code-block:: bash
pip install django-defender
소스 코드를 다운로드한 후 개발 버전을 설치하려면:
.. code-block:: bash
python setup.py install
GitHub 저장소에서 마스터 브랜치 개발 버전을 설치하려면:
.. code-block:: bash
pip install -e git+http://github.com/kencochran django-defender.git#egg=django_defender-dev
먼저, 이 프로젝트를 settings.py의 INSTALLED_APPS 목록에 추가해야 합니다.
.. code-block:: python
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', # ... 'defender', # ... ]
다음으로, 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
이를 매일 또는 매주 크론 작업으로 설정하여 테이블 크기를 줄일 수 있습니다.
.. 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 로그인 속도는 아마도 세 가지 중 가장 느릴 것입니다. 더 많은 검사를 수행하고 많은 데이터베이스 쿼리를 수행하기 때문입니다.
로그인 속도를 결정하는 가장 좋은 방법은 각 설정으로 애플리케이션에 부하 테스트를 수행하고 각 유형의 로그인 시간을 비교하는 것입니다.
부하 테스트
모든 유형의 로그인을 다루기 위해 부하 테스트에서 하나 이상의 테스트가 필요합니다.
#. 모두 성공: 성공적인 로그인만으로 부하 테스트를 수행합니다.
#. 혼합: 일부 성공, 일부 실패: 성공적인 로그인과 실패를 혼합하여 부하 테스트를 수행하여 실패가 성능에 미치는 영향을 확인합니다.
#. 모두 실패: 모든 로그인이 실패하는 부하 테스트를 수행하고 성능 차이를 확인합니다.
부하 테스트에 사용할 샘플 애플리케이션이 필요하며, 유일한 차이점은 defender, axes 또는 둘 다 로드하지 않는 구성입니다.
호스팅된 부하 테스트 서비스 또는 jmeter와 같은 도구를 사용할 수 있습니다. 어떤 방법을 사용하든 모든 테스트에 일관성을 유지해야 합니다. jmeter를 사용하는 경우, 다른 사람들이 자체 테스트를 실행할 수 있도록 jmeter 구성을 제공해야 합니다.
부하 테스트 결과
결과를 여기에 게시할 것입니다. 각 테스트를 설명하고, 결과를 차트와 함께 보여줄 것입니다.
django-axes는 훌륭하지만 모든 것을 데이터베이스에 저장하며, 데이터가 많을 때 병목 현상을 일으킵니다. 인증 요청을 200-300ms까지 느리게 만들 수 있습니다. 이는 일부 사이트에서는 크지 않을 수 있지만, 다른 사이트에서는 너무 깁니다.
이 프로젝트는 django-axes의 포크로 시작했으며, 가능한 한 많은 코드를 사용하고 필요하지 않은 부분을 제거하며 조회 속도를 높여 로그인 속도를 개선했습니다.
#. 누군가 로그인을 시도하면, 먼저 현재 차단되었는지 확인합니다. 사용하려는 사용자 이름과 IP 주소를 확인합니다. 차단된 경우 5단계로 이동합니다. 차단되지 않은 경우 2단계로 이동합니다.
#. 차단되지 않았으므로 로그인이 유효한지 확인합니다. 유효하면 6단계로 이동합니다. 유효하지 않으면 3단계로 이동합니다.
#. 로그인 시도가 유효하지 않습니다. 이 시도의 사용자 이름과 IP 주소를 캐시에 추가합니다. 이로 인해 한도를 초과하면 차단 목록에 추가한 후 5단계로 이동합니다. 한도를 초과하지 않으면 4단계로 이동합니다.
#. 로그인이 유효하지 않지만 한도를 초과하지 않았습니다. 다시 시도할 수 있도록 로그인 화면으로 되돌려 보냅니다.
#. 사용자가 차단되었습니다: 차단 페이지로 보내 사용자가 차단되었음을 알리고 차단이 해제될 예상 시간을 알려줍니다.
#. 로그인이 유효합니다. 실패한 로그인 시도를 재설정하고 목적지로 전달합니다.
Defender는 실패한 시도를 저장하기 위해 캐시를 사용합니다.
캐시 키
카운터:
부울 (존재하면 차단됨):
django-defender를 약간 사용자 정의할 수 있는 몇 가지 옵션이 있습니다. 이들은 settings.py 파일에 정의되어야 합니다.