OpenAMの多要素認証シリーズとしてTOTP認証をやってみます。
TOTP認証に関しては以下のサイトが詳しいです。
OSSによるアイデンティティ管理(2):不正ログインを食い止めろ! OpenAMで認証強化 (2⁄2) - @IT
今回は以下のサイトに従って設定していきます。
Google Authenticator and OpenAM - OpenAM - Confluence
1. SecretKeyの生成
適当なSecretKeyを決めてbase16エンコード、base32エンコードした値を生成します。例えば”test12345abcdefg”というキーであれば
base16エンコード値→74657374313233343561626364656667
base32エンコード値→ORSXG5BRGIZTINLBMJRWIZLGM4======
となります。
各エンコード値は以下のサイトで簡単に生成できます。
http://online-calculators.appspot.com/base16/
http://online-calculators.appspot.com/base32/
※秘密鍵を第三者に渡すことになるので検証用にお使いください。
2. OpenAMの設定
アクセス制御>対象のレルム>データストア>embedded を選択しLDAPユーザ属性にtitleとdescriptionを追加します。
次に アクセス制御>対象のレルム>認証 のモジュールインスタンスでOATHをクリックします。
OATHを以下のように設定します。
今回は検証用なので秘密鍵は8桁にしちゃってますが、本番用はもっと大きい桁数(デフォルト32桁)にしてください。
秘密鍵の属性にtitle、最終ログイン時間属性にはdescriptionを割り当てます。あとはデフォルト通り。
※検証用なので属性はテキトーです。
また、TOTPのタイムステップ感覚とタイムステップ数ですが
今回利用するGoogle Authenticatorはトークンの生成間隔が30秒なのでデフォルト通りでOKです。
最後に認証連鎖を設定します。
こんな感じの認証連鎖を作成↓
組織認証設定を変更
3. LDAPの設定
OpenAMのデータストア(LDAP)にアクセスしてtitle属性に秘密鍵を格納します。LDAPにアクセスする手段としてGUIツールのApache Directory Studioを利用します。
まず、メニューからLDAP>New Connectionを選択します。
ホスト名とポートを設定します。ポート番号はデフォルト50389です。
※検証用なので非SSLになっています。
バインドするユーザとパスワードを入力します。
デフォルトでは以下のようになります。
BindDN:cn=Directory Manager
Bind password:adminのパスワード
BaseDN等を設定します。
EditOptionsはデフォルトのままでOKです。
あとは接続して対象のユーザを ou=people, dc=openam, dc=forgerock, dc=org 内から探して
title属性に1で生成したbase16エンコードの秘密鍵を格納します。
4. Google Authenticatorのインストールと設定
まずは Google Authenticatorをインストールします。次にGoogle Authenticatorに読み込ませるQRコードを生成します。
QRコードは以下のサイトで簡単に生成できます。
QR Code Generator – create QR codes for free (Logo, T-Shirt, vCard, EPS)
※秘密鍵を第三者に渡すのはキケンなので検証用にお使いください。
URLは以下の形式で入力します。
otpauth://totp/{適当なユーザ名}@{適当なドメイン}?secret={1で作成したbase32エンコードした秘密鍵}
QRコードはこんな感じになります。
Google Authenticatorを立ち上げるとアカウントの追加画面があるので
「バーコードをスキャン」を選択して上記のQRコードを読み込みます。
読み込むと自動的に秘密鍵が設定され以下のような画面が表示されます。
この6桁の数字がTOTPになります。
QRコードを使わずに「提供されたキーを入力」で秘密鍵を手入力で設定してもOKです。
5. 動作確認
通常通りID/パスワードでの認証が完了するとOATH認証の画面が出ます。ここでGoogle Authenticatorで取得したTOTPを入力すれば認証完了になります。