パスキーでサインインの安全性と利便性の課題を同時に解決

2024年4月22日(月)
高久 隆史
第1回目となる今回は、パスキーの仕組みやパスキーを利用できるデバイスやサービスの状況、そしてKeycloakのパスキーへの対応状況などを紹介します。

パスキー(Passkeys)とは、パスワードレスの認証方式で、従来のパスワード認証やパスワード+第2要素による認証に代わる安全性と利便性の課題を同時に解決するサインインの仕組みです。昨今、パスキーの認知度は向上しており、導入サービスも急速に増えています。私自身、パスキーを利用していますが、この記事を読んでいる皆さまもすでに何らかのサービスでパスキーを利用している人も多いのではないかと思います。それでも、世の中のサービス全体から見ると、まだパスワードを利用した認証が圧倒的多数を占めている状況となっています。

Keycloakとは、IDアクセス管理(IAM:Identity and Access Management)のOSSであり、WebアプリケーションおよびAPI・マイクロサービスの認証や認可を実現できます。Keycloakは2023年4月にCNCF(Cloud Native Computing Foundation)のIncubatingプロジェクトとして承認※1され、エンタープライズでの導入実績も多数あります。またKeycloakを利用して、それらのサービスの認証をパスキーに対応させることもできます。

本連載では、パスキーの概要、Keycloakを利用してパスキーの登録と認証を行う手順を紹介します。第1回では、パスキーの仕組み、デバイスや導入サービスの状況、事例、メリット、Keycloakのパスキー対応状況などについて紹介します。

※1:CNCF IncubatingプロジェクトになったKeycloak入門

パスキーとは

パスキーは、パスワードレスのFIDOクレデンシャル(認証資格情報)、またはそのFIDOクレデンシャルを利用した認証方式を示します(パスキーの定義は必要に応じてFIDO ALLIANCEのページも参照してください)。

パスキーは、従来のパスワード認証、および、パスワード+第2要素(OTPや電話)による認証における安全性と利便性の課題を同時に解決する認証方式※2として注目されています。

また、OSプラットフォーム主要3社(Apple、Google、Microsoft)とFIDO Allianceが協力して推進※3していることから、今後のさまざまなサービスのサインインにおいて主流となることが想定されています。

※2:FIDO Alliance - FAQ's - Passkeys - WHY ARE PASSKEYS BETTER THAN PASSWORD + SECOND FACTOR?

※3:Apple、Google、Microsoftが、パスワードレスサインインの利用促進に向けてFIDO標準のサポート拡大を表明(2022/5/5)

パスキーの仕組み

パスキーはパスワードの代わりに、公開鍵暗号方式とデバイス認証を組み合わせて認証します。パスキーを登録するとき、および、パスキーでサインインするときの仕組みと流れを次に示します。

図1:パスキーを登録するときの仕組み

図1:パスキーを登録するときの仕組み

表1:パスキーを登録するときの流れ

処理概要
前提サービスのアカウントにパスキーでサインインできるようにします。
既存アカウントの管理画面などでパスキーを登録する場合や、新規アカウント作成と同時にパスキーを登録する場合がありますが、ここでは、パスキー登録の操作を行ったときからの流れを記載します
(1)ユーザーはユーザーデバイス上のアプリやブラウザでサービスを開き、パスキー作成ボタンをクリックするなどして、パスキー登録を行います。サービスに登録要求が送信されます
(2)サービスは、1回限りのチャレンジを含む情報を送信します
(3)ユーザーデバイスでデバイス認証が求められるので、ユーザーは認証操作を実行します
(4)ユーザーデバイスは、公開鍵と秘密鍵のキーペアを作成します
(5)ユーザーデバイスは、公開鍵を含む情報をサービスに送信します。サービスがチェックして問題なければサービス側でユーザー識別子に紐づけて公開鍵を登録します
図2:パスキーでサインインするときの仕組み

図2:パスキーでサインインするときの仕組み

図3:パスキーでサインインするUIの例(「<a href="https://passkeys.dev/docs/reference/terms/#autofill-ui" class="link">https://passkeys.dev/docs/reference/terms/#autofill-ui</a>」より引用)

図3:パスキーでサインインするUIの例(「https://passkeys.dev/docs/reference/terms/#autofill-ui」より引用)

表2:パスキーでサインインするときの流れ

処理概要
前提サービスにサインインするためのアカウントとパスキー(FIDOクレデンシャル)は作成済みとします
(1)ユーザーはユーザーデバイス上のアプリやブラウザでサービスを開き、一覧からサインインしたいパスキー対応済のアカウントを選択します。サービスにチャレンジ要求が送信されます
(2)サービスは、アカウントに対応する公開鍵を利用して1回限りのチャレンジ(署名要求)を送信します
(3)ユーザーデバイスでデバイス認証が求められるので、ユーザーは認証操作を実行します
(4)ユーザーデバイスは、秘密鍵で署名を生成してサービスに送信します。サービスが署名をチェックして問題なければサインインが成功します

上記のパスキーの仕組みにおける安全性と利便性の向上ポイントを説明します。

安全性のポイント

パスキーはデフォルトで公開鍵暗号方式とデバイス認証(顔、指紋、PINなど)を組み合わせた多要素認証になります。認証要素は、「SYH & (SYA || SYK)」となります。SYH(Something You Have)は所持情報で、デバイスに保存されるパスキーの秘密鍵が該当します。SYA(Something You Are)は生体情報で、デバイス認証の顔認証または指紋情報が該当します。SYK(Something You Know)は知識情報でデバイス認証のPINが該当します。

パスキーの秘密鍵とデバイス認証のクレデンシャル(顔や指紋の生体情報やPINなど)は、サービスに送信されません。送信される署名もチャレンジに対応する1回に限り有効な署名であり、盗聴されても悪用できないため、盗聴やフィッシングによる被害のリスクがありません。

サービス側に保存される公開鍵は盗まれても不正ログインに利用できません。パスワード認証のように、サービス側からパスワードのような認証に必要なクレデンシャルが漏れてしまうリスクがありません。また、パスキーの公開鍵は盗む価値がないため、パスキーに対応したサービスは、ハッカーの攻撃のターゲットにもされにくくなります。

デバイス認証の手段には生体認証だけでなくPINもあり、PINだとパスワードと変わらないか、むしろ危険では? と思われる方もいらっしゃるかもしれませんが、PINはパスワードよりも安全です。なぜならPINはデバイス内でのみ利用され、サービス側に保存されたり、ネットワークで送信されたりしないため、盗難被害のリスクが小さくなるからです。また万が一PINが盗まれても、デバイスがなければサービスにサインインされてしまうことはありません。

利便性のポイント

パスキーを利用することで、ユーザーはパスワード入力の代わりに使い慣れたデバイス認証を利用して、素早くログインできます。パスキーを利用するユーザーは、アカウント名の入力も不要です。図2は、WebAuthnのAutofill※4という機能を利用した例ですが、この機能を利用すると、ユーザーがアカウント名のテキストボックスをクリックしたときに、保存されているパスキーのアカウント名を自動的に表示させることができ、より使いやすいUIを実現できます。

※4:WebAuthn パスキーの自動入力を使用したフォームへのパスワードレス ログイン | Identity | Chrome for Developers

デバイスバウンドキーと同期パスキー

パスキーには、デバイスバウンドパスキーと同期パスキーがあります。それぞれのイメージ、概要、特徴を次に示します。

図4:同期パスキーとデバイスバウンドパスキーのイメージ

図4:同期パスキーとデバイスバウンドパスキーのイメージ

デバイスバウンドパスキー

デバイスバウンドパスキーは単一デバイス上に存在し、デバイスの外に出ることのできないパスキーです。利便性の面では、デバイスの故障・紛失・機種変更時に、サインインの再設定などの手間がかかるというデメリットがあります。一方、安全性の面では課題はありません。なぜならデバイスバウンドパスキーのクレデンシャルは「同期」しないので、「同期」の部分に安全性の綻びが生じませんし、アタックサーフェスや漏洩時の影響も限定されるからです。

同期パスキー

同期パスキーは複数デバイス間で同期して共有できるパスキーです。デバイスバウンドパスキーのデメリットを解決するためにできました。利便性の面では、デバイスの故障・紛失・機種変更時に新しいデバイスに同期してそのまま利用できるメリットがあります。

一方、安全性の面についても、暗号化されて安全に保存・同期することが考慮されています。例えばiPhoneでパスキーを作成する場合、iCloud keychainによって256ビットAES暗号化されて保存され、同じApple IDのデバイスに同期できます。同じく、Androidで作成する場合は、Google Password Managerで暗号化され、保存、同期できます。ただし、複数のデバイスで利用できることを考慮した管理が必要になります(例:退職した社員が別のデバイスに同期して利用できないように管理する、など)。また、一部の同期パスキーでは管理者向けの機能で同期しない設定にもできます。

同期パスキーの状況についていくつか補足します。

2024年3月の時点では、Apple ID(iCloud Keychain)と Googleアカウント(Google Password Manager)間で同じパスキーを同期できないという課題があります。もし、Androidのスマートフォンで作成したパスキーをiPad上でも使いたい場合には、後述の「近くの他デバイスのパスキー利用(クロスデバイス認証)」の手順を利用するか、両方のデバイスに対応しているサードパーティのパスワードマネージャを利用する必要があります。

Apple IDのパスキーは、信頼できる他の人(Apple ID)と共有できる機能※5や、企業の管理者向けのその共有機能のオフ設定や同期可能なレベルをAny Device、Managed Devices Only、Supervised Devices Onlyの3段階で制御するための機能※6があります。

※5:iPhoneで信頼できる人たちにパスワードまたはパスキーを共有する - Apple サポート(日本)

※6:Deploy passkeys at work - WWDC23 - Videos - Apple Developer

Googleアカウントのパスキーには、少なくとも次のURLを参照した限りでは、上記Apple IDのような、他の人と共有できる機能や企業の管理者向けの同期管理機能は見当たりませんでした。

Windows Helloのパスキーは、現時点では、同期パスキーには対応していません。後述の「近くのデバイスのパスキー利用(クロスデバイス認証)」を用いて、Android/iOS/iPadOSにあるパスキーを使うことはできます。

近くの他デバイスのパスキー利用
(クロスデバイス認証)

パスキーは物理的に近くにある他デバイスのサインインにも利用できます。これをクロスデバイス認証(FIDO Cross-Device Authentication、CDA)といいます。例えば、会社の共用PC、インターネットカフェなどのパスキーが保存されていないデバイスでサービスにサインインする際に、個人が保有しているAndroid/iOS/iPadOSのデバイスを利用してサインインできます。

クロスデバイス認証において、このサービスを利用するデバイスをクライアント、サービスへの認証を行うデバイスを認証器と言います。クロスデバイス認証の構成図を次に示します。

図5:クロスデバイス認証の構成図

図5:クロスデバイス認証の構成図

上記構成でクライアントにWindows+ChromeのPC、認証器にAndroidのスマートフォンを利用して、実際にGoogleアカウントへのログインを実施してみました。そのときの操作の流れを次に示します。

図6:Googleアカウントのクロスデバイス認証の操作の流れの例

図6:Googleアカウントのクロスデバイス認証の操作の流れの例

表3:Googleアカウントのクロスデバイス認証の流れの例

操作対象
デバイス
操作手順例
前提・Windows PCとAndroidスマートフォンを利用します(今回はWindows10、Android 13で確認)
・WindowsにChromeをインストール済みとします(Chromeバージョンは確認時の最新)
・AndroidスマートフォンのGoogleアカウントはパスキーを作成済みとします
・Windows PCとAndroidスマートフォンはインターネット接続済み、かつBluetooth有効化済み、かつBluetooth通信が届く距離に置いておきます
・PCのブラウザでGoogleログインページを開いているところからの手順とします
1PC「アカウント選択」で自分のアカウントをクリックします
2PC「パスワード入力」で「別の方法を試す」をクリックします
3PC「ログイン方法を選択してください」で「パスキーを使用」をクリックします
4PC「パスキーを使って本人確認を行います」で「次へ」をクリックします
5PC「別のパスキーを使用しますか?」でQRコードが表示されます
6スマホ端末ロックを解除して、適当なQRコードアプリを開いてスキャンします
7スマホ「ブラウザで開く」をタップします(アプリにより操作は異なります)
8スマホ「画面ロックを使用する」が表示されるので、指紋認証を実施します(このあと「QRコードをスキップしますか?」でOKをクリックしておきます)
9デバイスAでGoogleへのログインが完了します
図7:Googleアカウントのクロスデバイス認証の流れの例(2回目以降のQRコードスキップ時)

図7:Googleアカウントのクロスデバイス認証の流れの例(2回目以降のQRコードスキップ時)

表4:Googleアカウントのクロスデバイス認証の流れの例(2回目以降のQRコードスキップ時)

操作対象デバイス操作手順例
前提初回の手順8に記載のQRコードスキップでOKをクリックしておきます
1~4PC初回と同じです
5PC「?のパスキーを使用して google.comにログインする」で「続行」を選択します
6スマホ「本人確認」の通知が届くので、タップして端末ロックを解除して通知を開きます
7スマホ「画面ロックを使用する」が表示されるので、指紋認証を実施します
8デバイスAでGoogleへのログインが完了します

Windows+Androidの場合、2回目からはQRコードなしでサインインできるのが便利でしたが、今回のGoogleアカウントでのクロスデバイス認証は少し操作ステップが多い印象です(それでも、SMSによるOTP認証よりは楽だと感じました)。今回の例だと、QRコードなしで手順2?4をなくして、手順1からスマホに通知を送ってもらえるともっと便利になると感じました。

このように他のデバイスで認証する手順は、以下のページにも記載されていますので、必要に応じて参照してください。

株式会社日立製作所
日立ミドルウェアの開発やOSS活用関連業務に従事。

連載バックナンバー

セキュリティ技術解説
第1回

パスキーでサインインの安全性と利便性の課題を同時に解決

2024/4/22
第1回目となる今回は、パスキーの仕組みやパスキーを利用できるデバイスやサービスの状況、そしてKeycloakのパスキーへの対応状況などを紹介します。

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています