OpenAMのリスクベース認証について(2)

 前回は、OpenAM 12.0のリスクベース認証について紹介しました。今回は、その中の一つである「デバイスID認証」を実際に設定して、動作検証してみたいと思います。

■ 実現したいこと

 今回実現するのは、以下のような多要素(多段階)認証の要件です。

  • OpenAMは、ユーザーに対してIDとパスワードによる認証を要求する
  • ログインに使用するデバイス(OSやブラウザなど)が普段とは異なる場合は(※)、さらにワンタイムパスワードの入力を要求する
  • ワンタイムパスワードはユーザーのメールアドレスに送信する
  • 認証成功時に、デバイスの情報(「デバイスプリント」と言います)をユーザーデータストア(LDAP)にあるユーザーエントリの属性に保存する

devprireq2

※「異なる」の判断基準の詳細に関しては、後で説明します。

■ 検証に使用した環境

 動作検証は、以下の環境で行いました。

  • OpenAM 12.0.0
  • Tomcat 6.0.24
  • OpenJDK 1.7.0_45
  • CentOS 6.5 (VMWare)

■ 設定手順

 まずはamadminで管理コンソールにログインします。

 アクセス制御 > / (最上位のレルム) > 認証 のタブをクリックし、モジュールインスタンスのセクションにある新規ボタンをクリックします。ここで、デバイスID(一致)認証とデバイスID(保存)認証のモジュールインスタンスを適当な名前で作成します(認証モジュール名は、DeviceIdMatch、DeviceIdSaveとしています)。

Screenshot-OpenAM - Mozilla Firefox-5

 次に、デフォルトで登録されているHOTP認証モジュールに、メール送信可能なSMTPサーバーの設定を行います。

Screenshot-OpenAM - Mozilla Firefox-6

 作成した2つの認証モジュールと、データストア、HOTPの4つ認証モジュールを組み合わせて、以下のような認証連鎖を作成します(認証連鎖名は、DevicePrintChainとしています)。

Screenshot-OpenAM - Mozilla Firefox

 認証連鎖を作成したら、それをログイン時に使うように認証設定を変更します。認証画面の「組織認証設定」を作成したDevicePrintChainに変更して下さい。

Screenshot-OpenAM - Mozilla Firefox-1

 最後に、ログインするユーザーにワンタイムパスワードを送信できるように、デフォルトで登録されている「demo」というユーザーのメール属性に受信が可能なメールアドレスを設定します。
 アクセス制御 > / (最上位のレルム) > 対象 のタブをクリックし、demoユーザーのプロファイルページから更新して下さい。

Screenshot-OpenAM - Mozilla Firefox-4

 以上で設定は完了です。いったん管理コンソールからログアウトして下さい。

■ 動作検証

では、実際にログインしてみましょう。OpenAMのログイン画面にアクセスして下さい。

Screenshot-OpenAM - Login - Realm - Mozilla Firefox

 ユーザー名とパスワードにdemo、changeitと入力して下さい。入力ミスが無ければ、以下の画面が表示されます。

Screenshot-OpenAM - Login - Realm - Mozilla Firefox-1

 「OTPコードの要求」ボタンをクリックすると、先ほど設定したメールアドレスにワンタイムパスワードが送信されます。

OTPMail

 このワンタイムパスワードを入力して、「OTPコードの送信」ボタンをクリックします。

Screenshot-OpenAM - Login - Realm - Mozilla Firefox-2

 ワンタイムパスワードが正しければ、今回ログインに使用したデバイスを、信頼できるデバイスとして登録するかどうか確認する画面が表示されるので、Yesを選択して下さい。

Screenshot-OpenAM - Login - Realm - Mozilla Firefox-3

 適当なデバイス名を入力してログインボタンをクリックすると、demoユーザーのデバイスプリントがOpenAMに登録されます。

Screenshot-OpenAM - Login - Realm - Mozilla Firefox-4

 ログインが完了すると、ユーザー情報画面が表示されます。

Screenshot-OpenAM - Profile - Mozilla Firefox-1

 いったんログアウトして同じデバイスで再ログインしてみて下さい。今度はデバイスプリントが登録されているため、ユーザー名とパスワードの入力だけで、ワンタイムパスワードの入力は求められません。

 ちなみに、ユーザー情報画面の「Dashboad」タブをクリックすると、登録したデバイスの一覧が表示されます。必要であれば、削除することもできます。

Screenshot-OpenAM - Dashboard - Mozilla Firefox-1

 登録したデバイスプリントはユーザーデータストアに保存されています。LDAPクライアントツールでdemoユーザーの属性を見てみると、デバイスプリントが登録されていることが分かります。

devProf

warning 注意:最上位のレルムの認証連鎖の設定を変えたので、amadminで管理コンソ-ルにログインする際もこの認証連鎖が機能してしまいます。これを回避するには、ログインURLの最後に「&service=adminconsoleservice」を付加して下さい。

■ デバイスプリントが「異なる」と判定する基準とその変更方法

前述したデバイスプリントが「異なる」と判定する基準をどのよう決定しているかは、デバイスID(一致)認証モジュールの編集画面を見ると分かります。

 アクセス制御 > / (最上位のレルム) > 認証 のタブをクリックし、モジュールインスタンスのセクションにDeviceIdMatchのリンクをクリックして下さい。次のような画面が表示されます。

Screenshot-OpenAM - Mozilla Firefox-2

 前回の記事で書きましたが、デバイスID(一致)認証モジュールとは、デバイス情報の取得と評価を行うスクリプトが設定されている「スクリプト認証モジュール」と言えます。

 この画面にある「クライアントサイドスクリプト」が、デバイス情報の取得をブラウザ上で行うJavaScriptです。そして、「サーバーサイドスクリプト」が、取得したデバイスプリントと保存されているデバイスプリントを比較して、「異なる」かどうかを判定するJavaScriptです。

 「サーバーサイドスクリプト」の実装を見ると、画面の解像度が異なればペナルティポイントを50加算し、使っているブラウザが異なればペナルティポイントを100加算する、といったロジックがあることが分かります。その結果、最終的にペナルティポイントが30を超えると、認証失敗と判定しています(つまり、デフォリトのスクリプトではどれか一つでも不一致があれば「異なる」と判定しています)。

 したがって、これらの数値を変えることで、「異なる」の判定基準を変えることができます。それだけではなく、JavaScriptの実装を追加することで、別の条件を組み込んだり、クライアントから取得する情報を追加することもできます。

 「サーバーサイドスクリプト」には、JavaScriptの他にGroovyを使用することもできます。これらのスクリプトのプログラミングが得意な方は、是非新しいリスクベース認証のロジックを実装してみて下さい(…できれば、コミュニティへのフィードバックもお願いします)。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中