Redmine ログイン失敗でユーザをロックするプラグイン作った話
この記事は Redmine Advent Calendar 2025 18日目です。
色々あって、指定回数ログインに失敗した場合に対象ユーザをロックするプラグインを作りました。
まず最初に、READMEにも書いていますが、これはユーザアカウントをロックする攻撃に使用することができてしまいます。このプラグインを導入する前にOAuth2や2FAの導入を検討してください。
Redmine User Lockout plugin https://github.com/taikii/redmine_user_lockout
経緯
ログイン失敗でロックしたり指定時間ログインできなくするプラグインはすでにあるのですが、いかんせんこれらは古く、最新の 6.1 だとうまいこと動きませんでした。
- https://github.com/maeda-m/redmine_account_lockable
- https://github.com/yamachi4416/redmine_account_lockout
もうアーカイブされちゃってたりするし、これを修正するより作っちゃったほうが手っ取り早そうだなと思い、一から作ることにしました。
方針
- DBのカスタマイズは行わない。ログイン失敗回数はユーザカスタムフィールドを作ってそこに保存することでDBのカスタマイズを不要にする。
- カスタムフィールドは自動で作る。
- パッチでRedmine本体のコードをゴリゴリ修正するのはやりたくない。
- ログイン成功時のコントローラフックポイント
controller_account_success_authentication_afterはあるが、残念ながらログイン失敗時のものはない。 - パッチでは
AccountController:invalid_credentialsに独自のログイン失敗時のフックポイントcontroller_account_failed_authentication_afterを生やすだけにして、生やしたフック先でゴリゴリやる。
- ログイン成功時のコントローラフックポイント
- 指定回数失敗したらユーザアカウントはロックする。ロック解除は管理者の役目でいい。
- ロックしたら対象者にメール通知する。(2025/12/18時点ではメール飛ぶかまだ確認してない。実は。)
- ログインに成功したら
controller_account_success_authentication_afterでカウンタのリセットをする。これによって「連続してログインに失敗したら」を実現する。 - 2FAとOAuth2は一旦見ないことにする。多分動くんじゃないかな。
- プラグインの設定画面でログイン失敗しきい値を変更できるようにする。
- プラグインの設定画面で管理用のカスタムフィールドの変更ができるようにする。
感想
Redmine本体への影響を必要最小限に抑える形で実現できたんじゃないかと思います。
最初にも書いていますが、こんなの使わずにさっさとOAuth2や2FAを導入したほうがいいです。それでも誰かが求めているかもしれないので公開してみます。