きっかけ
- Keycloak 8.0 にWebAuthnがサポートされるようになりました。
- さらにKeycloak 9.0 ではWebAuthnのパスワードレス認証ができるようになりました。 😄
- KeycloakもWebAuthn対応が充実してきたし、Authenticatorの登録及びAuthenticatorを使った認証を試してみようと思いました。
やってみたこと
- ほぼドキュメント記載のことをつらつら実施
- WebAuthnポリシーの設定
- WebAuthnフローの作成
- Authenticatorの登録と認証
- Credintialsのデータ保存確認
前提条件
- KeycloakにlocalhostもしくはHTTPSでアクセスできるようにしておく必要があります。
- Web Authentication APIにも書かれてます。
- FIDO2(CTAP2)対応のAuthenticatorを準備しておく
- Authenticatorがない場合はChromeの拡張機能のVirtual Authenticator Tabsを利用すれば、仮想のAuthenticatorとして利用することができます。
- ちなみにAttestation Conveyance Preference を direct にするとバリデーションのチェックにかかってエラーになります。
- Authenticatorがない場合はChromeの拡張機能のVirtual Authenticator Tabsを利用すれば、仮想のAuthenticatorとして利用することができます。
WebAuthnポリシーの設定について
- ver9.0では[WebAuthn Policy]と[WebAuthn Passwordless Policy]の設定ができるようになっています。
今回はパスワードレスを検証してみたいので、[WebAuthn Passwordless Policy]の設定を行います。
-
Relying Party Entity Name
- KeycloakがRelying Partyとなりますので、Relying Partyの名称を入力します。
-
Relying Party ID
-
Attestation Conveyance Preference
- Acceptables AAGUIDsの設定をする場合はAuthenticatorの情報の検証をする必要があるので direct にします。
-
Authenticator Attachment
- 許可するAuthenticator が外部デバイスか、内部デバイスかに選択をします。
- platform 内部デバイスをAuthenticatorとして利用する場合
- cross-platform USBやNFCやBluetoothで外部デバイスをAuthenticatorとして利用する場合
- 許可するAuthenticator が外部デバイスか、内部デバイスかに選択をします。
-
User Verification Requirement
- Authenticator独自の認証を求めるかどうかの設定になります。(デフォルト値 preferred)
- required 必ず認証を求める
- preferred Authenticatorが対応してたら認証を求める
- discouraged 認証を求めない
- Authenticator独自の認証を求めるかどうかの設定になります。(デフォルト値 preferred)
-
Acceptable AAGUIDs
- AAGUID(Authenticator Attestation Global Unique Identifier)とはAuthenticatorのプロダクトごとの識別子のことです。
- プロダクトごとにAAGUIDがあり、特定のプロダクトのAutenticatorのみしか認めない場合に利用します。
WebAuthnを使った際の認証フローの作成について
- ドキュメントに記載のあるWebAuthn Passwordless もしくは OTP&Password の認証フローを試します
- ドキュメントに記載されている通りに認証フローを作成します。
- KerberosとIdentity ProviderのExecutionは不要だと思ったので、設定しませんでした。以下のような画面の設定になります。
- ブラウザフローを作成した認証フローに変更します。
Authenticatorの登録について
- Authenticator の登録はユーザ登録時やユーザ情報を編集する画面にある[必要なアクション]から[WebAuthn Register Passwordless]を設定します。
- ユーザを大量に登録する場合はREST APIを使って、RequiredActionsの値を設定すると楽かなと思いました。
-
https://{Keycloakサーバホスト}/auth/realms/{レルム名}/account
にアクセスするとブラウザフローが開始されます。 - 今回の認証フローはWebAuthn PasswordlessもしくはOTP&Passwordなので、はじめにOTP&Passwordによる認証を行った後、Authenticatorの登録が求められるようになります。
- 下の画像ではOTPの部分はカットしてます。
Authenticatorを使った認証について
- OTP&PasswordとAuthenticator(Keycloakの画面ではSecurity Key)を登録すると、[Try Another Way]が表示されるので、どちらで認証するか選択することができるようになっています。
Credentialデータの保存について
- DB上はCREDENTIALSというテーブルにデータが保存されていました。
- USER_IDはUSER_ENTITYテーブルのUSER_IDと紐づいています。
- AAGUIDが
"aaguid": "00000000-0000-0000-0000-000000000000",
となっていたので何で?って思いました。 - よくよく考えるとAttestation Conveyance Preference を direct にしていなかったため、AAGUIDの情報が登録されていなかったようです。
- 試しにAttestation Conveyance Preference を directにするとAAGUIDの情報が登録されていました。
感想
- Acceptable AAGUIDs について
- UnAccesptable AAGUIDsの設定(ブラックリストの設定)ができるようにしたいという場合は設定が大変なのかなと思いました。
- FIDO Alliance Metadata ServiceにAuthenticatorの一覧が管理されているようです。
- このMetadata Service(MDS)に登録されているAAGUIDを[Accesptable AAGUIDs]に設定するのが良さそうに思いました。
- AAGUIDについて
- AAGUIDはどうやって採番されてるんだろうっていう疑問があります。
- FIDOアライアンスの資料には、AAGUIDはAuthenticatorの製造元が重複しないように割り当てるとありました。
- MDSに登録されている限りは重複したりしなさそう。