Upgrade to Pro — share decks privately, control downloads, hide ads and more …

WebAuthn from the relying-party view

WebAuthn from the relying-party view

Yoshikazu Nojima

October 03, 2018
Tweet

More Decks by Yoshikazu Nojima

Other Decks in Technology

Transcript

  1. Copyright © Yoshikazu Nojima 2018 自己紹介 • 能島良和 • 通信キャリアでホスティングサービスの開発・運用

    • 前職は通信キャリア系SIerで社内向けにSpringのPJ支援業務 • Apache CloudStack Commiter(活動休止中。。) • WebAuthn周りは趣味 • Twitter:@shiroica • GitHub:ynojima 1
  2. Copyright © Yoshikazu Nojima 2018 WebAuthnのRelying Partyライブラリ作ってます ▪WebAuthn4J • https://github.com/webauthn4j/webauthn4j

    • WebAuthnのAssertion/Attestationを検証するためのライブラリ。Java製 ▪Spring Security WebAuthn • https://github.com/ynojima/spring-security-webauthn • 上記のWebAuthn4JをSpringで使いやすくするためのライブラリ。 Spring SecurityのAuthenticationProvider実装を提供 • Spring Security本体への修正も必要な為、PullReq中 2
  3. Copyright © Yoshikazu Nojima 2018 ※WebAuthnにおけるRelying Party ユーザーの登録、認証にWeb Authentication APIを使用するWebアプリケーション。

    Client Platform(≒ブラウザ)や、Authenticator(認証デバイス)と対置されるエンティティ。 OICDのコンテキストのRelying Partyとは必ずしも一致しないので注意 ( OICDのOPがWebAuthnではRelying Partyと呼ばれることは普通にある) WebAuthn認証における各エンティティの関係: 4 User Authenticator Client Platform Relying Party WebAuthn API FIDO CTAP2 FIDO U2F Proprietary API 顔認証 指紋認証 etc. Windows Hello, Touch ID
  4. Copyright © Yoshikazu Nojima 2018 WebAuthn APIとWebAuthnライブラリ間のギャップ WebAuthn APIは、ブラウザからRelying Partyに対しJavaScript

    APIとして提供 WebAuthn APIを呼び出すRelying Partyのフロントエンドと、 Assertion/Attestationの検証を行うバックエンド間の通信方式はWebAuthnのスコープ外 WebAuthnのRelying Party開発は、フロントエンド・バックエンド・両者の通信を開発する必 要がある 5 Client Platform Relying Party WebAuthn API (JavaScript) フロントエンド バックエンド フロントエン ド・バックエン ド間通信は WebAuthnの スコープ外 WebAuthn ライブラリ ※Relying Partyによる実装が必要
  5. Copyright © Yoshikazu Nojima 2018 オプションが多く、複雑です。次ページから各オプションを説明します Credentialの作成 7 let publicKeyCredentialCreationOptions

    = { rp: rp, user: user, challenge: challenge, pubKeyCredParams: pubKeyCredParams, timeout: timeout, excludeCredentials: excludeCredentials, authenticatorSelection: authenticatorSelection, attestation: attestation, extensions: extensions }; let credentialCreationOptions = { publicKey: publicKeyCredentialCreationOptions }; navigator.credentials.create(credentialCreationOptions) .then(function(credential){ // submit to Relying Party server });
  6. Copyright © Yoshikazu Nojima 2018 Relying Partyに関するオプション 例) rpメンバ(PublicKeyCredentialRpEntity )

    8 メンバ 説明 備考 id rpId。Credentialが有効なドメインのスコープを 指定するオプション name Relying Partyの名称。画面付きのFIDO2 Authenticatorで表示に使用されると思われる icon Relying Partyのアイコン。画面付きのFIDO2 Authenticatorで表示に使用されると思われる let rp = { id: "http://localhost", name: "spring-security-webauthn sample", icon: "http://localhost/img/spring-security-webauthn.png" };
  7. Copyright © Yoshikazu Nojima 2018 作成するCredentialが紐づくユーザーに関するオプション 例) userメンバ(PublicKeyCredentialUserEntity) 10 メンバ

    説明 備考 id userHandle。ユーザーを一意に特定するバイト 列。Authenticatorが、あるRPのアカウント (userHandle)に対して複数のCredentialを持 たないよう制御するのに利用 name ユーザーアカウントの入力用の表記(Human- palatable)。 displayName ユーザーアカウントの表示用の表記(Human- Readable)。 icon ユーザーアカウントのアイコン。 let user = { id: userHandle, name: "[email protected]", displayName: "Yoshikazu Nojima", icon: "http://localhost/user/ynojima/icon.png" };
  8. Copyright © Yoshikazu Nojima 2018 リプレイ攻撃を防ぐためのオプション。 例) challengeメンバ(BufferSource) 11 メンバ

    説明 備考 challenge Relying Partyのバックエンドから受信したチャ レンジデータ。バイト列。 let challenge = base64url.toBuffer(challengeBase64);
  9. Copyright © Yoshikazu Nojima 2018 RPが受け入れ可能なCredentialのタイプとアルゴリズムの指定オプション 例) pubKeyCredParamsメンバ (PublicKeyCredentialParameters) 12

    メンバ 説明 備考 alg Credentialのアルゴリズム。[IANA-COSE- ALGS-REG]に登録された値から選択 Relying Partyの バックエンド側 も対応が必要 type “public-key”固定 let pubKeyCredParams = [ { alg: -7, //ES256 for FIDO U2F Key, etc. type: "public-key" }, { alg: -257, //RS256 for Windows Hello type: "public-key" } ];
  10. Copyright © Yoshikazu Nojima 2018 ユーザーの認証操作入力待機時間を指定するオプション 例) timeoutメンバ(unsigned long) 13

    メンバ 説明 備考 timeout ユーザーの認証操作入力待機時間。ミリ秒 let timeout = 300000;
  11. Copyright © Yoshikazu Nojima 2018 Authenticatorが、あるRPのアカウントに対して複数のCredentialを持たな いよう制御する為のオプション 例) excludeCredentialsメンバ (PublicKeyCredentialParameters配列)

    14 メンバ 説明 備考 type “public-key”固定 id credentialId。 transports Authenticatorとの接続に使用できると思われる 通信手段のヒント let excludeCredentials = [ { type: "public-key", id: id, transports: ["usb", "nfc", "ble", "internal"], } ];
  12. Copyright © Yoshikazu Nojima 2018 RPが受け入れ可能なAuthenticatorを明示し、フィルタリングするための オプション 例) authenticatorSelectionメンバ (AuthenticatorSelectionCriteria)

    15 メンバ 説明 備考 authenticator Attachment AuthenticatorのClient Platformに対する取り付 け方の指定。内蔵の場合、”platform”。取り外し 可能の場合、”cross-platform”。指定不要の場合、 メンバを削除 require ResidentKey AuthenticatorにCredentialを保存するか指定。 falseの場合、Credentialをデバイスに保存しない Authenticator(FIDO-U2Fトークン等)も許可 (その場合、ユーザーのID入力が必要) user Verification Authenticatorでユーザー識別を行うか指定。 値域:”required”, “preferred”, “discouraged” let authenticatorSelection = { //authenticatorAttachment: "platform", requireResidentKey: false, userVerification: "preferred" };
  13. Copyright © Yoshikazu Nojima 2018 要求するAttestationのタイプを指定するオプション 例) “direct”を指定した場合、RPがAuthenticatorの出所を厳密に検証するための 情報を取得できる一方、RPがユーザーをサイトを跨いでトラッキングするた めにも使えてしまうというプライバシー上の懸念から、追加のダイアログが

    表示される。 RPが認定したAuthenticatorのみに利用を制限したいエンタープライズ用途 以外では、”none”が適切 attestationメンバ (AttestationConveyancePreference) 16 メンバ 説明 備考 attestation 要求するattestationを指定。 値域:”none”, “indirect”, “direct” let attestation = "none";
  14. Copyright © Yoshikazu Nojima 2018 Credentialの取得 18 let publicKeyCredentialRequestOptions =

    { challenge: challenge, timeout: timeout, rpId: rpId, allowCredentials: allowCredentials, userVerification: userVerification, extensions: extensions }; let credentialRequestOptions = { mediation: "required", //WebAuthn lv.1ではrequiredのみ publicKey: publicKeyCredentialRequestOptions }; return navigator.credentials.get(credentialRequestOptions) .then(function(credential){ // submit to Relying Party server });
  15. Copyright © Yoshikazu Nojima 2018 リプレイ攻撃を防ぐためのオプション。CSRFトークンのようなもの。 例) challengeメンバ(BufferSource) 19 メンバ

    説明 備考 challenge Relying Partyのバックエンドから受信したチャ レンジデータ。バイト列。 let challenge = base64url.toBuffer(challengeBase64);
  16. Copyright © Yoshikazu Nojima 2018 ユーザーの認証操作入力待機時間を指定するオプション 例) timeoutメンバ(unsigned long) 20

    メンバ 説明 備考 timeout ユーザーの認証操作入力待機時間。ミリ秒 let timeout = 300000;
  17. Copyright © Yoshikazu Nojima 2018 FIDO-U2Fのようなnon-residentKey(Authenticatorにデータを保存しない 種類のCredential)をサポートするために、ユーザーに紐づくCredentialのid のリストを指定するオプション 例) allowCredentialsメンバ

    (PublicKeyCredentialDescriptor配列) 22 メンバ 説明 備考 id credentialId type public-key固定 transports Authenticatorとの接続に使用できると思われる 通信手段のヒント let allowCredentials = [ { id: credentialId, type: "public-key", transports: ["usb", "nfc", "ble", "internal"] } ];
  18. Copyright © Yoshikazu Nojima 2018 non-residentKeyの仕組み non-residentKeyの場合、サイト(rpId)毎に秘密鍵を保存しない デバイス固有のSecretと、サイト毎に異なるcredentialIdにエンコードしたNonceから 認証時に(登録時に使用した)秘密鍵を導出して使用する 特徴

    • サイト毎に秘密鍵を保存しないで済む ⇒書き換え可能な領域が不要、低コスト、高信頼 • 認証時にcredentialIdが必須 ⇒認証時点でユーザーの特定が必須であり、 二段階目の認証要素としてのみ使用可能 23 Yubico社のサイトから図を引用 https://developers.yubico.com/U2F/Protocol_details/Key_generation.html
  19. Copyright © Yoshikazu Nojima 2018 まとめ • Relying PartyとしてWebAuthnを導入する場合、WebAuthnのJavaScriptのAPIを呼び出す フロントエンドと、Assertion、Attestationを検証するバックエンドの緊密な連携が必要

    • バックエンドはライブラリが出始めているが、 WebAuthnのJavaScriptのAPIを呼び出して バックエンドに繋ぎこむ部分は自分で実装が必要 • WebAuthnのJavaScript APIのオプションは複雑なので、 本資料ではCredentialの作成、認証の各オプション項目を網羅的に解説した 25
  20. Copyright © Yoshikazu Nojima 2018 パスワードの限界 パスワードには以下の問題があります。 • フィッシング攻撃耐性 •

    本物そっくりの偽物サイトを作成し、ユーザーを誤認させたうえでID/Passwordを入力させ詐取 • 精巧に作成されたフィッシングサイトは45%のユーザーが騙されるという研究結果も • リスト型攻撃耐性 • 脆弱な他サービスで流出したID/Passwordを用いた攻撃 • 自サービスは堅牢でも、ユーザーがパスワードを使いまわした場合、巻き添え被害の可能性 • モバイルデバイス対応 • モバイルデバイスでは複雑なパスワードの入力が不便 パスワード要求はユーザーの離脱率に顕著な悪影響 パスワード認証に代わる認証手段が必要 28
  21. Copyright © Yoshikazu Nojima 2018 Web Authenticationの認証フロー(概略) • ユーザー登録 ユーザー

    認証デバイス ブラウザ サーバー DB RP固有公開鍵 の保存 承認ジェスチャ (指紋スキャン等) の実施 • RP固有公開鍵 • Credential Id • ドメイン(RP Id)のハッ シュ • その他 を送信 • RP固有公開鍵 • Credential Id • ドメイン(RP Id)のハッシュ • その他 を送信 耐タンパ 領域 RP固有秘密鍵 を保存 RP固有公開鍵・秘密鍵ペアを生成 • チャレンジ • チャレンジ、ドメイン(RpId) その他のハッシュ クライアントデータのハッシュ、 RP Idに対する署名を生成 ドメイン(RP Id) チャレンジ その他の検証 耐タンパ 領域 • ローカル認証情報(生体情報等) を検証 ユーザー検証機能付き認証デバイスの場合
  22. Copyright © Yoshikazu Nojima 2018 Web Authenticationの認証フロー(概略) • ユーザー認証 ユーザー

    認証デバイス ブラウザ サーバー 承認ジェスチャ (指紋スキャン等) の実施 • Credential Id • 認証デバイスデータ • RP Idのハッシュ • フラグ • カウンタ • 資格情報データ • 署名 を送信 • Credential Id • チャレンジ、ドメイン (RpId)その他 • 認証デバイスデータ • RP Idのハッシュ • フラグ • カウンタ • 資格情報データ • 署名 を送信 • RP Idのハッシュ • チャレンジ、ドメイン(RpId) その他のハッシュ RP固有秘密鍵でRpIdのハッシュ、 フラグ、カウンタ、クライアント データのハッシュを署名 ドメイン(RP Id)、署名 チャレンジ、その他の検証 • チャレンジ を送信 ユーザー検証機能付き認証デバイスの場合 耐タンパ 領域 • ローカル認証情報(生体情報等) を検証 RP固有秘密鍵を読込 ローカル認証 公開鍵認証 DB RP固有公開鍵 の読込
  23. Copyright © Yoshikazu Nojima 2018 WebAuthnの技術的な特徴 ローカル認証と公開鍵認証の組み合わせ • ローカル認証 •

    ユーザーと認証デバイス間の認証 認証方式は交換可能(例:指紋認証、虹彩認証、PIN) • 公開鍵認証 • 認証デバイスとサーバー間の認証 32 ユーザー 認証デバイス サーバー ローカル認証 (指紋認証等) 公開鍵認証
  24. Copyright © Yoshikazu Nojima 2018 生体認証をローカル認証とするメリット 生体認証をリモート認証とした場合のリスク • 生体情報は変更不可能なことから究極のプライバシー情報。取扱は慎重さが求められる •

    サーバーに生体情報を保存する生体認証では、生体情報は経路上で様々な攻撃に晒される • WebAuthnでは生体情報が認証デバイスから外に流通せず、安全性が高い(ローカル認証) • クライアント(ブラウザ)とサーバーは公開鍵と、公開鍵で検証できる署名を受け取るのみ • 生体情報と秘密鍵は認証デバイスのTPMやセキュアエレメントのような耐タンパ領域に保存 • デメリット • 登録時に使用した認証デバイスがないと認証できない 33 ユーザー 認証デバイス ブラウザ サーバー DB 生体情報の 検証 承認ジェスチャ (生体情報) の提供 • 生体情報 • 生体情報
  25. Copyright © Yoshikazu Nojima 2018 フィッシング攻撃に対する効果 • ユーザー認証 ユーザー 認証デバイス

    ブラウザ サーバー 承認ジェスチャ (指紋スキャン等) の実施 • Credential Id • 認証デバイスデータ • RP Idのハッシュ • フラグ • カウンタ • 資格情報データ • 署名 を送信 • Credential Id • チャレンジ、ドメイン (RpId)その他 • 認証デバイスデータ • RP Idのハッシュ • フラグ • カウンタ • 資格情報データ • 署名 を送信 • RP Idのハッシュ • チャレンジ、ドメイン(RpId) その他のハッシュ RP固有秘密鍵でRpIdのハッシュ、 フラグ、カウンタ、クライアント データのハッシュを署名 • チャレンジ を送信 ユーザー検証機能付き認証デバイスの場合 耐タンパ 領域 • ローカル認証情報(生体情報等) を検証 RP固有秘密鍵を読込 ドメイン(RP Id)、署名 その他の検証 DB RP固有公開鍵 の読込 秘密鍵はRpId(≒ドメイン)毎に保存されており、 フィッシング攻撃で他ドメインから認証要求を受けて も秘密鍵は不正利用されない
  26. Copyright © Yoshikazu Nojima 2018 リスト型攻撃に対する効果 • ユーザー認証 ユーザー 認証デバイス

    ブラウザ サーバー 承認ジェスチャ (指紋スキャン等) の実施 • Credential Id • 認証デバイスデータ • RP Idのハッシュ • フラグ • カウンタ • 資格情報データ • 署名 を送信 • Credential Id • チャレンジ、ドメイン (RpId)その他 • 認証デバイスデータ • RP Idのハッシュ • フラグ • カウンタ • 資格情報データ • 署名 を送信 • RP Idのハッシュ • チャレンジ、ドメイン(RpId) その他のハッシュ RP固有秘密鍵でRpIdのハッシュ、 フラグ、カウンタ、クライアント データのハッシュを署名 • チャレンジ を送信 ユーザー検証機能付き認証デバイスの場合 耐タンパ 領域 • ローカル認証情報(生体情報等) を検証 RP固有秘密鍵を読込 ドメイン(RP Id)、署名 その他の検証 DB RP固有公開鍵 の読込 サーバー側に保存されるのはRP固有の公開鍵であり、 他サイトで漏洩してもリスト型攻撃を受ける心配は不要
  27. Copyright © Yoshikazu Nojima 2018 導入のハードル(1/2) ブラウザ FIDO-U2F (=HWトークン による二要素認証)

    FIDO 2.0 (≒生体認証) 備考 Chrome(Desktop) 67以降 Canaryで実装中 Chrome(Android) Canaryで実装中 Canaryで実装中 Firefox 60以降 未サポート Safari 未サポート 未サポート 最近、正式に開発開始 Edge Edge 18 Preview以降 今秋正式リリース見込 Windows Hello対応 認証デバイスもサポート IE 未サポート 未サポート 37 ▪ブラウザの対応状況 Safariを除く主要ブラウザでは動く実装が揃いつつある。Safariも最近、開発開始 2018年8月現在
  28. Copyright © Yoshikazu Nojima 2018 導入のハードル(2/2) ▪認証デバイス • 認証デバイスが必要(組込、USB、NFC、BLE) •

    FIDO U2Fの認証デバイスも利用可能、2000円台後半~ • Windows Hello対応認証デバイスを使用可能(Edge) • Android標準の認証デバイスも利用可能(Android版Chrome) • Touch IDが利用可能予定(Mac版Chrome) ▪サーバーサイド • 各言語でOSSライブラリが出始めている • 手前味噌ながら自分もJava/Springで実装 • https://github.com/webauthn4j/webauthn4j • https://github.com/ynojima/spring-security-webauthn 38
  29. Copyright © Yoshikazu Nojima 2018 WebAuthn導入時の位置づけ 一般公開サイト: • 全ユーザーへの強制は望めないが、セキュリティ、利便性を重視するユーザーに選択肢を提供 社内システム用途:

    • 各マシンへの認証クライアントソフトの配布が不要な為、 既存の生体認証システムと比べ展開が容易な選択肢になり得る 39
  30. Copyright © Yoshikazu Nojima 2018 Web Authenticationの認証フロー(詳細) • ユーザー登録 ユーザー

    認証デバイス ブラウザ サーバー DB RP固有公開鍵 の保存 承認ジェスチャ (ローカル認証情報) の提供 • RP固有公開鍵 • Credential Id • 構成証明公開鍵証明書 • 署名 • カウンタ を送信 • クライアントデータ • 構成証明 • RP Idのハッシュ • カウンタ • Credential Id • RP固有公開鍵 • 構成証明公開鍵証明書 を送信 耐タンパ 領域 RP固有秘密鍵を保存 RP固有公開鍵・秘密鍵ペアを生成 構成証明 証明書を読込 • チャレンジ • RP Id • 他 • RP Idのハッシュ • クライアントデータのハッシュ クライアントデータのハッシュ、 RP Idに対する署名を生成 クライアントデータ、 構成証明、署名、認証 パス他の検証 • クライアントデータ • チャレンジ • オリジン • TokenBinding ID • 他 を生成 耐タンパ 領域 • ローカル認証情報(生体情報等) を検証 ユーザー検証機能付き認証デバイスの場合
  31. Copyright © Yoshikazu Nojima 2018 Web Authenticationの認証フロー(詳細) • ユーザー認証 ユーザー

    認証デバイス ブラウザ サーバー 承認ジェスチャ (ローカル認証情報) の提供 • Credential Id • 認証デバイスデータ • RP Idのハッシュ • フラグ • カウンタ • 資格情報データ • 署名 を送信 • Credential Id • クライアントデータ • 認証デバイスデータ • RP Idのハッシュ • フラグ • カウンタ • 資格情報データ • 署名 を送信 • RP Idのハッシュ • クライアントデータのハッシュ を送信 RP固有秘密鍵でRP Idのハッシュ、 フラグ、カウンタ、クライアント データのハッシュを署名 クライアントデータ、 認証デバイスデータ、署名 他の検証 • チャレンジ を送信 • クライアントデータ • チャレンジ • オリジン • TokenBinding ID • 他 を生成 ユーザー検証機能付き認証デバイスの場合 耐タンパ 領域 • ローカル認証情報(生体情報等) を検証 RP固有秘密鍵を読込
  32. Copyright © Yoshikazu Nojima 2018 Web Authenticationの認証フロー(詳細) • ユーザー登録(二要素認証への適用) ユーザー

    認証デバイス ブラウザ サーバー DB RP固有公開鍵 の保存 承認ジェスチャ (ボタン押下) の提供 • RP固有公開鍵 • Credential Id(NonceとMAC) • 構成証明公開鍵証明書 • 署名 • カウンタ を送信 • クライアントデータ • 構成証明 • RP Idのハッシュ • カウンタ • Credential Id • RP固有公開鍵 • 構成証明公開鍵証明書 を送信 耐タンパ 領域 デバイスシークレットをキーに NonceとRP Idのハッシュから RP固有公開鍵・秘密鍵ペアを導出 構成証明秘密鍵、 構成証明公開鍵証明書、 デバイスシークレット を読込 • チャレンジ • RP Id • 他 • RP Idのハッシュ • クライアントデータのハッシュ を送信 構成証明秘密鍵でRP Id、 クライアントデータのハッシュ、 Credential Id、RP固有公開鍵を署名 クライアントデータ、 構成証明、署名、認証パス 他の検証 • クライアントデータ • チャレンジ • オリジン • TokenBinding ID • 他 を生成 Yubico社のFIDO-U2F認証デバイスの場合 RNGでNonce を生成 デバイスシークレットをキーに RP固有秘密鍵とRP IdからMACを生成
  33. Copyright © Yoshikazu Nojima 2018 Web Authenticationの認証フロー(詳細) • ユーザー認証(二要素認証への適用) ユーザー

    認証デバイス ブラウザ サーバー DB Credential Id リストの取得 承認ジェスチャ (ボタン押下) の提供 • フラグ • カウンタ • 署名 を送信 • Credential Id • クライアントデータ • 認証デバイスデータ • RP Idのハッシュ • フラグ • カウンタ • 資格情報データ • 署名 を送信 耐タンパ 領域 デバイスシークレットをキーに NonceとRP Idのハッシュから RP固有公開鍵・秘密鍵ペアを導出 デバイスシークレット を読込 • RP Idのハッシュ • クライアントデータのハッシュ • Credential Id(NonceとMAC) を送信 RP固有秘密鍵でRP Idのハッシュ、 フラグ、カウンタ、クライアント データのハッシュを署名 クライアントデータ、 認証デバイスデータ、署名 他の検証 • Credential Idリスト • チャレンジ、RP Id、他 を送信 Yubico社のFIDO-U2F認証デバイスの場合 ID/Passの入力 ID/Passの送信 • クライアントデータ • チャレンジ • オリジン • TokenBinding ID • 他 を生成 DB RP固有公開鍵 の読込
  34. Copyright © Yoshikazu Nojima 2018 WebAuthnで異ドメイン間で資格情報を共有出来ない問題は、 異ドメイン間をOpenID ConnectやSAMLでシングルサインオン させることで緩和可能 緩和策:異ドメイン間でのシングルサインオン

    47 example.co.jp example.com example.co.uk ログイン後、 SSOによるリダイレクト ログイン後、 SSOによるリダイレクト 代表ドメインに WebAuthnでログイン
  35. Copyright © Yoshikazu Nojima 2018 Web Browser Non-residentKey 48 FIDO-U2F

    Authenticator Web Service rpId HMAC HMAC credentialId (Nonce & MAC), PublicKey Nonce PrivateKey PublicKey Device Secret