Ruby /WebAuthnでのパスワードレス（パスキー）
実装動向
コーポレートデザイン部
セキュリティグループ 板倉景子

Copyright© Medley, Inc. ALL RIGHTS RESERVED.

1

自己紹介

島根県出雲市出身
2005年

Unisys 総合技術研究所
システムエンジニア

2008年

Microsoft Consulting Services
技術コンサルタント

2015年

IBM セキュリティ事業部
Manager

2019年

楽天グループ エコシスエムサービス部
Principal Information Security Specialist／
FIDO アライアンス
Japan Leadership Group/副座長

2023年 メドレー コーポレートデザイン部
全社情報セキュリティ推進責任者

Copyright© Medley, Inc. ALL RIGHTS RESERVED.

2

目次

パスワードレス認証（パスキー）に関わる最新動向について、Ruby実装の観点をふまえご紹介させていただきます。

1

認証手段の歴史と課題

2

パスキー（synced passkeys)の登場と関連技術

3

Rubyでのパスキー実装

Copyright© Medley, Inc. ALL RIGHTS RESERVED.

3

1

認証手段の歴史と課題2パスキー（synced passkeys)の登場と関連技術

3

Rubyでのパスキー実装

Copyright© Medley, Inc. ALL RIGHTS RESERVED.

4

認証手段の歴史と課題

パスワード認証における課題●●●

パスワードは覚えられない○ 覚えやすい簡単なパスワードの設定○ パスワードの使いまわし
多くのセキュリティインシデントがアカ
ウント乗っ取りを起因として発生
パスワード忘れによる問い合わせ対応、パスワードリセット運用コストの発生

On the Internet, nobody knows you're a dog
インターネット上ではあなたが犬だと誰も知らない」「

Copyright© Medley, Inc. ALL RIGHTS RESERVED.

5

認証手段の歴史と課題

多要素認証における課題

パスワードリセットを悪用してアカウントを乗っ取る等、多要素認証でも防げない攻撃も報告されている。

Copyright© Medley, Inc. ALL RIGHTS RESERVED.

6

認証手段の歴史と課題

従来のパスキー（device-bound passkeys）

公開鍵暗号方式を活用し、認証器による所持をベースとした認証を行う。

クライアントサーバー

RPクライアントアプリ

WebAuthn

RPサーバーアプリ

Webブラウザ

CTAP
公開鍵
認証器

WHAT IS A PASSKEY?
Any passwordless FIDO credential is a passkey.
https://ﬁdoalliance.org/passkeys/

Copyright© Medley, Inc. ALL RIGHTS RESERVED.

7

認証手段の歴史と課題

パスキーのフィッシング耐性

フィッシング耐性のー例として、認証器はRP（サービス提供者）サーバーの識別子に対して署名したものを送付し、RP（サービス提供者）サーバーはその署名を検証する。
＝中間者が入っていれば署名検証で検知できる＆RP（サービス提供者）サーバーとドメインが異なるサーバーでは認証できない。

RP（サービス提供者）
サーバーの識別子に対して署名したもの
本人確認の検証結果

生体情報など

ユーザー

認証器
サーバー
信頼関係
Copyright© Medley, Inc. ALL RIGHTS RESERVED.

8

1

認証手段の歴史と課題

2

Synced Passkeysの登場と関連技術

3

Rubyでのパスキー実装

Copyright© Medley, Inc. ALL RIGHTS RESERVED.

9

Synced Passkeysの登場と関連技術

従来のパスキーの課題

認証器の保持を前提とした認証方式のため、認証器自体を紛失した場合や破損した場合、どうやってアカウントを復旧させるかが課題であった。

デバイスの紛失
別の端末

デバイスの故障

パスコー
ド

OTP

Copyright© Medley, Inc. ALL RIGHTS RESERVED.

10

Synced Passkeysの登場と関連技術

Synced passkeysとはパスキーをパスキープロバイダー（クラウド事業者やパスワードマネージャ事業者）に保存し、FIDO認証に関する設定も移行するようにするもの。
※Device boundな資格情報の必要性についても引き続き議論されている。

AZX

Y

A+

FIDO
認証資格情報A +Device-bound passkeys

Synced passkeys（それぞれの端末に別々の鍵が保存される）（同じ鍵が利用デバイスに保存される）

Copyright© Medley, Inc. ALL RIGHTS RESERVED.

11

パスキーの登場と関連技術

Autofill UI – 自動入力 UI

現在のユーザーが 資格情報を持っているかどうかを確認し、リストとして表示する。
（パスキーもこのリストに含まれる）ユーザーは、パスワードのみならずIDを入力する必要もなくなる。

Copyright© Medley, Inc. ALL RIGHTS RESERVED.

12

パスキーの登場と関連技術

Hybridスマートフォンを認証器として活用可能。プラットフォームをまたいだPasskeysの活用にも利用できるBluetoothにもとづいた技術。

デスクトップPCで 🡪
サインイン

認証用QRコード 🡪 スマートフォンでをスマートフォ 本人確認を行い、認証成功
ンで読み取り5. トンネルの確立(wss)
2. QRコード読み取り
3. BLEスキャン

1. QRコードの表示

4. BLE アドバータイズ

Copyright© Medley, Inc. ALL RIGHTS RESERVED.

13

パスキーの登場と関連技術

デモデモンストレーションを実施します

Copyright© Medley, Inc. ALL RIGHTS RESERVED.

14

パスキーの登場と関連技術

デモ

https://www.youtube.com/watch?v=_QwOXyoetD8

Copyright© Medley, Inc. ALL RIGHTS RESERVED.

15

Synced Passkeysの登場と関連技術

従来の認証方法との比較－１

従来の認証手段とパスキーでは、リスクシナリオ（守る場所/対象、責任の主体、影響など）が異なる

パスワード／ワンタイムパスワード
資格情報の機密性

パスキー

パスワードの再利用

チャレンジを生成

フィッシング被害

RPサーバーの識別子に対する署名検証

サーバー側での資格情報の侵害

サーバーに秘密情報を送らない

パスワード保存領域の侵害

パスキープロバイダーの侵害

authenticate2023
Dean H.Saxe [The New Passkey Threat Model]をもとに加工

Copyright© Medley, Inc. ALL RIGHTS RESERVED.

16

Synced Passkeysの登場と関連技術

従来の認証方法との比較－２

可用性の観点でもパスキープロバイダーのリスク評価がポイント※パスキープロバイダーの情報はAAGUIDから取得可能
https://github.com/passkeydeveloper/passkey-authenticator-aaguids/blob/main/aaguid.json
パスワード／ワンタイムパスワード
資格情報の可用性

パスキー

パスワード忘れN/A

パスワード保存領域からの削除

認証器やパスキープロバイダーからの削除

EメールやSMS接続不可

N/A

パスワード保存領域接続不可

Device bound passkeys
デバイスの紛失や故障
Synced passkeys
パスキープロダイバー接続不可
アカウントリカバリ失敗
パスキープロバイダーアカウントの削除
パスキープロバイダーのサービス停止

authenticate2023
Dean H.Saxe [The New Passkey Threat Model]をもとに加工

Copyright© Medley, Inc. ALL RIGHTS RESERVED.

17

Synced Passkeysの登場と関連技術

従来の認証方法との比較－３

AirDropによるパスキーの共有など、パスキーの利便性の正しい活用とリスク評価もポイント

パスワード／ワンタイムパスワード
資格情報の復旧

RPでのアカウントリカバリ

パスキー
Device bound passkeys
事前登録した別端末からのリカバリRPによるアカウントリカバリ
Synced passkeys
パスキープロダイバーからのリカバリ
RPでのアカウントリカバリ

資格情報の共有

口頭での共有

N/A

値の共有

Apple Airdrop

authenticate2023
Dean H.Saxe [The New Passkey Threat Model]をもとに加工

Copyright© Medley, Inc. ALL RIGHTS RESERVED.

18

Synced Passkeysの登場と関連技術

プラットフォームごとの対応状況

https://passkeys.dev/device-support/（2023/10/20時点）
Copyright© Medley, Inc. ALL RIGHTS RESERVED.

19

１ 認証手段の歴史と課題
２

Synced Passkeysの登場と関連技術

3

Rubyでのパスキー実装

Copyright© Medley, Inc. ALL RIGHTS RESERVED.

20

Rubyでのパスキー
実装

サンプルコードと仕様情報

パスキーは、WebAuthn API（Web Authentication API）を利用して実装できる。
WebAuthnの仕様はLevel3（ワーキングドラフト）として公開されている。

https://www.w3.org/TR/webauthn-3/

Rubyのライブラリが複数公開されている※FIDOアライアンスの試験に合格し認定されているものの利用を推奨●●●

webauthn-ruby (Cedarcode)devise-passkeys (Ruby Passkeys, wrapper around webauthn-ruby)warden-webauthn (Ruby Passkeys, wrapper around webauthn-ruby)

当該ライブラリを利用したサンプルコード
webauthn-rails-demo-app※Passkeysには複数のライブラリがある
awesome-webauthn
Copyright© Medley, Inc. ALL RIGHTS RESERVED.

21

Rubyでのパスキー
実装

パスキーの実装箇所

Web Authentication API は登録とログインの2つの基本的な機能を持つ。

登録メソッド利用場面

navigator.credentials.create()

●
●

認証

navigator.credentials.get()

●
●

機能

サービスへのユーザー（アカウント）登録時のパスキー登録
サービスの既存ユーザー（アカウント）によるパスキー登録

署名と公開鍵情報を送信既存サービスのログイン時のパスキー認証
ログイン中のユーザー（アカウント）に求めるパスキー認証

署名を送信

Copyright© Medley, Inc. ALL RIGHTS RESERVED.

22

Rubyでのパスキー実装●

実装内容概要（登録）登録ステップでは、2つのAPIを用意する必要がある（API1) ユーザーIDに紐づいたチャレンジレスポンスを発行するAPI（API2）認証器が発行した公開鍵を検証しデータベースに保存するAPI●

登録ステップ概要
0. ユーザーによるパスキー登録要求
1.
2.
3.
4.
5.
6.

RP（サーバー）によるPublicKeyCredentialCreationOptionsオブジェクト作成（API1）
RP（JS APP）によるnavigator.credentials.create()実行
認証器による鍵ペア作成とAttestation署名
認証器によるPublicKeyCredential返却
RP（JS APP）によるAuthenticatorAttestationResponse返却
RP（サーバー）による認証情報検証、登録完了(API2)

Copyright© Medley, Inc. ALL RIGHTS RESERVED.

23

Rubyでのパスキー
実装

ライブラリの利用

アプリのGemﬁleに以下を追記$ bundle

を実行

もしくは以下を実行

Copyright© Medley, Inc. ALL RIGHTS RESERVED.

24

Rubyでのパスキー
実装

構成ファイル

構成情報としてドメイン名やRPの名前を設定する。

Copyright© Medley, Inc. ALL RIGHTS RESERVED.

25

Rubyでのパスキー
実装

0．ユーザーによるパスキー登録要求

ユーザーが「パスキーを登録する」などのボタンを表示し、ボタン押下などのイベントを通じてアカウント登録時に必要な情報をサーバーに送信。登録時に必要な情報はサービスごとに異なる。（名前や住所など）

Copyright© Medley, Inc. ALL RIGHTS RESERVED.

26

Rubyでのパスキー
実装

1．RP（サーバー）によるPublicKeyCredentialCreationOptionsオブジェクト作成

ユーザーからのリクエストを受け取ると、サーバー側ではチャレンジ（乱数）を生成し、RelyingPartyの情報など次のステップに必要な情報と合わせPublicKeyCredentialCreationOptionsオブジェクトを作成する

Copyright© Medley, Inc. ALL RIGHTS RESERVED.

27

Rubyでのパスキー実装

1．RP（サーバー）によるPublicKeyCredentialCreationOptionsオブジェクト作成

PublicKeyCredentialCreationOptionsオブジェクトの中身
パラメータ

必須説明

rp✓

Relying Partyの情報
id:識別子（ドメイン名）
name:名前user✓

ユーザーの情報
id: RP内での識別子
name: ユーザー名
displayName:表示名

challenge✓

サーバーで生成した乱数

pubKeyCredParams✓

鍵の情報
type: Credentialのタイプ
alg: Attestationに入る公開鍵の暗号化アルゴリズム

AuthenticatorSelection

認証器が利用可能な機能の制御
AuthenticatorAttachement :プラットフォームへの同期の制御
requireResidentkey : Discoverable Credentialの利用有無
userVeriﬁcation : ローカル認証の要求度合い

timeout

API呼び出しの待機時間

excludeCredentials

既存のパスキー情報（設定することで、同じパスキーが複数登録されることを防ぐ）
Copyright© Medley, Inc. ALL RIGHTS RESERVED.

28

Rubyでのパスキー実装

1．RP（サーバー）によるPublicKeyCredentialCreationOptionsオブジェクト作成

Copyright© Medley, Inc. ALL RIGHTS RESERVED.

29

Rubyでのパスキー
実装

2. RP（JS APP）によるnavigator.credentials.create()実行

PublicKeyCredentialCreationOptionsオブジェクトとPublicKeyを引数としてnavigator.credentials.create()メソッドを呼ぶ

JavaScriptのライブラリも複数存在
例）webauthn-json

Copyright© Medley, Inc. ALL RIGHTS RESERVED.

30

Rubyでのパスキー実装

3. 認証器による鍵ペア作成とAttestation署名

認証器でのローカル認証（本人確認）が成功したら、鍵ペアを作成し、アテステーション用の秘密鍵で署名

Copyright© Medley, Inc. ALL RIGHTS RESERVED.

31

Rubyでのパスキー実装

4. 認証器によるPublicKeyCredential返却

認証器は作成された公開鍵とAttestation等の認証情報をattestationObjectとしてブラウザに返却

Copyright© Medley, Inc. ALL RIGHTS RESERVED.

32

Rubyでのパスキー実装

4. 認証器によるPublicKeyCredential返却

PublicKeyCredentialの中身抜粋

パラメータ

説明

rawId

生成した公開鍵の識別子のバイナリデータ（ArrayBuﬀer）

id

生成した公開鍵の識別子で、実際には、上記rawIdのBase64urlエンコードしたデータ

response

クレデンシャル 生 成 要 求 に 対 する 認 証 器 の 応 答(AuthenticatorAttestationResponse)
attestationObject
認証器によるユーザー検証の結果として、COSE形式の認証器のデー
タとアテステーション情報
clientDataJSON
クレデンシャル生成要求の際にWebブラウザーから認証器に伝えた情報（ClientData）のJSON形式の情報

type

PublicKeyCredentialのタイプ。通常public-key

Copyright© Medley, Inc. ALL RIGHTS RESERVED.

33

Rubyでのパスキー実装

5.RP（JS APP）による
AuthenticatorAttestationResponse返却

RPサーバーのAttesstationResponseエンドポイントに認証情報を送信する。

Copyright© Medley, Inc. ALL RIGHTS RESERVED.

34

Rubyでのパスキー実装

6.RP（サーバー）による認証情報検証、登録完了

RPサーバーは受信した認証情報を検証する。検証成功後、適切な成功レスポンスを返し、認証時に利用するために、公開鍵をDBに保存。ユーザ/認証器の登録が完了。

Copyright© Medley, Inc. ALL RIGHTS RESERVED.

35

Rubyでのパスキー
実装

6.RP（サーバー）による認証情報検証、登録完了

Copyright© Medley, Inc. ALL RIGHTS RESERVED.

36

Rubyでのパスキー
実装●

実装内容概要（認証）

認証ステップでは、2つのAPIを用意する必要がある（API1) ユーザーIDに紐づいたチャレンジレスポンスを発行するAPI（API2）ブラウザの認証器が発行した署名をサーバに保存した公開鍵で検証してセッションを発行する API●

認証ステップ概要
0. ユーザーによるパスキー認証要求
1.
2.
3.
4.
5.
6.

RP（サーバー）によるPublicKeyCredentialRequestOptionsオブジェクト作成（API1）
RP（JS APP）によるnavigator.credentials.get()実行
認証器によるユーザ確認とAssertion作成
認証器による認証情報返却
RP（JS APP）によるAuthenticationAssertionResponse返却
RP（サーバー）による署名検証、認証完了(API2)

Copyright© Medley, Inc. ALL RIGHTS RESERVED.

37

Rubyでのパスキー実装

0 ユーザーによるパスキー認証要求

登録と同様に認証エンドポイントへのリクエスト仕様もWebAuthnの仕様の範囲外。通常ユーザIDなどユーザを特定できるユニークな識別子を利用することが多い

Copyright© Medley, Inc. ALL RIGHTS RESERVED.

38

Rubyでのパスキー実装

0 ユーザーによるパスキー認証要求

Autoﬁllを使いたいときにはログインページのinputフィールドにautocomplete属性を指定する

Copyright© Medley, Inc. ALL RIGHTS RESERVED.

39

Rubyでのパスキー実装

1．RP（サーバー）によるPublicKeyCredentialRequestOptionsオブジェクト作成

ユーザーからのリクエストを受け取ると、サーバー側ではチャレンジ（乱数）を生成する。また、DBに保存されている認証器が作成した公開鍵の情報をallowCredentialsに格納しPublicKeyCredentialRequestOptionsオブジェクトを作成する

Copyright© Medley, Inc. ALL RIGHTS RESERVED.

40

Rubyでのパスキー実装

1．RP（サーバー）によるPublicKeyCredentialRequestOptionsオブジェクト作成

Copyright© Medley, Inc. ALL RIGHTS RESERVED.

41

Rubyでのパスキー実装

1．RP（サーバー）によるPublicKeyCredentialRequestOptionsオブジェクト作成

PublicKeyCredentialRequestOptionsオブジェクトの中身の一例
パラメータ

必須

説明

challenge✓

サーバーで生成した乱数

allowCredentials

type: PublicKeyCredentialのタイプ
id: create()のときに取得したCredentialID
transports: 認証器との通信方法

Copyright© Medley, Inc. ALL RIGHTS RESERVED.

42

Rubyでのパスキー実装

2. RP（JS APP）によるnavigator.credentials.get() 実行

RPのレスポンスを元に、navigator.credentials.get()を実行し認証処理を実行。

Copyright© Medley, Inc. ALL RIGHTS RESERVED.

43

Rubyでのパスキー実装

2. RP（JS APP）によるnavigator.credentials.get() 実行

publickKeyをキーとしてPublicKeyCredentialRequestOptionsオブジェクトを渡す。

Copyright© Medley, Inc. ALL RIGHTS RESERVED.

44

Rubyでのパスキー実装

3. 認証器によるユーザ確認とAssertion作成

認証器はChallengeやRelyingPartyの情報を元にユーザを確認しAssertionを作成する。

Copyright© Medley, Inc. ALL RIGHTS RESERVED.

45

Rubyでのパスキー実装

4. 認証器によるPublicKeyCredential返却

認証器が生成したPublicKeyCredential（assertion signature, clientDataHash,AuthenticatorDataなど）をブラウザに返す。

Copyright© Medley, Inc. ALL RIGHTS RESERVED.

46

Rubyでのパスキー実装

4. 認証器によるPublicKeyCredential返却

PublicKeyCredentialの中身抜粋
パラメータ

説明

rawId

公開鍵の識別子のバイナリデータ（ArrayBuﬀer）

id

公開鍵の識別子で、実際には、上記 rawIdのBase64urlエンコードしたデー
タ

response

クレデンシャル認証要求に対する認証器の応答(AuthenticatorAssertionResponse)
AuthenticatorData
認証器に関するメタデータ
clientDataJSON
クレデンシャル認証要求の際にWebブラウザーから認証器に伝えた情報（ClientData）のJSON形式の情報
signature
認 証 器 が 生 成 した PublicKeyCredentialに 対 する 署 名 データ。 上 記
authenticatorDataとClientDataのハッシュ 値 （ ClienthDataHash）を 連 結 したデータに対して、登録されたユーザーの秘密鍵を用いて生成される。

type

PublicKeyCredentialのタイプ。通常public-key

Copyright© Medley, Inc. ALL RIGHTS RESERVED.

47

Rubyでのパスキー
実装

5.RP（JS APP）によるAuthenticationAssertionResponse
返却

登録時と同様に、認証器から受信したパラメータに加え、rawId、id、type,clienetDataJSON などのパラメータを含め、AssertionResponse エンドポイントに送信する。

Copyright© Medley, Inc. ALL RIGHTS RESERVED.

48

Rubyでのパスキー
実装

6.RP（サーバー）による署名検証、認証完了

RPはAssertionを検証し、検証が成功したら認証成功とする。セッションを発行しセッションIDをCookieにセットする等、一般的な認証サーバと同じように処理を継続する。

Copyright© Medley, Inc. ALL RIGHTS RESERVED.

49

Rubyでのパスキー実装

6.RP（サーバー）による署名検証、認証完了

Copyright© Medley, Inc. ALL RIGHTS RESERVED.

50

最後に

●

セキュアでユーザビリティも向上できるパスキーを活用できる環境が以前よりさらに整ってきている（Rubyのライブラリやサンプルコードもあり）●

Synced Passkeyならではの注意点や継続議論されている課題にも注目して実装する○ パスキープロバイダーの安全性○ Device boundであることの確認●

既存の認証UXからのスムーズな移行にも留意する○ UXガイドラインなども公開されている

Copyright© Medley, Inc. ALL RIGHTS RESERVED.

51