💬

Redmine ログイン失敗を繰り返すとアカウントをロックアウトにする機能について

に公開
2026/01/03

はじめに

この記事は、Redmine Advent Calendar 2025の12/22の記事として公開いたします。前回につづき、1日遅れすみません😅

会社のセキュリティガイドラインで、「ログイン失敗を複数回繰り返すとアカウントロックするしくみを有すること」という項目があり、Redmineの標準ではそんな機能ないなーとおもって調査していたところ、Redmine Login Attempts Limit のプラグインを見つけましたので紹介いたします。

なお、ちょうどこの調査をしていたところ、taikiiさんにより、Redmine ログイン失敗でユーザをロックするプラグイン作った話という記事が紹介され、私のニーズに非常に近いのでは、とおもったのですが、残念ながらtaikiiさんのプラグインでは期待の動作になりませんでした。理由は後述します。

このプラグインは、midnightSuyama版がオリジナルで、RegioHelden版を経て現在の xmera-circle版へフォークされています。(関連リンク)

そもそもこの機能が必要になる背景

冒頭に書いた通り、「会社のセキュリティガイドラインに従わないといけないから」なのですが、それがなぜ必要かを紐解いてみると、ログイン試行を何度やってもアカウントがロックアウトしなければ、悪意ある攻撃者がそのサイトに何度でもログイン試行をできてしまうわけです。そうすると、総当たりや辞書アタックなどで容易にユーザ認証を突破されるアカウントがでてしまう可能性があり、セキュリティ的に脆弱な状態になってしまいます。

このような脆弱性に対処するために、最近のRedmineには標準で2FAを有効にすることができます。2FAが有効になっていれば、攻撃されたとしても、容易に認証を突破できないと考えられます。
しかし、ガイドラインというしろものは面倒なもので、本質的には2FAで解決できるとしても、「ログイン失敗を複数回繰り返すとアカウントロックするしくみを有すること」という項目の回答にはならないのです。(説明すれば通るかもしれないのですがw)

使い方

プラグインの設定画面で、ロックまでの試行回数、ブロックされる時間(分)、管理者にメールするかどうかを設定することができます。また、プラグインの設定画面でロックを解除することができます。ロックする動作は登録されたユーザIDのみで、登録されていないユーザに対してはロックはされません。
LoginAttemptsLimit

詳細は xmera-circle のドキュメントをご確認ください。(関連リンク)

公開されていたプラグインの問題点と対策

Redmine5や6で動くか?問題

midnightSuyama版はテスト環境で実行してみたところ、Redmine5/6両方で一応動きます。

また、xmera-circle版は、Redmine 5では動作しますが、Redmine 6では xmera-circle 版で Passenger がエラーになり動作しませんでした。xmera-circle 版が依存している Advanced Plugin Helper が Redmine 6 に対応していないようです。幸い、kid2407により、Advanced Plugin HelperのRedmine 6対応フォークがでていましたので、そちらで動作するか確認してみたら、テスト環境ではちゃんと動きました。

どこにロック情報を記録するか(複数ワーカ対応)問題

midnightSuyama版の実際のコードの実装を確認したところ、ロック情報をクラス変数に保持しているだけでした。この実装だと、ロックはプロセス内のメモリ空間にのみ保存されることになり、複数ワーカープロセスで実行されているような場合はロック動作が安定しないため本番適用するには不十分です。(元記事では、Rails.cacheに保持している、と書いておりましたが、事実確認の結果、AIが嘘をついていたことが判明しました。)

xmera-circle版はInvalidAccountというクラスを作成してロック情報をもたせていました。midnightSuyama版もxmera-circle版も、DBを使わないシンプルな設計ですが、プロセス内メモリにロック情報を保持している点では同じです。そのため、Passengerで複数ワーカー動作させるなど、プロセスが複数起動されるような環境では、ロックが正常に働かない、という問題があります。この点を改善するためには、プロセスを跨って共有できる領域にロック情報を保持する必要があります。

問題点の対策について

Redmine 6に対応するためには、現時点ではxmera-circleのAdvanced Plugin Helperではなく、kid2407によりフォークされたAdvanced Plugin Helperを使用することで動作させることができます。

複数ワーカ対応問題については、midnightSuyama版もxmera-circle版も対応していなかったため、xmera-circle版をフォークして、Rails.cacheにロック情報を記録できるように私が改造しました。(以下、「私の改造版」と呼ばせていただきます)
ただし、RedmineのデフォルトのRails.cacheはメモリストアになっているため、単純にRails.cacheにしてもうまくいきません。redisをインストールして起動し、Rails.cacheをRedisCacheStoreが使われるようにconfigを設定する必要があります。
(詳細は私の改造版のGithubページを参照してください。)

確認結果の整理

整理すると、以下のようになります。

プラグイン テスト環境 (5/6) 本番運用推奨 備考
midnightSuyama版 〇 / 〇 非推奨 プロセスメモリにロック保持(複数ワーカ非対応)
xmera-circle版+公式APH 〇 / × 非推奨 Redmine6でAPHが未対応 → Passengerエラー
xmera-circle版+kid2407版APH 〇 / 〇 非推奨 プロセスメモリにロック保持(複数ワーカ非対応)/kid2407版のAPHで動作確認
私の改造版(Redis対応)+kid2407版APH 〇 / 〇 推奨(設定要) RedisCacheStoreを利用して複数ワーカに対応/kid2407版のAPHで動作確認

APH: Advanced Plugin Helper

(試した環境)

taikiiさんのプラグインについて

taikiiさんのプラグインも動作確認し、Redmine 6でも動作することを確認しました。「ログイン失敗を複数回繰り返すとアカウントロックするしくみを有すること」という要件だけであればOKです。しかし、このプラグインは、アカウントロック=Redmineのユーザをロックステータスにする、という動きになります。
この動きだと、IDがわかっているユーザに対するログイン失敗を意図的に行うことで、(ご本人も書かれていますが)そのユーザを使えなくする、という攻撃ができてしまいます。このような攻撃のたびに管理者が手動で有効化しなければならないと、運用上の負担がかかってしまいます。
その点、Redmine Login Attempts Limitだと、ログイン失敗後、一定時間経過すると、ロック状態が解除されます。そのため、総当たりなどの攻撃をされても自動的にログイン可能状態に戻るため、運用負担なしに攻撃に対する耐性をもたせることができます。
(逆にいえば、ログイン失敗を繰り返せばアカウントロックの状態まで変えたい、という場合は、Redmine Login Attempts Limitではなくtaikiiさんのプラグインを使えばよい、ということです)

まとめ

「ログイン失敗を複数回繰り返すとアカウントロックするしくみを有すること」という観点では、Redmine Login Attempts Limit は Redmine 5 ではそのまま動作しますが、Redmine 6 では条件付きでの動作となります。具体的には、xmera-circle 公式の Advanced Plugin Helper を用いると Redmine 6 上で Passenger エラーが発生するため、kid2407 の APH フォークを使うか、本記事で紹介した私の改造版(Redis を利用する設定)と組み合わせることで Redmine 6 上でも動作することを確認しました。本番で複数ワーカを起動する環境で使う場合は、私の改造版(Github参照)を検討してください。
なお、よりセキュリティを確保しなければならない場合は2FAを有効化する運用と併用することがよいとおもいます。
2FAまでいれると運用周知が面倒だけど、ある程度はセキュリティ対策もしたい、といった場合にこのプラグインを使ってみてはいかがでしょうか。

参考情報

関連リンク

試した環境

  • RedMica 3.2.4.stable (based on Redmine 6.0.6.devel)
  • Redmine 5.1.3.stable
GitHubで編集を提案

Discussion