今日やること
Keycloakアドベンドカレンダー12日目は、Keycloakの「多要素認証」に触れてみようと思います。
「多要素認証」とは、アクセス権を得るのに必要な本人確認のための『複数』の要素(証拠)をユーザーに要求する認証方式です。例えば、複数の要素を組み合わせることで、よりセキュアな認証を可能にしたり、利便性を下げずに、セキュリティを向上させたりできます。
ここでは、Keycloakが提供する「多要素認証」の設定を確認しながら、「ワンタイムパスワード認証(OTP)」を試してみようと思います。
事前準備
- Keycloak環境(スタンドアロン構成でOK)
- Keycloak管理ユーザと一般ユーザ
- 「FreeOTP」がインストールされた「iPhone」端末 (「Google Authenticator」がインストールされた「Android」端末でも可)
※セットアップやユーザ登録等は、Keycloakアドベンドカレンダー2日目の「Keycloakのセットアップ」、および、3日目の「KeycloakでOpenID Connectを使ってみる(Spring Bootアプリケーション編)」をご参考にして下さい。
※今回はデフォルトでセットアップされている「masterレルム」をそのまま使います。(実際はレルムを分けて作るのが望ましいです)
Keycloak管理設定を確認してみる
Keycloak管理コンソール http://(KEYCLOAK_FQDN)/auth/admin/master/console/
にアクセス、および、管理ユーザでログインし、[設定] > [認証]
の内容を確認します。
「フロー」タブ
「認証フロー」は、各種処理パターン毎(ブラウザ認証フロー/登録フロー/ダイレクトグラントフロー/クレデンシャルリセットフロー/クライアント認証フロー)に分けられてビルトイン設定されており、その中のBrowser
が、ブラウザで認証する基本パターンの「認証フロー」となっています。
上記キャプチャーの「認証フロー」の設定は、Keycloakデフォルトのものですが、ここに設定されている「認証タイプ」の概要は以下の通りとなり、上から順番に評価されてゆきます。なお、このフローをコピー編集して、順序を入れ替えたり、他の認証タイプを設定したり、フローをグループ化して何段にもネスト設定したりすることが可能です。
認証タイプ | (ネスト) | 認証内容 | 概要 |
---|---|---|---|
Cookie | - | 認証クッキー認証 | 認証クッキー内容が有効であることをチェックします。 |
Kerberos | - | Kerberos認証 | Kerberos Distribution Center(KDC)で認証されたユーザかどうかチェックします。※SPNEGOプロコトルにより認証を行います。 |
Identity Provider Redirector | - | 外部IDP認証 | 外部のIDPやSNSなど第3者認証情報を利用して、SAMLやOpenID Connectを使って認証を行います。 |
Forms | - | フォーム認証 | フォーム入力による認証が使用されます。内容はネストされた認証タイプに依存します。 |
〃 | Username Password Form | IDパスワードで行うフォーム認証 | フォーム入力されたIDとパスワードをチェックします。 |
〃 | OTP Form | ワンタイムパスワードで行うフォーム認証 | フォーム入力されたワンタイムパスワードをチェックします。 |
また、フロー内の各「認証タイプ」には、実行後の動作を決定する「必要条件」が設定可能です。その条件には以下の4種類があります。
必要条件 | 意味 | 概要 | 実行後の結果 |
---|---|---|---|
ALTERNATIVE | 代替 | 選択された「認証タイプ」が次以降の「認証タイプ」の代替をします。 | 成功すると、次の「認証タイプ」に進むことなく、認証成功となります。失敗すると、次の「認証タイプ」に進みます。 |
REQUIRED | 必須 | 選択された「認証タイプ」の成功が必要になります。 | 成功すると、次の「認証タイプ」に進みます。失敗すると、次の「認証タイプ」に進むことなく、認証失敗となります。 |
OPTIONAL | 任意 | 選択された「認証タイプ」はユーザ設定(任意)により実行されます。(※2) | 発動された場合、成功すると、次の「認証タイプ」に進みます。失敗すると、次の「認証タイプ」に進むことなく、認証失敗となります。 |
DISABLED | 無効 | 選択された「認証タイプ」が無効になります。 | 実行されません。 |
※2 ユーザの任意で、ユーザ自身が設定を行うことで発動する「認証タイプ」です。一律に強制させたい場合は、REQUIRED
を設定して下さい。この設定をした後、初めてログインした際は、強制的にその「認証タイプ」のオプション設定を促されます。
上述のキャプチャの「認証フロー」設定を図解すると以下にようになります。
ここでは、「認証フロー」設定の意味を理解しながら、OPT Form
の「認証タイプ」の「必要条件」が、デフォルトでセットアップされているOPTIONAL
となっていることを確認して、次に進みます。
「OTPポリシー」タブ
「OPT」の方式やハッシュアルゴリズムなどが変更できます。ここでは、一旦デフォルトのままとして、次に進みます。
ユーザ設定をしてみる
アカウント設定画面 http://(KEYCLOAK_FQDN)/auth/realms/master/account/
にアクセス、および、一般ユーザでログインし、[アカウント設定画面] > [Authenticator]
でワンタイムパスワード設定を行います。
「iPhone」端末を取り出し、「FreeOTP」を起動します。
ユーザ設定画面上に表示されている、2次元バーコードを「FreeOTP」で読み取り、トークン登録します。
そのまま、登録されたトークンをタップすると「ワンタイムパスワード」が表示されます。
その「ワンタイムパスワード」をアカウント設定画面のワンタイムコード
に入力します。
認証の確認をしてみる
一度ログアウトをしてから、ユーザ設定画面 http://(KEYCLOAK_FQDN)/auth/realms/master/account/
にアクセスします。
「ログイン画面」が表示されました。「ID」と「パスワード」を入力し、ログインします。
続けて、「ワンタイムコード入力画面」が表示されるようになりました。
「iPhone」端末を取り出し、「FreeOTP」を起動し、ワンタイムパスワードを発行します。
発行された「ワンタイムパスワード」を、「ワンタイムコード入力画面」のワンタイムコード
に入力します。
まとめ
今回、「多要素認証」の例として、Keycloak標準搭載である「ワンタイムパスワード認証(OTP)」を試してみましたが、とても簡単に、よりセキュアな認証設定が出来ました。カスタマイズ開発をしなくてもある程度柔軟に、「認証フロー」の定義変更だけで、要件に合わせて複数の認証を組み合わせた「多要素認証」を実現できるようになっています。万が一、標準搭載にない認証要件があれば、「Keycloak Documentation - Server Development (Authentication SPI)」を参照しながら、「認証タイプ」のカスタマイズ開発も可能です。