Fessのログイン試行制限で、正常なログインが同じIPアドレスの失敗履歴まで消してしまう動作を修正しました。複数のアカウントに対する失敗を、1つの有効なアカウントへのログインで繰り返しリセットできていた問題への対応です。
対象となるログイン
対象はPOST /api/v2/auth/loginと、SPNEGOプラグインのBasicフォールバックです。成功時には「IPとユーザー名」の履歴をクリアしますが、IP全体ではその成功したリクエスト1件分だけを戻します。同じIPから別ユーザー名で行った失敗は残ります。すでに有効なロックアウトを解除・短縮する変更ではありません。
設定の初期値
修正を確認した本体開発版のfess_config.propertiesでは、次の設定です。
| 設定 | 初期値 |
|---|---|
theme.api.login.rate.limit.per.ip.per.minute | 10 |
theme.api.login.rate.limit.per.user.per.minute | 5 |
theme.api.login.lockout.seconds | 900 |
theme.api.login.rate.limit.max.entries | 100000 |
IP単位の制限は0以下で無効、ロックアウト時間も0以下で無効です。「ユーザー単位」はIPとユーザー名の組み合わせであり、全IPにまたがるユーザー全体の集計ではありません。検索リクエスト全般のrate.limit.*とは別の設定です。
更新時に確認すること
SPNEGO側の変更は本体のLoginRateLimiter#releaseに依存します。本体に修正がない状態でプラグインだけを取り込む組み合わせは使えません。
NATやリバースプロキシ配下では複数ユーザーの試行が同じIPとして数えられることがあります。成功したログインでも他ユーザーの失敗履歴が残るため、利用人数とクライアントIPの認識を確認し、閾値を調整してください。制限はメモリ内の処理であり、複数Fessインスタンス間で共有する仕組みを追加する変更ではありません。