今日やること
これまでの記事では、IDとパスワードによる認証を経て、Policy Agentが導入されているWebサーバーにアクセスしてました。今日は、この認証にもう1要素加えて、多要素認証としてみたいと思います。
多要素認証ってわたしは呼んでますが、2段階認証とか、2要素認証とか認証サービスごとによっていろいろな呼び方をされてますね。なにか区別しているんでしょうか?
流れとしては、上記のような感じですね。ユーザーはOpenAMで認証して、認証済みのセッションを払いだしてもらうために、1. IDとパスワードで認証と2. TOTPで認証を行うという感じです。
TOTPってなに?
TOTPはTime-Based One-Time Passwordの略です。RFCで定義されています。秘密鍵と現在時間を共有する一度きりのパワードを生成するアルゴリズムみたいなもんです。あまり細かいことはわかってません(◞‸◟)
大まかな概要図はこのような感じだと思います。図から想像できるように、KEYは事前に共有しておく必要があります。
OpenAMでTOTP認証を有効化する
それではやっていきましょう!
ForgeRock Authenticator モジュールを追加する
OpenAMの管理コンソールに管理者アカウント(ユーザー名はamadmin
)でサインインします。
Authentication => Modules => Add Moduleとアクセスします。
モジュールの追加ウィザードが表示されます。以下のパラメータを入力し、Createをクリックします。
- Name
- TOTP
- Type
- ForgeRock Authenticator(OATH)
こんな感じです。
引き続きパラメータを入力し、Save Changesをクリックします。(変更点のみ記載)
- 使用するOATHアルゴリズム
- TOTP
- Name of the issuer
- iam.example.com
こんな感じです。
Name of issuerは発行元みたいなイメージでしょうか。
TOTPモジュールをチェーンに追加
OpenAMには認証のチェーン(連鎖)という仕組みがあります。「Aという認証が成功したらBという認証」、とか、「Aという認証が成功しても失敗してもBという認証」...とかいう感じで、認証の組み合わせを定義できます。
設定はAuthentication => Chainsから行うことができます。デフォルトでは、ldapServiceというチェーンが適用されていますので、これをクリックします。
ん~(´▽`)直観的でわかりやすいインターフェースだと思います。Add a Moduleから先ほど追加したモジュールを追加することができます。追加後は以下のような画面になります。
ここで、RequireとかRequisiteとか表示されていますが、これは各モジュールの実行後の動作決める条件となります。以下のようなパラメータを設定することができます。
条件 | 説明 |
---|---|
requisite | モジュールは成功する必要があります。成功すると、チェーンの次のモジュールに進み、失敗すると、そこで認証失敗となります。 |
required | モジュールの成功が必要です。成功するかどうかに依らず、チェーンの次のモジュールに進みます。 |
sufficient | モジュールの成功は必須ではありません。成功すると、チェーンの次のモジュールに進まず、認証成功となります。失敗すると、チェーンの次の認証モジュールに進みます。 |
optional | モジュールの成功は必須ではありません。成功するかどうかに依らず、チェーンの次のモジュールに進みます。 |
ForgeRock Authenticatorのインストール
お手持ちのスマホにForgeRock Authenticatorをインストールします。
このアプリはユーザー側のOTPの生成器みたいなものになります。(アップデートしたほうがいいですね...)
動作確認
それでは、試してみましょう。
Policy Agentを導入済みのWebサーバーweb.example.com
にアクセスします。
アクセス後、IDとパスワードによる認証画面が表示されますので、検証アカウント(ユーザー名はjohnd
)でサインインします。
ユーザー側でOTPを生成するために必要な鍵の事前共有と2要素目の認証のプロセスが開始されます。REGISTER DEVICEをクリックします。
先ほど、スマホにインストールしたForgeRock Authenticatorを使って、鍵の登録をします。QRコードが表示されるので、このアプリで読み取ります。
読み取り後、LOGIN USING VERIFICATION CODEをクリックします。
ちなみに、ForgeRock Authenticatorでは、時間の経過とともに変化するOTPが表示されます。
ここで、表示されているOTPを入力するフォームが表示されるので、ForgeRock Authenticatorに表示されているOTPを入力します。
認証に成功すると、おなじみのApacheの画面が表示され、認証が成功していることが確認できます。
1回目はOTPを生成する鍵の共有が必要だったので、QRコードの読み取りが必要でしたが、2回目以降は不要となります。
はまるとこ
当然、時刻ベースでOTPを生成して、比較するという認証なので、ForgeRock Authenticator側とOpenAM側で時刻があっていないと、認証が成立しません。
気を付けされたし(´◉◞౪◟◉)
〆
まとめると、
- ForgeRock Authenticatorモジュールで、TOTPをつかった多要素認証を実装できる
- OpenAMには認証のモジュールを組み合わせて、認証機能を提供できる
- ForgeRock AuthenticatorはOTPを生成するのに必要な鍵共有のインターフェースもモジュール上で提供している
という感じですかね~。結構簡単にTOTPできました。
ただこのForgeRock Authenticatorで作られたQRコードですが、OTPの生成器アプリとして名高いGoogle Authenticatorで読み取ることができません。なんだか特殊なURNで表現されてるのかな~?ま、いっか(´▽`)
明日はなにしよう~?
ばい!