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

パスワードレス認証 / FIDO|ミツエーリンクスTSD

パスワードレス認証 / FIDO|ミツエーリンクスTSD

社内で開催した勉強会資料です。「パスワードレス認証 / FIDO」について、概要と今後の課題などについてチームで共有しました。

//
ミツエーリンクスTSDのエンジニアリングについて発信しています。
エンジニア積極採用中!
TSD公式エンジニアブログ TSD CoLab
\\

株式会社ミツエーリンクスTSD

More Decks by ミツエーリンクスTSD

Other Decks in Technology

Transcript

  1. パスワードレス認証 / FIDO 1 / 45

  2. きっかけ Yahoo! JAPAN はパスワードレス認証で問い合わせを 25% 削減、ログイン時間も 2.6 倍速に https://web.dev/i18n/ja/yahoo-japan-identity-case-study/ 2

    / 45
  3. 最近ではこんな記事も https://www.publickey1.jp/blog/22/lastpass1passwordfidowebauthn.html パスワードマネージャのLastPassと1Passwordが相次いでFIDO/WebAuthnへの対応を発表。 パスワードレスの時代にパスワードマネージャの存在意義はどうなるのか? 3 / 45

  4. パスワードレス認証 とは パスワードを送信しない認証 ※「パスワードが必要ない認証」とは若干異なります 4 / 45

  5. パスワードレス認証 導入事例 Yahoo! LINE SBI証券 GitHub etc. 5 / 45

  6. 事例 Yahoo! すでに ID と生体認証の紐づけが完了していれば、1ステップで https://about.yahoo.co.jp/info/blog/20200914/passwordless.html 6 / 45

  7. パスワード認証の課題 https://www.nri-secure.co.jp/blog/what-is-webauthn 複数のパスワードを記憶する必要があり忘れてしまう。再発行手続きが面倒 推測されやすいパスワードを設定していたために、不正にログインされる ブルートフォースやリスト型攻撃による被害 フィッシングや中間者攻撃による被害 サービス提供者側から認証情報が漏洩する可能性 7 / 45

  8. パスワードをやめたい 覚えるのがめんどう 所詮は文字列。推測されてしまう 8 / 45

  9. では、どうやって? 9 / 45

  10. パスワードではなく、本人と特定できる情報 生体認証 指紋 / Touch ID 顔 / Face ID

    セキュリティキー https://ftsafe.co.jp/solutions/security_device/ 10 / 45
  11. パスワードを覚える必要はなくなった 11 / 45

  12. ただ、上記を直接サーバに送って盗まれたら意味ない 12 / 45

  13. 加えて、数あるサービスに同じ生体認証やセキュリティキ ーを利用するわけにはいかない 13 / 45

  14. なので 秘密の情報は生体認証やセキュリティキー(認証機)側で管理しましょう 認証機が各サービスごとに固有の秘密の鍵を提供するようにしましょう 秘密の鍵を直接サーバに送らなくてもいいような認証方式と規格(プロトコル)を作りましょう 色々なデバイス(iPhone / Android etc.)で認証機とのやりとの方法がばらばらだと実装するなると大変なの で、統一した規格にしましょう 14

    / 45
  15. イメージ 認証 (iPhone)が Website ごとに 固有の鍵(Attestation / 証明書のようなもの)を発行 https://developer.apple.com/videos/play/wwdc2020/10670/ 15

    / 45
  16. キーワード FIDO WebAuthn 16 / 45

  17. FIDO ファイドと呼びます Fast IDentity Online の略 17 / 45

  18. FIDO とは 従来のパスワードに代わる認証規格を策定する業界団体のこと 認証技術の規格の呼び名でもあるようです 厳密には FIDO UAF, FIDO U2F, etc.

    Microsoft, Google, Apple が策定やサポートに関わっています 18 / 45
  19. FIDO の特徴 生体認証やセキュリティキー(USB)など特別な端末(認証機)を利用する サーバとユーザで秘密の情報を共有しない パスワードを送信しない / パスワードレス 公開鍵認証方式と同じ原理 ※ 公開鍵認証方式で課題の解決に

    ※ ただ、お手軽ではありませんでした 19 / 45
  20. FIDO2 FIDO をより利用しやすく ウェブブラウザ上だけで完結、特別な端末は不要 20 / 45

  21. スマホ ではブラウザ上だけで完結 https://about.yahoo.co.jp/info/blog/20200914/passwordless.html 21 / 45

  22. PC ではどうなるか PC には基本、認証機は付いてないので、別の認証機と連携が求められます (Roaming Authenticators と呼ばれています) PC Chrome <->

    USB KEY PC Chrome <-> Android Device PC Safari <-> iPhone 22 / 45
  23. WebAuthn ウェブオースンと呼びます Web Authentication の略 FIDO 認証技術に関する WEB API 仕様(Web標準

    / W3C) Web標準なので、正式に勧告されると、すべてのブラウザで実装されることになる可能性が大きい is a JavaScript API Specification 23 / 45
  24. WebAuthn guide https://webauthn.guide/ 24 / 45

  25. WebAuthn 流れ(2つ) https://www.w3.org/TR/webauthn-2/#sctn-api 登録 / Registration ## 初回だけ 認証 /

    Authentication / Assertion ## 2回目以降 25 / 45
  26. WebAuthn 登場人物 Relying Party Public key credential Authenticator Attestation 26

    / 45
  27. Relying Party 略 RP 私たちが利用する Web サイトのこと 27 / 45

  28. Public key credential JavaScript API により生成される公開鍵 28 / 45

  29. Authenticator 認証機 秘密鍵を生成管理するデバイス iPhone / Touch ID, Face ID Android

    29 / 45
  30. Attestation アテステーション Authenticator から生成される証明書みたいなもの 30 / 45

  31. さらに詳しく https://techblog.raccoon.ne.jp/archives/1594945638.html 「FIDO2の登録と認証の流れを解説」から 登録時に秘密鍵はサーバ側に送信していない(重要) ことが確認できる また、2回目以降は登録時に作成した鍵で認証するので、 ユーザ情報 / 公開鍵などの送信は不要になる 31

    / 45
  32. Implementation | 実装 JavaScript APIs PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable() 利用できるかどうか navigator.credentials.create() ## 登録

    navigator.credentials.get() ## 認証 32 / 45
  33. PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable() WebAuthn が利用できるかどうか const isAvailable = await PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable() if (isAvailabe)

    { // 処理を続ける } 33 / 45
  34. navigator.credentials.create() / 登録 認証機に対して、公開鍵の作成を要求します const credential = await navigator.credentials.create({ publicKey:

    publicKeyCredentialCreationOptions }); publicKey: 公開鍵作成オプション 34 / 45
  35. publicKeyCredentialCreationOptions 公開鍵作成オプションの詳細(必須、オプションあり) const publicKeyCredentialCreationOptions = { challenge: Uint8Array.from( "サーバから送信されたランダム文字列(チャレンジ)", c

    => c.charCodeAt(0)), rp: { /* 利用するサイトの情報 */ name: "ミツエーリンクス", id: "mitsue.co.jp", }, user: { /* 利用するユーザの情報 */ id: Uint8Array.from( "UZSL85T9AFC", c => c.charCodeAt(0)), name: "lee@webauthn.guide", displayName: "Lee", }, pubKeyCredParams: [{alg: -7, type: "public-key"}], authenticatorSelection: { authenticatorAttachment: "cross-platform", }, attestation: "direct" }; const credential = await navigator.credentials.create({ publicKey: publicKeyCredentialCreationOptions }); 35 / 45
  36. 認証が完了すると クレデンシャル(公開鍵)がクライアント側で作成される(credential に結果が格納されます) console.log(credential); PublicKeyCredential { id: 'ADSUllKQmbqdGtpu4sjseh4cg2TxSvrbcHDTBsv4NSSX9...', rawId: ArrayBuffer,

    response: AuthenticatorAttestationResponse { clientDataJSON: ArrayBuffer(121), attestationObject: ArrayBuffer(306), }, type: 'public-key' } 36 / 45
  37. サーバに返却 作成された公開鍵などをサーバ側に返却する サーバ側はすべての情報を検証し問題なければ公開鍵を保存 紐づけを完了する 37 / 45

  38. navigator.credentials.get() / 認証 const credential = await navigator.credentials.get({ publicKey: publicKeyCredentialRequestOptions

    }); 38 / 45
  39. publicKeyCredentialRequestOptions const publicKeyCredentialRequestOptions = { challenge: Uint8Array.from( "サーバから送信されたランダム文字列(チャレンジ)", c =>

    c.charCodeAt(0)), allowCredentials: [{ id: Uint8Array.from( credentialId, c => c.charCodeAt(0)), type: 'public-key', transports: ['usb', 'ble', 'nfc'], }], timeout: 60000, } const assertion = await navigator.credentials.get({ publicKey: publicKeyCredentialRequestOptions }); 39 / 45
  40. demo https://webauthn.io/ 40 / 45

  41. Platform Support https://webauthn.me/browser-support Google Chrome Mozilla Firefox Microsoft Edge Apple

    Safari as well as Windows 10 and Android platforms 41 / 45
  42. まとめ FIDO/WebAuthnのメリット パスワードを覚えておく必要がなく、同じ認証方法で複数のサービスが利用できる 他人がなりすまして不正にログインすることが困難になる 認証に必要な機密情報がネットワーク上を流れないので、フィッシングや中間者攻撃の脅威が無い サービス提供者から認証に必要な情報が漏洩することがない 42 / 45

  43. 課題1:開発コストが見通しにくい 事例もまだまだ少ない 検証も必要 OAuth みたいに 3rd Party が API 提供してくれれば

    ( Google / Microsoft / Auth0 ) 43 / 45
  44. 課題2:デバイス紛失 機種変更したらどうする?と同じ SBI証券の取り組み例 https://faq.sbisec.co.jp/answer/6189c35a827f3a001c9277a3 スマートフォンの機種変更、もしくはスマートフォンを紛失し、 新しいスマートフォンでSBI証券スマートアプリの利用をご希望の際は、 特別な操作を行っていただく必要はございません。 新しいスマートフォンからSBI証券 スマートアプリでログインし、 認証設定を行うことで新しいスマートフォンでFIDO(スマホ認証)を利用することができます。

    44 / 45
  45. ご清聴ありがとうございました。 45 / 45