OpenAM 14のWebAuthn認証設定10分間クッキング

# OpenAM14のパスワードレス認証設定
前提条件としてOpenAM14の環境構築が終わっている必要があります。
環境構築手順は前の記事[OpenAM14を最速で構築する10分間クッキング](https://qiita.com/tonoki/items/6a59cb9fe0b3062d8e84)にありますので参考にしてください。
パスワードレス認証設定の完了まで10分程度です。

# パスワードレス認証モジュール設定
今回の手順では以下のような認証フローを設定します。
登録済みの認証デバイスがあればパスワードレス認証を実施し、
認証デバイスが無い、又はパスワードレス認証に失敗するとデバイスの登録フローへつながります。
![fido2chain2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/13151144-5695-28e0-5a69-eae21126690e.png)

ログイン画面から **amadmin** でログインします。
![w1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/3da1d80d-1299-bd37-2359-29a5de447c76.png)

**[最上位のレルム]** を選択します。
![w2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/646d9d39-bdb3-48bd-0a3f-8eb071b02896.png)

**


## WebAuthnサービスの追加
データーストア関連の**サービス**を登録します。
![w3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/5afc90bc-b8a1-852c-f34e-dd1fd978f83d.png)

**[サービスの追加ボタン]** を押します。
![w4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/ca9c4c5b-02c1-df62-9ee0-110e426ea69d.png)

サービスタイプ **[WebAuthn Authenticator サービス]** をプルダウンから選択します。
![w5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/09be1783-3c0f-d0fa-08d4-e70ee6d7317f.png)


2台目以降のOpenAMやOpenLDAPが無い場合は**[バインドユーザーパスワード]** に **[amadmin]** のパスワードを入力し **[作成]** ボタンを押します。
![w6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/634dd224-99f5-3b63-1f3c-1fe9cbe31ed5.png)

初期値として各種LDAP属性が表示されます。
この画面では特に変更することは無いです。 そのまま引き続き **[認証]** の設定へ進みます。
![w7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/1ee2ce82-6fb3-ee5c-60cc-b66aff9e5dec.png)

## WebAuthnモジュールの追加
OpenAM14のWebAuthn認証モジュールは、登録、認証の2種に分かれています。
まずは登録モジュールから設定していきます。
**[認証]** の **[モジュール]** を開き **[モジュールの追加]** ボタンを押します。
![w8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/47606fae-a682-cd9e-f8b9-ccfecc4bed6c.png)

新規モジュールの作成で識別しやすい　**[名前]** 決め、**[種類]**プルダウンから   **[WebAuthn(登録)]** を選びます。入力したら **[作成]** を押します。
![w9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/c950be94-aecc-cfea-e2e1-c2527a3b734b.png)

 **[WebAuthn(登録)]** モジュール設定画面が開きます。
特に変更はしなくても動作します。
RP名がDefault RPで都合が悪いなら、よりカッコ良い名前を付けます。
Orginの設定も適切な値が入っていますが、変更したい場合は変更します。
今回の例ではResidentKeyは使わないのでResidentKey設定もfalseのままです。
変更した場合は右下の **[変更の保存]** を押します。
![w10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/cefba9aa-c3f6-f505-442f-f30a555825b8.png)

保存すると認証モジュールの一覧画面へ戻ります。
追加したWebAuthn(登録)モジュールが **[keyReg]** として追加されています。
引き続き **[WebAuthn(認証)]** モジュールを追加するので、**[モジュールの追加]** ボタンを押します。
![w11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/86579318-70a2-f16e-ea55-0c635938a1fc.png)

新規モジュールの作成で識別しやすい　**[名前]** 決め、**[種類]**プルダウンから   **[WebAuthn(認証)]** を選びます。入力したら **[作成]** を押します。
![w12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/8d0d0f48-60e1-b9d6-2287-c860217aa9bb.png)

**[WebAuthn(認証)]** モジュール設定画面が開きます。
特に変更はしなくても動作します。
RP名やOriginなど登録モジュール側で変更した場合は同じ値にしておきます。
今回の例ではResidentKeyは使わないのでResidentKey設定もfalseのままです。
**[MFAの2段階目以降に利用する]** 場合はtrueに設定します。今回はfalseのままです。
右下の **[変更の保存]** を押します。
![w13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/9f5b3bfe-c104-31b7-c03e-188cdf0f4a9b.png)

モジュールの追加は以上です。

## 認証連鎖の設定
OpenAMには認証連鎖という認証モジュールを組み合わせて、それぞれの認証結果を元に次の認証モジュールの要不要を判定する機能があります。
非常に単純化した例であれば、IDとパスワード認証の後に、ワンタイムパスワードを入力するような以下の例が簡単に設定できます。
![mfa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/cbad552f-7534-2743-7b7b-4089fce75462.png)

この認証連鎖を使って簡単にパスワードレスの認証とデバイス登録の連鎖を作ります。
最初のモジュールでパスワードレス認証を実施し、成功すればログイン成功です。
失敗した場合はID/PW認証の後、認証デバイスの登録をします。
もちろんID/PWが間違えていれば登録できませんし、拡張としてこの間にOTPやリスクベース認証モジュールを挟んで条件を厳しくすることもできます。
![fido2chain.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/95530eba-e9f3-dcdb-9f5e-acdb854eca84.png)

認証連鎖の設定は **[認証連鎖]** から **[認証連鎖の追加]** を選びます。
![w14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/689a152b-059e-6eae-830f-94ee93625901.png)

まずは名前を付け、作成を押します。
![w15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/2d2ef9de-26b6-6f55-e511-ee30b286a1e7.png)

**[モジュールの追加]** ボタンを押し認証連鎖へ追加したい認証モジュールを選びます。
![w16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/3bf10dc0-606f-eb79-3dc9-894d1e36ccb2.png)

モジュールの追加プルダウンから先程追加した **[keyAuth]** を選び、条件を **[Sufficient]** (Sufficientとはこのモジュールで成功しさえすれば認証成功となる条件です。以降に登録された認証モジュールは通過しません）
![w17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/debdb7ca-341b-cff0-45d0-f57c367de427.png)

keyAuthが追加されたので、さらに**[モジュールの追加]** ボタン押し、パスワードレス認証に失敗した場合に動作する、登録のフローに使う認証モジュールを追加していきます。
![w18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/c4cd87c3-b2c2-1c53-3b0f-f53c0909e0b6.png)

次はデバイス登録前のID/Password認証の **[DataStore(ID/Password)認証モジュール]** を追加します。このモジュールで失敗した場合は認証連鎖を失敗として終了するように **[Requisite]** を条件にします。
![w19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/506ce67b-f1e7-9cb3-2e65-2459bc84c62f.png)

DataStore認証モジュールが追加されたので、最後に**[モジュールの追加]** ボタン押し、パスワードレス認証のデバイス登録モジュールを追加します。
![w20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/a2aaf36d-ed54-6e25-a153-3ff65a39215c.png)

先程追加した **[keyReg]** 認証モジュールを選び、条件は初期値の **[Required]** にします。
![w21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/f484ae25-73f4-fe83-0485-328d1ffb0aab.png)

認証連鎖へのモジュールの追加は完了です。右下の **[変更の保存]** 忘れずに押します。Sufficient、Requisiteの成功失敗の挙動は赤枠の中の矢印の向き通りとなります。
![w22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/4e2880a4-9555-ceb0-030c-fcc7d887c923.png)

## OpenAM標準認証連鎖の変更
パスワードレスの認証連鎖は作成されましたが、まだログイン時に利用する設定にはなっていません。
この組織(最上位のレルム)の既定の認証連鎖を先ほど追加した認証連鎖へ変更します。
**[認証]** の　**[組織認証連鎖]** プルダウンメニューから作成した **[WebAuthn]** を選択し、変更の保存をします。
![w23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/72fb5212-dfe5-bbb3-c876-0d346c9cdcbb.png)
**※最上位のレルムの組織認証設定をldapService以外へ変更した場合、amadminでログインするURLは[?service=adminconsoleservice]を付加したURLを使います。**
**https://openam14.example.com/openam?service=adminconsoleservice**
詳細は省きますが、amadminは通常のLDAPユーザーではないため追加したWebAuthn認証連鎖ではログインできないためです。
これで設定は全て完了です。10分に収まりました？



# パスワードレス認証の動作確認
設定は終わりましたので、お楽しみの動作確認です。
そう言えば使えるのはFIDO2対応の認証デバイスでU2Fでも大丈夫です。Windows Hello、MacBook TouchIDももちろん動作します。ブラウザはEdge、Chrome、Safari、Firefoxなどです。
## 認証デバイス登録
OpenAMのURLを開くとパスワードレス認証のログイン画面が出ます。
まだ未登録なのでそのままログインボタンを押して次へ
![w24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/23e6b80f-a4ba-407c-4903-3601c8f7ce08.png)

パスワードレス認証が失敗したので登録フローに入りました。
初期設定の時につくったテストユーザーのID/Passwordでログインします。
![w25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/a66878d8-0e85-75fa-431c-367b9715aa4f.png)

認証デバイスを要求する登録ダイアログが出ます。
![w26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/4cb5bd9e-d209-72d3-519f-50cc1e5fd081.png)

ローカル認証が有効な場合はPINの入力が要求されます。この辺はデバイス依存です。
![w27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/b2b957b4-768a-6a27-49fa-3f1a7c846257.png)

認証デバイスの操作後登録が完了します。
入力フォームが表示されるので、識別しやすい名前を付けます。
![w28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/0b263990-9d15-bc3c-646c-2995a225e7a6.png)

登録後の **[ダッシュボード]** を開くと登録されたFIDO2認証デバイスがリストされます。
![w30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/7350abc1-aedd-5f81-bbd9-216929cad259.png)

認証デバイスの登録は以上です。

## パスワードレス認証
認証デバイスの登録も完了したので晴れてパスワードレス認証です。
赤枠は冗談です
ユーザーIDを入れ、ログインボタンを押します。
![w33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/14abeb4b-bb03-50f6-2c39-282681d84903.png)


認証デバイスを操作して
![w34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/ffb7eef9-6b7a-6d76-cebd-bec5e1c566c2.png)

ログイン完了です。
![w35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/1df4b450-a4c5-b4ec-0d36-5afc3ad173b4.png)

良いお年を...