Site cover image

fhhm’s blog

📔『パスキーのすべて』を読んだ

『パスキーのすべて』を読んだので理解をまとめてみる。

認証の三要素

NIST SP 800-63で認証の三要素が定義されている。

  • 知識認証: 特定の情報を知っていることを証明する(e.g. パスワード)
  • 所有認証: あるモノを所有していることを証明する(セキュリティーキー、スマートフォン、SIMカード)
  • 生体認証: 身体的特徴の一致を証明する(e.g. 指紋、顔、虹彩)

背景

パスワード認証

下記の点で課題がある。

  • 弱いパスワード(e.g. 類推しやすいパスワード)を作ってしまう
  • 同じパスワードを使いまわしてしまう
  • フィッシング耐性がない

パスワードマネージャーで上記の課題を一定解決できるが、別の課題もある。

  • サービス側で利用を強制できない
  • 利用に一定のリテラシーが必要
  • サービス側が対応しきれていないケースがある
    • e.g. 3Dセキュアでは、クレジットカード会社のID/パスワードを使うが、クレジットカード会社のドメインと3Dセキュアのドメインが異なるケースがある

パスワードレス認証

パスワード認証には課題があるので、パスワードを使わないようにしようという考え方がパスワードレスである。マジックリンクSMS認証などがこれにあたる。パスキーもパスワードレス認証であると言える。

ID連携

認証を必要とするサービス(RP: Relying Party)がIdPと連携する方法で、下記のメリットがある。

  • 新しいID/パスワードの管理負担が減る
  • 実装がシンプル(RPは認証機能の多くをIdPに依存できる)
  • IdPから名前、メールアドレスなどを取得できる

一方で下記のデメリットも存在する。

  • IdPの稼働に依存する
  • 多くのユーザーをカバーするためには多くのIdPとの連携をサポートする必要がある
    • 複数のIdPとのID連携を可能にすると、ログイン用ボタンが増え、ユーザーがどのIdPでログインしたか分からなくなる

WebAuthn

FIDO2

FIDO2(Fast IDentity Online 2)は認証の国際標準規格である。WebAuthn(認証に関するブラウザとWebサービス間のAPI仕様)とCTAP2(Client to Authenticator Protocol)(認証器とブラウザ間の通信仕様)の2つの仕様群で構成される。

WebAuthn

WebサイトはWebAuthn APIを使うことで下記ができる。

  • 認証器にFIDO2クレデンシャルを作成する
  • 認証機のFIDO2クレデンシャルを使って認証すること

大まかな処理の流れは下記の通り。

sequenceDiagram
    participant User as ユーザー
    participant Authenticator as 認証器
    participant Browser as ブラウザ
    participant Server as サーバー
    
    Note over User,Server: FIDO2クレデンシャル作成
    User ->> Browser: 登録操作
    Browser ->> Server: 登録開始リクエスト
    Server -->> Browser: クレデンシャル作成要求(challenge等)

    Browser ->> Authenticator: クレデンシャル作成要求(CTAP2)
    Authenticator ->> Authenticator: 公開鍵・秘密鍵ペアを生成
    Authenticator ->> Authenticator: FIDO2クレデンシャル(秘密鍵)を安全に保存
    Authenticator -->> Browser: 公開鍵クレデンシャルを返却

    Browser ->> Server: 公開鍵クレデンシャルを送信
    Server ->> Server: 公開鍵をユーザー情報と紐付けて保存
    
    Note over User,Server: FIDO2クレデンシャル認証
   
    User ->> Browser: ログイン操作
    Browser ->> Server: 認証開始リクエスト
    Server -->> Browser: 認証リクエスト(challenge)

    Browser ->> Authenticator: 認証要求(CTAP2)
    Authenticator ->> Authenticator: 秘密鍵で署名を生成
    Authenticator -->> Browser: 署名を返却

    Browser ->> Server: 署名を送信
    Server ->> Server: 公開鍵クレデンシャルで署名を検証
    Server -->> Browser: 認証成功

デバイス認証

パスキーの登場前の、デバイスのみに保存されるFIDO2クレデンシャルを使った認証方式がデバイス認証と呼ばれる。デバイス認証は所有認証知識認証または生体認証による一段階二要素認証と考えられ、下記のメリットが存在する。

  • フィッシング耐性がある
  • 追加のアプリケーションやデバイスが不要
  • ワンステップで認証可能

一方で下記のデメリットも存在する。

  • 新しいデバイスを登録する際に、別の方法でログインしないといけない
  • デバイスの紛失に対応しづらい
  • デバイスの移行が大変

パスキー

デバイス認証をより使いやすくしたものがパスキーである。技術的にはデバイス認証の延長であるが、下記の点が異なる。

  • FIDO2クレデンシャルにドメインやユーザーアカウント情報などのメタデータがセットとなる
  • ディスカバラブルクレデンシャルが必須
  • パスキープロバイダ(パスワードマネージャー)にも保存/同期できる

ディスカバラブルクレデンシャル

デバイス認証では、ユーザーがアカウント名を入力したりCookieを使ってユーザーを特定し、サーバーに保存されている公開鍵クレデンシャルと一緒にWebAuthnAPIを呼び出していた。ディスカバラブルクレデンシャルによって、ユーザーを特定しなくても認証が可能となる。

sequenceDiagram
    participant User as ユーザー
    participant Authenticator as 認証器
    participant Browser as ブラウザ
    participant Server as サーバー

    User ->> Browser: ログインボタンを押す
    Browser ->> Server: 認証開始(ユーザー識別情報なし)

    Browser ->> Authenticator: このサイトの認証を開始
    Authenticator ->> Authenticator: このサイト用のクレデンシャルを発見
    Authenticator ->> User: 生体認証/PIN を要求
    User -->> Authenticator: 認証

    Authenticator -->> Browser: 認証結果(ユーザー特定済み)
    Browser ->> Server: 認証結果送信

    Server -->> Browser: ログイン成功

同期

秘密鍵とメタデータをパスワードマネージャーサーバーに保存することで、複数端末で認証が行えるようになる。同期の際には、デバイスのPINやパスワードマネージャーのマスターパスワードで暗号化される。

登録デバイスと別のデバイスでパスキーを利用するには、まずパスワードマネージャーへログインを行い、その後、復号のためにPINを入力する必要がある。