OpenAMでリスクベース認証する

## はじめに

会社のIAMを持とうという話が上がったひとつの要因として、**「今日日、社内にいないと仕事できないって意味わからん」**っていう~~文句~~要望があったことが挙げられます。要するに、何らかの理由で社外にいる人にも会社のアプリを使わせたいという話です。一部、これらの要望をVPN製品で代替していたりもしますが、デバイスの多様化にはついてこれないですし、何より**腰を据えないと使えない**っていうのは、なかなか利用されづらい仕組みになると思っています。

ゆえに、**社外にいる**という状態の社員をちゃんと認証出来ているのであれば、~~いいかげんな~~寛容なアプリ（≒機密性のある情報をあまり含まないアプリ）は使えればいいのでは？いいでしょ！

## 今日やること

今日はそんな文句に応える実装の一例として**リスクベース認証**という機能を使い、社内のユーザー、社外のユーザー双方の認証をするようなチェーンを実装します。

イメージはこんな感じです。

![001.jpg](https://qiita-image-store.s3.amazonaws.com/0/148404/b5796d09-5425-9ee9-3251-475e75eb71ec.jpeg)

## リスクベースってなに？

ググると、銀行のページがよくでてきますね！たとえば、[イオン銀行さんのページ](http://faq.aeonbank.co.jp/faq_detail.html?id=3643)を参照しますと、

> **件名：リスクベース認証とは何ですか。**
> お客さまがインターネットバンキングにログインした際のご利用環境を分析し普段のご利用環境と異なると判断した場合に、追加でお客さましか知らない情報の入力により、お客さまご本人であることを確認する仕組です。
第三者のなりすましによる不正利用を防ぐために導入しています。

とあります。
ここでの普段の**ご利用環境と異なる**というのはいろいろな情報から判定することができます。例えば、

* これまでの送信元IPアドレスの履歴
* ブラウザの種別（User Agent）
* 位置情報

といった感じです。

## リスクベース認証の設定

では、設定していきましょう。

OpenAMの管理者アカウント（ユーザー名は`amadmin`）でサインインし、管理者コンソールにアクセスします。

### モジュールの追加

リスクベース認証モジュールも[前回のTOTP認証モジュール](http://qiita.com/nanazero/items/bf99f83b469ee34096ed)と同様、OpenAMではデフォルトで使用することができます。

**Authentication => Modules => Add Module**をクリックします。

<img width="887" alt="002.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/e835b243-0859-91ec-e98d-db6641bded20.jpeg">

以下のパラメータを入力してモジュールを追加します。

* Name
    - Risk-basedAuthentication
* Type
    - アダプティブリスク

こんな感じです。

<img width="740" alt="003.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/4634e88d-4a42-d62f-7201-d8af4ce2e493.jpeg">

モジュールのパラメータを設定します。ここでのパラメータは**ご利用環境と異なる**という判定を**何の情報を以って行うのか**を設定します。設定可能なパラメーターは以下の通りです。

* 認証失敗チェック
    - ユーザーが過去に認証失敗をしているかをチェックします
* IP レンジチェック
    - IP アドレスのリストに対するクライアントの IP アドレスチェックを有効にします
* IP 履歴チェック
    - 過去の IP アドレスのリストに対するクライアント IP アドレスのチェックを有効にします
* Cookie 値チェック
    - クライアントリクエストの既知の Cookie 値のチェックを有効にします
* 最終ログインからの経過時間チェック
    - ユーザーが最後に認証した時刻から経過時間チェックを有効にします
* プロファイルのリスク属性チェック
    - ユーザープロファイルの一致する属性と値のチェックを有効にします
* デバイス登録 Cookie チェック
    - クライアントリクエストのデバイスCookie チェックを有効にします
* 位置情報国コードチェック
    - 位置情報データベースに反するクライアントの IP アドレスチェックを有効にします
* リクエストヘッダーチェック
    - 既知のヘッダー名と値に対するクライアントリクエストのチェックを有効にします

各チェックを有効にすると、判定がされる設定となります。チェックには、**スコア**を設定することができ、**スコアが閾値を超えるとリスクがある！**と判断され、認証に失敗する（＝追加の認証を要求される）という仕組みです。

今回はシンプルに以下のパラメータを設定します。

* IPレンジチェック
    * ONにする
* IPレンジ
    - 192.168.33.0/24
* スコア
    * 1
* スコアの閾値
    - 1

こんな感じです。

<img width="650" alt="005.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/396d7818-d4be-2c02-008a-f88d88f5f297.jpeg">

### チェーンの設定

認証モジュールを追加したので、チェーンに追加します。今回、提供したいチェーンは、

* IDとパスワードの認証（モジュール名：`DataStore`）は成功する必要がある
* リスクベース認証（モジュール名：`Risk-basedAuthentication）は成功（リスクがないと判定）したら、そこで認証成功とし、失敗したら追加の認証とする
* 追加の認証はTOTPとする

となります。以下のように設定します。

<img width="705" alt="006.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/f0724445-c3d3-a434-ad78-95cc937eefa2.jpeg">

## 確認

### 内勤ユーザーでアクセス

まず、送信元のIPアドレスが`192.168.33.1`のクライアントから、Policy Agentが導入されたWebサーバー（本記事では`https://web.example.com`）にアクセスします。

OpenAMの認証画面が表示されるので、本記事における検証アカウント（ユーザー名は`johnd`）でサインインします。

<img width="314" alt="007.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/58d4f122-0e03-57e1-b6e1-8ada457a64dc.jpeg">

その後、追加の認証を求められることなく、**おなじみのApacheの画面**が表示されます。

<img width="606" alt="008.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/02480ee8-59d8-1ae5-8c17-9b2faf04595a.jpeg">

### 営業ユーザーでアクセス

続いて、送信元のIPアドレスが`192.168.33.0/24`外のクライアントからアクセスを行います。先ほどと同様のアカウントでサインインします。

<img width="314" alt="007.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/337abe72-1a4d-32ec-c4d9-2ffc4f654047.jpeg">

先ほどとは異なり、追加の認証としてTOTP認証が要求されました。

<img width="332" alt="009.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/148404/d1b5c9f9-f191-39f7-2297-0b29ce4b63c1.jpeg">

## 〆

今回のまとめは

* OpenAMでリスクベース認証を設定できる
* 何を以ってリスクがあるのか？というポリシーは柔軟にデザインできる
* 簡単にやるなら送信元IPアドレスで判定したらよい

という感じですかね～。企業の従業員を認証するってユースケースですと、送信元IPアドレスの判定のほかに、**普段使っているブラウザか？**とか、**外からアクセスを許可されているユーザーか？**あたりがよく使われるのかなぁと思いました。

あしたは何しよう～？

ばい！