Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

パスワードではなく、本人と特定できる情報 生体認証 指紋 / Touch ID 顔 / Face ID セキュリティキー https://ftsafe.co.jp/solutions/security_device/ 10 / 45

Slide 11

Slide 11 text

パスワードを覚える必要はなくなった 11 / 45

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

キーワード FIDO WebAuthn 16 / 45

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

FIDO とは 従来のパスワードに代わる認証規格を策定する業界団体のこと 認証技術の規格の呼び名でもあるようです 厳密には FIDO UAF, FIDO U2F, etc. Microsoft, Google, Apple が策定やサポートに関わっています 18 / 45

Slide 19

Slide 19 text

FIDO の特徴 生体認証やセキュリティキー(USB)など特別な端末(認証機)を利用する サーバとユーザで秘密の情報を共有しない パスワードを送信しない / パスワードレス 公開鍵認証方式と同じ原理 ※ 公開鍵認証方式で課題の解決に ※ ただ、お手軽ではありませんでした 19 / 45

Slide 20

Slide 20 text

FIDO2 FIDO をより利用しやすく ウェブブラウザ上だけで完結、特別な端末は不要 20 / 45

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

WebAuthn ウェブオースンと呼びます Web Authentication の略 FIDO 認証技術に関する WEB API 仕様(Web標準 / W3C) Web標準なので、正式に勧告されると、すべてのブラウザで実装されることになる可能性が大きい is a JavaScript API Specification 23 / 45

Slide 24

Slide 24 text

WebAuthn guide https://webauthn.guide/ 24 / 45

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

WebAuthn 登場人物 Relying Party Public key credential Authenticator Attestation 26 / 45

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable() WebAuthn が利用できるかどうか const isAvailable = await PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable() if (isAvailabe) { // 処理を続ける } 33 / 45

Slide 34

Slide 34 text

navigator.credentials.create() / 登録 認証機に対して、公開鍵の作成を要求します const credential = await navigator.credentials.create({ publicKey: publicKeyCredentialCreationOptions }); publicKey: 公開鍵作成オプション 34 / 45

Slide 35

Slide 35 text

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: "[email protected]", displayName: "Lee", }, pubKeyCredParams: [{alg: -7, type: "public-key"}], authenticatorSelection: { authenticatorAttachment: "cross-platform", }, attestation: "direct" }; const credential = await navigator.credentials.create({ publicKey: publicKeyCredentialCreationOptions }); 35 / 45

Slide 36

Slide 36 text

認証が完了すると クレデンシャル(公開鍵)がクライアント側で作成される(credential に結果が格納されます) console.log(credential); PublicKeyCredential { id: 'ADSUllKQmbqdGtpu4sjseh4cg2TxSvrbcHDTBsv4NSSX9...', rawId: ArrayBuffer, response: AuthenticatorAttestationResponse { clientDataJSON: ArrayBuffer(121), attestationObject: ArrayBuffer(306), }, type: 'public-key' } 36 / 45

Slide 37

Slide 37 text

サーバに返却 作成された公開鍵などをサーバ側に返却する サーバ側はすべての情報を検証し問題なければ公開鍵を保存 紐づけを完了する 37 / 45

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

demo https://webauthn.io/ 40 / 45

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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