Keycloakのサポート対応事例
Keycloakのアカウントが意図せずロックされる問題を解消
このページでは、Keycloakのアカウントロックについての問い合わせに対して、どのようなサポートをしたかを紹介します。
この問い合わせは、ブルートフォース攻撃の対策のためにKeycloakのブルートフォース検知機能を有効にしたところ、アカウントが意図せずロックされることが度々があったため、なぜこのようなことが起きるのかを教えて欲しいというものでした。 ブルートフォース検知機能は管理コンソールの「Realm Settings」の「Security Defenses」の「Brute Force Detection」タブから 設定ができます。

使用しているKeycloakのバージョンは4.8.3でした。
問い合わせの内容などをもとにKeycloakの動作確認をしてみると、どうもログインボタンを二度押しするとアカウントがロックされるようです。 しかし、ログインボタンをクリックすると、レスポンスが返ってくるまでの間、ボタンのプロテクトがかかり、 二度押しを防止する対策はできているように見えます(以下のようにボタンをクリックした直後は色が変わり、 クリックしてもリクエストは送信されていません)。

さらに動作検証してみると、ログインボタンをクリックし、レスポンスが返ってきてすぐにログインボタンをクリックすると (パスワードを入力せずすぐに)、アカウントが一時的にロックされることが分かりました。このような操作を、 ユーザーが意図的に行うことはありませんが、誤ってボタンをクリックしてしまうことは十分にありえます。
このようなKeycloakの動作はユーザーにとっては好ましいものではありません。 ユーザーはアカウントがロックされたことに気づかないまま、正しいパスワードでのログインに失敗し続けることになるでしょう。 ユーザーは混乱してしまいます。そして、パスワードが間違っていると判断し、本来必要のないパスワードのリセットを行うことにもなります。
しかし、なぜこのような誤操作でアカウントがロックされてしまうのでしょうか? Keycloakのブルートフォース検知機能のうち以下の2つの設定が影響していました。
- Quick Login Check Milli Seconds
前回のログイン失敗からこの時間経過せずにログインを行うと一時的にアカウントをロックする。デフォルトは1000ミリ秒。 - Minimum Quick Login Wait
Quick Login Check Milli Secondsより早いログイン試行があった場合の、一時的にアカウントをロックする時間。デフォルトは1分。
つまり、1秒以内にログインが2回失敗すると、アカウントは1分間ロックされてしまうことになります。
Keycloakのドキュメントに記載されている通りの動作ではあるのですが、ユーザーの利便性にとってよくありません。 ひとまず顧客への暫定対応として「Quick Login Check Milli Seconds」を短くすることを提案し、 根本対策のためにKeycloakの課題管理システムへのバグ報告(改善案の提示)とその修正のプルリクエストをすることを検討しました。
ではどのようにこの問題を改善すればいいのでしょうか?「Quick Login Check」自体を無くしてしまえばいいのでしょうか? しかし、短時間に連続でログインリクエストを送信するブルートフォース攻撃の対策のためには残しておいた方がいいでしょう。
少し考えてみると、結論は単純でした。今回の問題はパスワードを入力する間もなく短時間にログインリクエストを送信している場合の問題ですが、 そもそもブルートフォース攻撃は様々なパスワードを試行するので、パスワードが未入力のリクエストを何度も送信してくることを防御する必要はないはずです (認証成功するはずがログイン試行を攻撃者はしないので)。
ということで、パスワードが未入力のログインリクエストはブルートフォース検知の処理を行う前に入力エラーにしてしまうことにしました。 その後、プルリクエストを行い、無事マージされました。