KeycloakのAuthentication Flowは、Required/Alternative/Conditional/Disabledという実行要件の組み合わせで挙動が決まります。この評価規則を正確に押さえれば、条件付きMFAもブラウザフローのカスタマイズも怖くありません。現場で頻発する誤設定と併せて、一次情報をたどりながら整理します。

Keycloakを本番投入すると、多くのチームが最初につまずくのがAuthentication Flow(認証フロー)です。「MFAを管理者だけに強制したい」「特定のクライアントだけ多要素にしたい」といった要件を、GUIのRequirementラジオボタンだけで実現しようとして、意図しない挙動に悩む——という場面を私たちも何度も見てきました。本記事では、フローの評価規則を一次情報に沿って正確に押さえ、条件付きMFAとブラウザフローのカスタマイズ、そして頻発する誤設定を実務目線で整理します。バージョンは現行のQuarkus版(新しめのリリース)を前提としますが、細部は公式ドキュメントで必ずご確認ください。

01フローとサブフロー、実行(Execution)という3階層

Keycloakの認証フローは、上から順に評価される実行(Execution)の並びです。1つの実行は「Cookie検証」「ユーザー名+パスワードのForm」「OTP Form」といった認証処理(Authenticator)か、もしくはサブフロー(Sub-flow)を指します。サブフローはフローの入れ子であり、それ自体が1つの実行として親フローの中で評価されます。

ここで最初に理解すべきは、評価が上から下へ順次(top-to-bottom)進むという点です。各実行にはRequirement(実行の要件)が設定され、この要件の組み合わせで「どこまで実行するか」「成功と見なすか」が決まります。標準のブラウザフローは、トップレベルにCookie、Identity Provider Redirector、Kerberos、そしてFormsサブフローが並ぶ構造になっており、この設計を読み解くことが理解の近道です。

現場のコツ:フローを触る前に、必ず標準の「browser」フローを複製(Duplicate)してから編集してください。組み込みフローは直接編集できず、また複製元を残しておくと「素の状態」との差分がレビューしやすくなります。

02Required / Alternative / Conditional / Disabled の意味

実行の要件は4種類です。それぞれの評価規則を正確に押さえます。

混同しやすいのが「同じ階層にRequiredとAlternativeが混在するとどうなるか」です。公式の評価規則では、ある階層にRequiredが1つでも存在すると、その階層のAlternativeは事実上無視されます。Requiredが階層の成否を支配するためです。だからこそ、代替経路(パスワード or パスキー など)を作りたいときは、必ずAlternativeなサブフローで包む——という設計が定石になります。詳細はServer Administration Guideの認証フローの章に整理されています。

標準ブラウザフロー(既定のトップレベル要件) Cookie Alternative IdP Redirector Alternative Kerberos Disabled(既定) Forms(サブフロー) Alternative Username/Password (Required) MFAサブフロー (Conditional) Cookieが成功すれば 以降のAlternativeは 評価されない (いずれか1つで成功) サブフロー内はRequired。 Conditionが真のときだけ MFAが実質Required化
図:標準ブラウザフローの階層とAlternative/Conditionalの評価イメージ

03条件付きMFA — Conditionalサブフローの組み立て方

「管理者ロールを持つユーザーだけOTPを必須にする」——エンタープライズで最も多い要件です。これは次の構造で実現します。

これで、adminロールを持つユーザーだけOTPが実質Requiredとなり、それ以外のユーザーはサブフロー全体がDisabled扱いでスキップされます。条件を複数入れると、Required条件はすべて満たす必要があります(AND)。この「複数条件AND」は、たとえば「adminロールを持ち、かつOTPを設定済み」という組み合わせに有効です。

現場のコツ:User Role条件だけで組むと、「adminなのにOTP未登録」のユーザーはログイン時にOTP設定を強制されます。これを避けたい場合は組み込みのCondition - user configured(同じサブフロー内のRequired認証器が設定済みのユーザーだけそのサブフローを実行する)を併用するか、逆に未登録者を弾く運用に倒すか、要件を明確にしてから設計してください。ここは組織のポリシー判断そのものです。

04ステップアップ認証 — LoAとACRで強度を制御する

もう一段マニアックな要件がステップアップ認証です。通常はパスワードのみ、機密操作のときだけMFAを追加要求する——というものです。KeycloakはこれをLoA(Level of Authentication)という数値で扱います。

レルムの設定でACR(Authentication Context Class Reference)をLoAにマッピングします。ACRは任意の文字列、LoAは数値です(例:silver→1、gold→2)。Conditionalサブフローの中にCondition - Level of Authenticationを置き、目標LoAを指定すると、そのLoAにまだ達していないときだけ追加認証を走らせられます。クライアントはOIDCリクエストのacr_valuesclaimsパラメータで必要なACRを要求し、発行されるトークンのacrクレームで達成レベルを確認できます。

新しめのバージョンでは、クライアント単位でMinimum ACR valueを強制する設定や、Condition - sub-flow executed(直前のサブフローが実行されたか)、Condition - client scopeといった条件も加わっています。利用可能な条件はバージョンで差があるため、実装前に稼働バージョンの管理画面と公式ドキュメントで必ず突き合わせてください。ステップアップ設計の全体像は姉妹記事ステップアップ認証でも掘り下げています。

05Authenticator SPIとmatchCondition — 標準条件で足りないとき

標準の条件で表現できないロジック(例:社内APIの返す属性で分岐、時間帯で分岐)が必要になったら、Authenticator SPIで独自のConditional Authenticatorを実装します。ポイントは2つのメソッドです。

実装の詳細と、SecretQuestionを題材にしたウォークスルーはServer Developer Guideに載っています。カスタム認証器の設計・運用の勘所は姉妹記事カスタムAuthenticator SPIにまとめています。SPIに手を出す前に、標準条件の組み合わせで要件を満たせないかを一度立ち止まって検討するのが、保守性の観点では堅実です。

Conditionalサブフローの評価 Conditionalサブフロー に到達 全Condition の matchCondition を評価 (User Role / LoA / 独自条件) すべて true 実質 Required として実行 1つでも false 実質 Disabled としてスキップ 内部のRequired認証器が走る MFAは要求されない
図:Conditionalサブフローは条件の真偽でRequired/Disabledに切り替わる

06ブラウザフローのカスタマイズと本番反映(Bind)

カスタムフローは作っただけでは使われません。Binding(バインド)が必要です。手順の骨子は次の通りです。

フローには「Browser」「Direct grant」「Reset credentials」「Registration」など複数のバインディングポイントがあります。ブラウザログインだけ直して満足していると、パスワードグラント(Direct grant)経由やパスワードリセット経路にMFAが掛からず、ポリシーの穴になりがちです。加えて、クライアント単位でAuthentication flow overridesを設定して特定クライアントだけ別フローを使う運用もできます。フローの管理をコード化したい場合は、Admin REST APIやTerraformでの自動化を検討してください(姉妹記事Admin REST APIとIaC参照)。

07よくある誤設定と、その回避

私たちが現場で実際に踏んだ・見かけた落とし穴を挙げます。

現場のコツ:フロー変更は必ず検証用レルム or 検証クライアントで、対象ユーザー(admin/一般/IdP連携)ごとに実ログインを踏んでから本番へ。特にステップアップ系はトークンのacrクレームまで確認すると、後の障害切り分けが楽になります。監査面ではEvent Listener SPIでの認証イベント記録も併せて設計すると盤石です。

まとめ

Authentication Flowは、Required(AND)・Alternative(or、1つ成功で確定)・Conditional(条件で実質Required/Disabledを切替)・Disabledという4要件の組み合わせで挙動が決まります。条件付きMFAはConditionalサブフロー+Condition認証器、ステップアップはLoA/ACRマッピング——という定石を押さえ、Bindとバインディングポイントの取りこぼしに注意すれば、エンタープライズの要件はGUIの範囲でかなり表現できます。標準で足りなければAuthenticator SPIへ、という順序が保守性の面でも堅実です。Keycloakの実構築事例は導入事例もご覧ください。

参考(一次情報)

認証基盤の設計・移行でお困りでしたら、Keycloak実構築の経験を持つ私たちにお問い合わせください。

相談する
← ブログ一覧へ戻る