Djangoのブルートフォースアタック対策
こんにちは!縁紡ぐです。
アプリを作る時、特にWebアプリのようにインターネットでだれでもアクセスできる場合に、セキュリティ上大切な対策があります。
何かわかりますか?
それはIDとパスをたくさん使って総当たりする、『ブルートフォースアタック(総当たり攻撃)』への対策です。要するに、IDやパスワードを無作為に作成して、ログインを試みる攻撃です。
対策として、何回間違えたら、接続元IPアドレスやIDなどによって、「5分間ログイン試行停止」
「アカウントロックする」
いう機能が必要です。
Djangoでは、django-axesというライブラリがあり、MITライセンスで利用可能という、とても嬉しいライブラリーです。
django-axesをインストールして設定する
ライブラリを使うと本当に実装するのに時間が短縮できるので、開発者もユーザー側もハッピーになるので利用しないなんてことは選択肢にありません👍
インストール
それでは、さっそくインストールして実装していきましょう😀
pip install django-axes
たっとこれだけでインストールは完了です。
次は設定をしていきます。
settings.py のINSTALLED_AAPSに追加
設定ファイルの、インストールアプリに追加します。
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'axes' # django-axesの設定 #追加 ]
settings.py のAUTHENTICATION_BACKENDSに追加
設定ファイルのAUTHENTICATION_BACKENDSに、axes.bakends.AxesModeBackendを先頭に追加する。
AUTHENTICATION_BACKENDS = [ 'axes.backends.AxesBackend', # 先頭に追加必要 'django.contrib.auth.backends.ModelBackend', ]
settings.py のMIDDLEWAREに追加
設定ファイルのMIDDLEWAREに、’axes.middleware.AxesMiddleware’を追加する
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'axes.middleware.AxesMiddleware', # 追加 ]
settings.py にaxesの項目設定追加
設定ファイルに、各使用する項目を追加します。
様々な設定ができますので、リンク先を参照して必要な設定を追加してください。
Herokuで本番環境を作る場合、ヘッダーを変更する必要があります。
# アクセス制限 # パスワード試行回数 AXES_FAILURE_LIMIT = 3 # 失敗履歴のクリア時間 AXES_COOLOFF_TIME = 5 # ユーザーが失敗したIPアドレスで制限 AXES_LOCK_OUT_BY_COMBINATION_USER_AND_IP = True # ユーザーに対するロック AXES_ONLY_USER_FAILURES = True # ログイン成功での試行履歴削除 AXES_RESET_ON_SUCCESS = True # usernameとして指定 AXES_USERNAME_CALLABLE = "utils.axes.get_username" # Heroku用 AXES_META_PRECEDENCE_ORDER = ( 'HTTP_X_FORWARDED_FOR', )
マイグレ実施
これで準備ができましたので、マイグレをするとaxes用のテーブルが作成されます。
python manage.py migrate
管理サイトに入ると管理するためのテーブルが作成されています。
認証が失敗すると、Access failures に書き込まれていいきます。
コメント