Django

Djangoログイン試行回数制限を追加『django-axes』

ログイン試行回数を入れることは、ブルートフォースアタック(総当たり攻撃)を防ぐことでも必要な対策です。

公式サイトはこちらです。

ログイン試行回数制限を入れるとどうなるの?

ログインを何度も試みて突破しようとすることも考えられます。なので、一般的には、3~5回間違えると攻撃がされていると考えて、一時的にアカウントロックするか管理者で解除するまでアカウントロックをします。

ログインを一定回数、失敗します。そうすると、アカウントロックをしたことのメッセージを表示します。

メッセージは、変更することができるので日本語の表示に変更することも可能です。

『django-axes』を実装する手順

まずは、ライブラリをインストールします。

pip install django-axes

これで、ライブラリがインストールできます。

Settings.py ファイルを編集する

ライブラリは入ったので、settingsファイルを編集していきます。

まずは、アプリに追加します。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'accounts',
    'axes',#ログイン回数制限追加

次は、ミドルウェアに追加をします。

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'global_login_required.GlobalLoginRequiredMiddleware',
    'django_currentuser.middleware.ThreadLocalUserMiddleware',
    'axes.middleware.AxesMiddleware',#ログイン回数制限追加
]

あとは、追加記述です。

#ログイン回数制限用追加
AUTHENTICATION_BACKENDS = [
    'axes.backends.AxesBackend',
    'django.contrib.auth.backends.ModelBackend',
]

たったこれだけで、準備というか設定は完了です。

本当に、ライブラリを作ってくれて人には感謝感謝です!

マイグレーションを実行

マイグレーションすると、『django-axes』が使うテーブルが作成されます。

python manage.py migrate

こんなテーブルができます。

ロックを解除する方法

ロックをされている状態をまず確認するには、Access attemptsをクリックします。

右の方にログインを試みたUSERNAMEと失敗回数が記載されています。

これを削除することでアカウントロックは解除されます。

カスタマイズについて

Djangoのsettings.pyファイルに名称を指定することでカスタマイズをすることができます。

内容名称デフォルト値
試行回数制限値AXES_FAILURE_LIMIT3
IPアドレスでの制限AXES_LOCK_OUT_AT_FAILURETRUE
失敗履歴のクリア時間AXES_COOLOFF_TIMENone
管理者サイトのみ有効AXES_ONLY_ADMIN_SITEFALSE
ユーザーに対するロック制限AXES_ONLY_USER_FAILURESFALSE
管理画面への表示有無AXES_ENABLE_ADMINTRUE
ユーザーが失敗したIPアドレスで制限AXES_LOCK_OUT_BY_COMBINATION_USER_AND_IPFALSE
IPまたはユーザー名の試行制限を超えた場合ログイン拒否AXES_LOCK_OUT_BY_USER_OR_IPFALSE
IPアドレスとユーザーごとのロック制限AXES_USE_USER_AGENTFALSE
ロックアウト時にリダイレクトするURLAXES_LOCKOUT_URLNone
IPアドレスホワイトAXES_NEVER_LOCKOUT_WHITELISTNone
IPアドレスブラックリストAXES_IP_BLACKLISTNone
ログイン成功で試行履歴を削除AXES_RESET_ON_SUCCESSFlase

いくつかよく使う設定をしたサンプルです。

AXES_FAILURE_LIMIT  = 5 #ログイン試行回数制限
AXES_ONLY_USER_FAILURES = True #ログインID名で試行回数を判断
AXES_RESET_ON_SUCCESS = True #ログイン成功で失敗試行をリセット

-Django

© 2021 ごろう@縁紡ぐ