Help us understand the problem. What is going on with this article?

Keycloakで多要素認証を試してみる(ワンタイムパスワード認証編)

More than 1 year has passed since last update.

今日やること

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が、ブラウザで認証する基本パターンの「認証フロー」となっています。

adcal#1.png

上記キャプチャーの「認証フロー」の設定は、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を設定して下さい。この設定をした後、初めてログインした際は、強制的にその「認証タイプ」のオプション設定を促されます。

上述のキャプチャの「認証フロー」設定を図解すると以下にようになります。
adcal-flow.png

ここでは、「認証フロー」設定の意味を理解しながら、OPT Formの「認証タイプ」の「必要条件」が、デフォルトでセットアップされているOPTIONALとなっていることを確認して、次に進みます。

「OTPポリシー」タブ

「OPT」の方式やハッシュアルゴリズムなどが変更できます。ここでは、一旦デフォルトのままとして、次に進みます。

adcal#2.png

ユーザ設定をしてみる

アカウント設定画面 http://(KEYCLOAK_FQDN)/auth/realms/master/account/ にアクセス、および、一般ユーザでログインし、[アカウント設定画面] > [Authenticator]でワンタイムパスワード設定を行います。
adcal#4.png

「iPhone」端末を取り出し、「FreeOTP」を起動します。
adcal#3.png

ユーザ設定画面上に表示されている、2次元バーコードを「FreeOTP」で読み取り、トークン登録します。
adcal#5.png

そのまま、登録されたトークンをタップすると「ワンタイムパスワード」が表示されます。
adcal#6.png

その「ワンタイムパスワード」をアカウント設定画面のワンタイムコードに入力します。
adcal#7.png

これで「OTP」の設定は完了です。
adcal#8.png

認証の確認をしてみる

一度ログアウトをしてから、ユーザ設定画面 http://(KEYCLOAK_FQDN)/auth/realms/master/account/ にアクセスします。
「ログイン画面」が表示されました。「ID」と「パスワード」を入力し、ログインします。
adcal#9.png

続けて、「ワンタイムコード入力画面」が表示されるようになりました。
adcal#10.png

「iPhone」端末を取り出し、「FreeOTP」を起動し、ワンタイムパスワードを発行します。
adcal#11.png

発行された「ワンタイムパスワード」を、「ワンタイムコード入力画面」のワンタイムコードに入力します。
adcal#12.png

無事ログインできました!
adcal#13.png

まとめ

今回、「多要素認証」の例として、Keycloak標準搭載である「ワンタイムパスワード認証(OTP)」を試してみましたが、とても簡単に、よりセキュアな認証設定が出来ました。カスタマイズ開発をしなくてもある程度柔軟に、「認証フロー」の定義変更だけで、要件に合わせて複数の認証を組み合わせた「多要素認証」を実現できるようになっています。万が一、標準搭載にない認証要件があれば、「Keycloak Documentation - Server Development (Authentication SPI)」を参照しながら、「認証タイプ」のカスタマイズ開発も可能です。

参考資料

naokiiiii
歌って踊れるエンジニアを目指しています。
http://www.ric-net.co.jp/
nri
NRIは「コンサルティング」「金融 ITソリューション」「産業 ITソリューション」「IT 基盤サービス」の4事業でお客様のビジネスや快適な社会、暮らしを支えています。※各記事の内容は個人の見解であり、所属する組織の公式見解ではありません。
https://www.nri.com/jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした