Djangoにはデフォルトでユーザ管理の仕組みが搭載されており、簡単にユーザ認証機能を搭載することができます。しかし、デフォルトのユーザ認証機能は最低限の機能しか実装されていません。
この記事では、Djangoのユーザ認証機能に「django-axes」というライブラリを使って、ログイン試行回数制限を追加する方法を紹介します。
なお、私の環境は以下です。
- Python: 3.8 (2020/3/22 時点の最新)
- Django: 3.0.4 (2020/3/22 時点の最新)
- django-axes: 5.3.1(2020/5/2 時点の最新)
目次
ログイン試行回数制限とは?
ログイン試行回数制限とは、ログインに何回か失敗したらログインできなくなる機能です。これを実装することで、Webアプリに不正にログインしようとする悪い人たちから、自分のWebアプリを守ることができます。(ブルートフォース攻撃やパスワードリスト攻撃、辞書攻撃などの対策になります。)
ログイン試行回数制限を「django-axes」で実装する
では早速、Djangoのユーザ認証機能にログイン試行回数制限を実装することができる「django-axes」を導入する方法をまとめます。
「django-axes」をインストールする
以下のコマンドで「django-axes」をインストールします。
$ pip install django-axes
Djangoの設定ファイルを変更する
「django-axes」をDjangoに実装するために、Djangoの設定ファイル(settings.py)を編集します。
【settings.py】
INSTALLED_APPS = [
# その他のAPPSは省略
'axes', # ←これを追加
]
MIDDLEWARE = [
# その他のMIDDLEWAREは省略
'axes.middleware.AxesMiddleware', # ←これを追加
]
AUTHENTICATION_BACKENDS = [
'axes.backends.AxesBackend', # ←これを追加
'django.contrib.auth.backends.ModelBackend',
]
INSTALLED_APPS
とMIDDLEWARE
にaxes
関連の情報を追加します。AUTHENTICATION_BACKENDS
の「django.contrib.auth.backends.ModelBackend
」よりも前に「axes.backends.AxesBackend
」を追加します。- もし、
AUTHENTICATION_BACKENDS
がなかったら、上記の内容のまま追加してください。
マイグレーションを実行する
Djangoのmanage.py
があるディレクトリに移動して、以下のコマンドでマイグレーションを実行します。
これにより「django-axes」で使用するDBのテーブル(axes_accessattempt
とaxes_axxesslog
)が出来上がります。
$ python manage.py migrate
動作を確認してみる
ログインを何回か失敗してみて本当にアカウントがロックされるか確認してみます。
まずはじめに、ユーザ認証機能を使えるようにしよう
「django-axes」でアカウントがロックされる動作を確認するうえで、Djangoのユーザ認証機能を実装する必要があります。
以下の記事にユーザ認証機能の実装方法をまとめたので参考にしてください。
わざとログインを失敗してみる
サーバを立ち上げて、3回ログインを失敗すると以下のような警告が出て、アカウントロックされるはずです!
それ以降、何度ログイン画面にアクセスしても、警告画面に移動するはずです。
ちなみに、「Account locked: too many login attempts. Contact an admin to unlock your account.」という警告画面の表示については変更することができます。
詳しくは「「django-axes」でその他にできること」を参考にしてください。
ロックされたアカウントを解除するには?
デフォルトの設定ではアカウントロックされたら手動でロック解除する必要があります。
解除方法は大きく3通りあります。
- Djangoの管理サイト(自分のサイトURL/admin)から解除
- コマンドによる解除
- 「django-axes」のAPIを使って解除
ここでは2番目の「コマンドによる解除」の方法を紹介します。
※その他の方法は、本家のサイト「django-axes 3. Usage」を確認ください。
コマンドによるアカウントロックを解除する
Djangoのmanage.py
があるディレクトリに移動して、以下のコマンドでアカウントロックを解除することができます。
# すべてのアカウントロックを解除
$ python manage.py axes_reset
# IPアドレスを指定してアカウントロックを解除
$ python manage.py axes_reset_ip [ip ...]
# ユーザ名を指定してアカウントロックを解除
$ python manage.py axes_reset_username [username ...]
# 日数を指定してそれより古いアカウントロックを解除
$ python manage.py axes_reset_logs (age)
「django-axes」でその他にできること
「django-axes」のデフォルトの設定では以下のような動作となっています。
【django-axesのデフォルト設定】
- ログイン試行回数は3回
- 一度アカウントロックされると手動でロック解除が必要(時間によって自動でロック解除はされない)
- アカウントロックは接続元PCのIPアドレスによって判断される
- アカウントロックされたときに表示される画面は上記の画像のように「Account locked: too many login attempts. Contact an admin to unlock your account.」となる。
「django-axes」の設定を変更することで、以下のようなことができます。
- ログイン試行回数を変更
- 自動でロックが解除される時間を設定
- ユーザ名によってアカウントロック判断する
- アカウントロックされたときに表示される画像を変更
- ログインに成功したら失敗回数をリセット
- リバースプロキシを使った場合でも利用できるようにする
詳しくは、以下のブログでまとめたので、よろしければご覧になってください。
関連情報
Djangoのユーザ認証機能の実装方法を以下にまとめました。よろしければ、ご覧になってください。
自分は、DjangoをConoHa VPS上のDockerコンテナ上に構築しています。構築方法や挑戦したことなどを以下のブログにまとめたので、よろしければご覧になってください。
参考
広告
Djangoをやるなら以下の書籍がオススメです。
DjangoでWebアプリを開発するときの要点が分かりやすくまとめられています。
以上!
コメント