Auth0にPassKeyが搭載されたぞ!!!

2023/11/05に公開

はじめに

先日ふと Auth0 のダッシュボードを眺めていると、興味深い項目が表示されていました。
Untitled
Passkey がある!!!
なので、今回は Auth0 に搭載されたパスワードレス認証方式である Passkey の説明をしていきます。
なお、Auth0 の設定方法についてはAuth0 からリリースされた記事を参考にして、記載しています。

パスワード認証の課題

Passkey の説明をするまえに、パスワード認証の課題について見ていきます。
認証方法として当然とされているパスワード認証ですが、以下の 3 つの課題を持っています。
① パスワードの使い回し
② 推測されやすいパスワードの使用
③ フィッシングアプリへのパスワード入力
それぞれ見ていきましょう。

① パスワードの使い回し

ログインが必要なアプリにはそれぞれ異なるパスワードを使用するというのは皆さんご存知だとは思います。
とはいえ、使用するアプリが数個ならまだしても数十個が当たり前の昨今ではいちいち異なるパスワードを覚えていられません。
そこで、アプリケーションごとではなく共通のパスワードを使用してログインを行うことが多々あります。
ですが、パスワードの使い回しは「パスワードリスト攻撃」という攻撃の対象となります。
この攻撃は流出したユーザー識別子とパスワードを用いて、Web サイトで不正なログインを試みる方法です。
パスワードを使いまわすことで、どこかのサイトのログインができてしまい、情報が抜き取られる可能性が高まります。

② 推測されやすいパスワードの使用

こちらも適切なパスワードではないと知っていても、ランダムなパスワードを全て覚えていられないので、覚えるために使用する場合があります。
ただ、推測されやすいパスワードを使用すると今度は「パスワードスプレー攻撃」で情報を抜き取られる可能性が上がってしまいます。
パスワードスプレー攻撃とは、同じパスワードを使用して複数のユーザー情報を入力してサイトにログインしようとする攻撃です。
推測されやすいパスワードを使用していると、攻撃用に使用するパスワードと一致する可能性が高くなりパスワードスプレー攻撃の被害を受けやすくなります。
③ フィッシングアプリへのパスワード入力
フィッシングサイトとは、正規のサイトと見た目が全く一緒の偽物サイトです。
主に個人情報を入力させ、入力した情報を抜き取るために使用されます。
見た目が全く一緒なので、ユーザーはついパスワードなどを入力してログインを行ってしまい、情報を抜き取られてしまいます。
実際 IPA が発表する情報セキュリティ 10 大脅威 2023では、昨年から引き続きフィッシングサイトによる個人情報の詐取が 1 位となっています。
2023-11-03_12h27_30.png
これだけ主要な攻撃のため、ユーザー側のリテラシーを求め、引き続きパスワード認証を使用するというのは限界があります。
以上パスワード認証による課題を見てきました。
この課題を解消する方法の一つとして、今回紹介する Passkey があります。
では次に Passkey の概要について説明します。

Passkey って何?

Passkey とは、パスワードレス認証基準を普及させる団体である「FIDO アライアンス」によって策定された、新しいパスワードレス認証方法を指します。
パスワードレスという字面の通り、パスワードを入力しなくてもログインすることが可能となります。
Web サイトで Passkey を用いる場合、技術的 WebAuth と FIDO2 が使用されます。
FIDO2 については、この後もう少し説明しますが公開鍵暗号方式を用いた認証となります。
WebAuth はこの FIDO2 をブラウザ上で使用できるようにしたものとなります。
では、FIDO2 をもう少し見ていきます。

FIDO2 の概要

FIDO2 とは、おもに Web 上で FIDO(ファイド)認証を可能にする認証技術です。
サイトでパスワードを入力させる代わりに、パソコンやスマホなどを認証機器として使用し認証できるようにします。
サイトに紐づく認証機器を決めたら、認証機器には秘密鍵をサイトには公開鍵を登録するようにします。
登録が完了したら、サイトと認証機器間はパスワードの代わりに、乱数のやり取りを行います。
そして、認証機器にある秘密鍵で乱数を署名して、サイトにある公開鍵で検証を行います。
検証が完了すれば、認証を行います。
このように認証機器さえ持っていれば認証できるようなるため、先程挙げたパスワード認証による課題を解消できます。
以上が FIDO 認証の概要です。
ここまでの説明で超ざっくりと概要を説明しましたが、実際のフローを見たほうが分かりやすいと思います。
なので、FIDO 認証を使用したユーザー登録とユーザーログインのフローを見ていきます。

FIDO を用いたユーザー登録

ユーザー登録のフローは以下の通りです。
【技術概要】FIDO認証はなぜパスワードが不要なのかより引用
【技術概要】FIDO 認証はなぜパスワードが不要なのかより引用
大まかな流れは以下の通りです。
① ユーザーがサイトでユーザー登録を行います。
② サイト内において、FIDO を利用できる認証用の機器を選択します。
③ 選択した機器を指紋認証、安全な入力をサポートした PIN コード入力などで機器のロックを解除します。
④ ロック解除後、公開鍵/秘密鍵を生成します。
⑤ 秘密鍵は認証機器に保存し、公開鍵をサイトに送ります。
⑥ サイトは受け取った公開鍵を登録します。
これで、ユーザー登録が完了しました。
ここまでで、サイト内でパスワードは一切入力していません。
あくまで、サイトに紐づく鍵を認証機器で作成して、公開鍵のみをサイトに登録しているのみです。
そのため、仮にサイトから情報鍵を抜き取られてしまっても公開鍵なので問題ありません。
また、秘密鍵自体は認証機器へ外部公開せずに保存されているので、認証機器そのものを盗まれない限りなりすましによるログインを行うことができません。

FIDO を用いたログイン

ログインのフローは以下の通りです。
【技術概要】FIDO認証はなぜパスワードが不要なのかより引用
【技術概要】FIDO 認証はなぜパスワードが不要なのかより引用
ざっくりした流れは以下の通りです。
① サイトのログイン画面に遷移します。
② サイトは認証を行う、認証機器の選択をさせます。
③ 認証機器の選択後、対象の認証機器に対して乱数を送信します。
④ 認証機器のロックを解除します。
⑤③ で取得した乱数に対して、秘密鍵で署名し、サイトに送信します。
⑥ サイトは登録した公開鍵を使い、署名の検証を行います。
⑦ 検証に問題が無ければ、認証を完了とします。
パスワードの代わりになるものとして、乱数を使用しておりパスワードは使っていません。
この乱数は例え抜き取られてしまったとしても、認証機器が無ければ秘密鍵による署名を行うことができません。
また、署名を行った乱数を改ざんしたとしても検証が失敗するので、改ざんもできません。
以上のことから、ユーザー登録時と同様にパスワードがなくても安全な認証が可能となります。

Auth0 での設定

Passkey についてざっくり解説したので、実際に Auth0 で使用してみます。
なお、今回は Auth0 で従来のログインができることを前提にして話をしています。
そのため、Auth0 でのログイン機能が搭載されていない場合は、クイックスタートで別途準備してください。
Authentication→Database→Username-Password-Authentication を選択します。
すると、複数のタブが表示されるので、Authentication Method を選択します。
選択すれば、Passkey の設定をできる項目が表示されるので、トグルを有効にします。
2023-11-01_21h54_33.png
実は Passkey を有効にするのはこの設定だけで十分です。
とても簡単ですね。
ただ、既存の設定では使用できない場合がありますので、この後は Passkey を使用できる条件について解説します。

Passkey を使用できる条件

Passkey を使用するには、Auth0 の設定が以下のようになっていることが求められます。
①Auth0 が用意しているデータベースを使用する
②New Universal Login を有効にする
③ ログインページのカスタム機能を無効にする
④ ログイン時のフローを「Identifier First」にする
⑤ ログイン時に Username を求める機能を無効にする
それぞれ見ていきます。

①Auth0 が用意しているデータベースを使用する

ユーザー情報を保存するためのデータベースは、Auth0 が用意しているデータベースではなく、自前で用意したデータベースを使用する機能が Auth0 にはあります。
この機能をCustom Databaseといいます。
これによって、Auth0 を使用しているユーザーが一定の制約はあれど、自由にデータを保存することができます。
このように便利な機能ですが、2023/11/01 時点ではこの機能を使いつつ Passkey を有効にすることはできません。
そのため、Passkey を使いたい場合は「Authentication > Database >使用しているデータベース名 > Custom Database」からカスタムデータベースの設定を無効にする必要があります。

②New Universal Login を有効にする

Passkey を使用するには「Branding > Universal Login > Advanced Options > Universal Login Experience」で画像のように「New」を選択する必要があります。
2023-11-03_10h11_51.png
画像には「New」のほかに、「Classic」もありますので、各種類の特徴を説明します。
Auth0 ではログイン画面の種類として、「New Universal Login」と「Classic Universal Login」を選択できます。
名前が示す通り、「New Universal Login」が後にできて、「Classic Universal Login」が先にできています。
二つのログインページができることは、こちらのドキュメントにまとめられていますが、それぞれの特徴をざっくりいうと以下の通りになります。
New Universal Login: デザインのカスタマイズ性は乏しいが多くのログインに対応している。
Classic Universal Login: デザインのカスタマイズ性は高いが、サポートがない。
Classic Universal Login は Auth0Lock という React 製のライブラリを使って自分でログイン画面を組み立てることができます。
コードを書く必要はありますが、その分比較的自由に要素を差し込むことができます。
一方で、MFA ログインには対応しておらず、今回の主題である Passkey 関連も対応していません。
さらに、Auth0 は今後 Classic Universal Login のサポートはせず、新機能の追加もしないとしています。
よって、どうしてもログイン画面を大きくカスタマイズしたい場合以外は、Classic Universal Login は使用しないことが推奨されます。
Classic Universal Login はサポートがないと言いましたが、New Universal Login は Classic Universal Login に搭載されていない機能を一通り対応しています。
今回の Passkey も対応していますし、新機能についても随時対応していくとしています。
なので、基本的には New Universal Login を使用するのが良いです。
ただ、一点注意点があります。
New Universal Login は Auth0 側が用意した GUI でしかカスタマイズができないので、別途ログイン画面に要素を追加するなど画面の柔軟性はなくなっています。
今後デザインももう少し自由にできるかもしれませんが、現状はできないことはご留意ください。
以上「New Universal Login」と「Classic Universal Login」の違いを説明しました。
基本的に新機能は「New Universal Login」のみに搭載されるので、今回新しくできた Passkey も「New Universal Login」だけで使用できます。
そのため、「New Universal Login」を有効にする必要があります。

③ ログインページのカスタム機能を無効にする

「Branding > Universal Login > Advanced Options 」の Login タブで「Customize Password Reset Page」を無効にします。
「②New Universal Login を有効にする」で説明したように、New Universal Login を有効にしていると Login 画面を HTML でカスタマイズできません。
そのため、ON にしていようが OFF にしていようが動きに影響はないのですが、Passkey を使うにはこの機能を OFF にしておく必要があります。

④ ログイン時のフローを「Identifier First」にする

「Authentication > Authentication Profile 」でログインする時のフローを「Identifier First」へ設定します。
設定は以上ですが、Authentication Profile には 3 つのフローがあるので、それぞれ説明します。 **Identifier + Password**
このフローは字面の通りユーザー識別子とパスワードを入力してログインするフローです。
具体的なフローは以下の通りです。
2023-11-03_10h45_04.png
ログイン画面でメールアドレスとパスワードを入力し、入力内容がデータベースと一致すればログインを完了とするフローです。
そして、二要素認証を有効としている場合は、その対応を行ってからログインを完了とさせます。 **Identifier First**
このフローはまずユーザー識別子を入力させ、一致するユーザーが存在すればパスワード入力によるログインか Azure AD などを使ってログインを行うことを選択できるようにしたフローです。
具体的なフローは以下の通りです。
2023-11-03_11h00_24.png
フローの流れ自体は Identifier + Password と大体一緒ですが、外部の認証方式を使用できることや Passwordless によるログインを可能としている部分が Identifier + Password とは異なります。
Passkey は Passwordless な認証方法なので、使用するには Identifier First のフローが必要となります。
Identifier First + Biometrics
このフローは Identifier First に生体認証を追加したフローです。
具体的なフローは以下の通りです。
2023-11-03_11h11_22.png
Identifier First に生体認証のフローも追加しています。
生体認証を行えるユーザーは生体認証でログインを行います。
生体認証を行った場合は既に二要素認証が完了しているので、そのままログインします。
生体認証が有効でないユーザーの場合は、Identifier First と同様にパスワードやパスワードレスで認証して、ログインします。
なお、このフローは Enterprise プランしか使用できません。
以上のように、Passkey はパスワードレスな認証のため、Identifier First のログインフローを有効にしておく必要があります。

⑤ ログイン時に Username を求める機能を無効にする

「Authentication > Database >使用しているデータベース名 >Settings」から「Requires Username」を無効にします。
この機能はログイン時に、ユーザー識別子としてメールアドレスだけでなく、ユーザー名の入力も求めるものとなっています。
Passkey 的にはあってもなくてもいい気がするので、なぜこの機能をわざわざ無効にする必要があるかは分かりません。
とはいえ、無効にしないと Passkey は使用できないので無効にします。
以上 Passkey を使うのに必要な設定をみていきました。
色々と書きましたがこれから Auth0 を構築する場合、④ ログイン時のフローを「Identifier First」にする以外はデフォルトで設定が完了しているので、特に対応する必要がありません。
また、設定に不備があった場合は Passkey を有効にする際、以下のような画像で教えてもらえるので、何をすればよいか把握していればそこまで難しいものではありません。
2023-11-03_11h26_54.png

Passkey の動作確認

最後に Auth0 での動作を確認します。
まず Auth0 が動くアプリケーションを立ち上げ、Auth0 のログイン画面に遷移します。
すると画像のように、メールアドレスだけを入力するフォームと Passkey によるログインを行うボタンが存在する画面を確認できます。
2023-11-03_11h34_27.png
まだアカウントがないので Sign up をクリックしてアカウントを作成します。
任意のメールアドレスを登録すると、以下のような画面が表示されます。
2023-11-03_11h36_09.png
「Create a passkey」をクリックすると、画面のような鍵を保存しておくデバイスを選択するモーダルが表示されます。
2023-11-03_11h37_35.png
今回は Windows PC に保存するので、「Windows Hello または外部セキュリティキー」をクリックします。
すると、パソコンのロックを解除するように求められるので、PC のセットアップ時に設定した方法でロックを解除します。
これで Passkey によるユーザー登録は完了です。
次に Passkey でログインしてみます。
再度 Auth0 のログイン画面を表示させ、「Continue with a passkey」をクリックします。
すると先程と同様に以下のモーダルが表示されるので、「Windows Hello または外部セキュリティキー」をクリックします。
2023-11-03_11h37_35.png
するとパソコンに保存されているユーザー情報を選択する画面が表示されます。
対象のユーザーを選択し、パソコンのロックを解除すればログインが完了します。
以上で Passkey の動作確認が完了しました。
認証用のデバイスを無くした時大変というデメリットはありますが、デバイスをなくしさえしなければパスワードを使った認証より安全とされているので、積極的に使用していきたいですね。
実際、Google もPasskey を使ったログインを導入していくと発表していので、これから益々認証方法として普及していきそうです。

おわりに

今回は Auth0 に搭載された Passkey についてみていきました。
設定は簡単で、かつパスワードレスを搭載できる個人的にはとてもワクワクさせる機能でした。
セキュリティの重要性が高まっているこれからは、Passkey を使ったログインがどんどん主流になっていくと思うので、引き続き動向を追っていこうと思います。
ここまで読んでいただきありがとうございました。

Discussion