Slide 1

Slide 1 text

Copyright © Yoshikazu Nojima 2018 Java開発者のためのWebAuthn入門 2019-05-18 JJUG CCC Spring 能島 良和 (@shiroica)

Slide 2

Slide 2 text

Copyright © Yoshikazu Nojima 2018 自己紹介 • 能島良和 • 通信キャリアでホスティングサービスの開発・運用 • 前職は通信キャリア系SIerで社内向けにSpringのPJ支援業務 • Apache CloudStack Commiter(活動休止中。。) • WebAuthn周りは趣味 • Twitter:@shiroica • GitHub:ynojima 1

Slide 3

Slide 3 text

Copyright © Yoshikazu Nojima 2018 突然ですが・・・ この中にオンラインサービスのアカウントを 乗っ取られた経験のある方はいますか? 2

Slide 4

Slide 4 text

Copyright © Yoshikazu Nojima 2018 恥ずかしながら私はあります・・・ 3

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

Copyright © Yoshikazu Nojima 2018 Web Authentication仕様とは 最近W3Cで勧告候補になった、パスワード認証の問題点を克服したセキュアな認証を 実現するためのWeb標準。セキュリティキーによる二段階認証や生体認証を実現。 ■主な特徴 • 指紋認証や顔認証など認証方式を差し替え可能 • 生体情報をサーバーで保存せず、安全性が高い • フィッシング攻撃、 CSRF攻撃対策の組込 5

Slide 7

Slide 7 text

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) チャレンジ その他の検証 耐タンパ 領域 • ローカル認証情報(生体情報等) を検証 ユーザー検証機能付き認証デバイスの場合

Slide 8

Slide 8 text

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固有公開鍵 の読込

Slide 9

Slide 9 text

Copyright © Yoshikazu Nojima 2018 WebAuthnの技術的な特徴 ローカル認証と公開鍵認証の組み合わせ • ローカル認証 • ユーザーと認証デバイス間の認証 認証方式は交換可能(例:指紋認証、虹彩認証、PIN) • 公開鍵認証 • 認証デバイスとサーバー間の認証 8 ユーザー 認証デバイス サーバー ローカル認証 (指紋認証等) 公開鍵認証

Slide 10

Slide 10 text

Copyright © Yoshikazu Nojima 2018 生体認証をローカル認証とするメリット 生体認証をリモート認証とした場合のリスク • 生体情報は変更不可能なことから究極のプライバシー情報。取扱は慎重さが求められる • サーバーに生体情報を保存する生体認証では、生体情報は経路上で様々な攻撃に晒される • WebAuthnでは生体情報が認証デバイスから外に流通せず、安全性が高い(ローカル認証) • クライアント(ブラウザ)とサーバーは公開鍵と、公開鍵で検証できる署名を受け取るのみ • 生体情報と秘密鍵は認証デバイスのTPMやセキュアエレメントのような耐タンパ領域に保存 • デメリット • 登録時に使用した認証デバイスがないと認証できない ※認証デバイスの保持を認証要素の1つと見做せる側面もある 9 ユーザー 認証デバイス ブラウザ サーバー DB 生体情報の 検証 承認ジェスチャ (生体情報) の提供 • 生体情報 • 生体情報

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

Copyright © Yoshikazu Nojima 2018 モバイルデバイス対応 近年のスマホで充実している、生体認証(指紋、顔認識)を ローカル認証に活用することで、パスワードを打ち込む 煩雑さからユーザーを開放し、離脱率を抑えることが期待 12

Slide 14

Slide 14 text

Copyright © Yoshikazu Nojima 2018 サーバーサイド観点でのWebAuthn 13

Slide 15

Slide 15 text

Copyright © Yoshikazu Nojima 2018 サービス/システムにWebAuthnを導入する場合、 サーバーサイドで必要な対応 14 • ユーザー認証 ユーザー 認証デバイス ブラウザ サーバー 承認ジェスチャ (指紋スキャン等) の実施 • Credential Id • 認証デバイスデータ • RP Idのハッシュ • フラグ • カウンタ • 資格情報データ • 署名 を送信 • Credential Id • チャレンジ、ドメイン (RpId)その他 • 認証デバイスデータ • RP Idのハッシュ • フラグ • カウンタ • 資格情報データ • 署名 を送信 • RP Idのハッシュ • チャレンジ、ドメイン(RpId) その他のハッシュ RP固有秘密鍵でRpIdのハッシュ、 フラグ、カウンタ、クライアント データのハッシュを署名 ドメイン(RP Id)、署名 チャレンジ、その他の検証 • チャレンジ を送信 ユーザー検証機能付き認証デバイスの場合 耐タンパ 領域 • ローカル認証情報(生体情報等) を検証 RP固有秘密鍵を読込 DB RP固有公開鍵 の読込 フロントエンドからcredentialIdやチャレンジ、署名な どの認証情報を受信し、WebAuthn仕様で定められた 検証を実施 リプレイ攻撃防止用のチャレンジを送信

Slide 16

Slide 16 text

Copyright © Yoshikazu Nojima 2018 WebAuthn4Jとは • WebAuthnの登録・認証メッセージ検証用ライブラリ • Java製、Apache2ライセンス • コミュニティベースの開発 • https://github.com/webauthn4j/webauthn4j ◼ 主な特徴 • 全Attestation Statement対応 • FIDO Allianceの準拠テストツールをパス • ポータビリティ • 依存ライブラリはJackson(JSON, CBOR処理)、Apache Kerby (ASN.1処理)、SLF4J(ログインタフェース)のみ。導入の障壁が少ない • テストサポート機能の充実 • Keycloak向け拡張モジュール開発中 • Spring Security拡張モジュール開発中 15

Slide 17

Slide 17 text

Copyright © Yoshikazu Nojima 2018 基本的な使用方法(登録) 16 // フロントエンドから受信したリクエスト、検証条件を詰めてコンテキストクラスを組立 WebAuthnRegistrationContext registrationContext = new WebAuthnRegistrationContext(clientDataJSON, attestationObject, transports, serverProperty, userVerificationRequired); // Validatorの生成 WebAuthnRegistrationContextValidator webAuthnRegistrationContextValidator = WebAuthnRegistrationContextValidator.createNonStrictRegistrationContextValidator(); // 検証の実施 WebAuthnRegistrationContextValidationResponse response = webAuthnRegistrationContextValidator.validate(registrationContext); // Authenticatorインスタンスの組立 Authenticator authenticator = // アプリの要件にあわせ、Authenticatorインタフェースの独自実装利用可 new AuthenticatorImpl( response.getAttestationObject().getAuthenticatorData().getAttestedCredentialData(), response.getAttestationObject().getAttestationStatement(), response.getAttestationObject().getAuthenticatorData().getSignCount() ); save(authenticator); // 認証に備え、永続化(方式はアプリケーション依存)

Slide 18

Slide 18 text

Copyright © Yoshikazu Nojima 2018 // フロントエンドから受信したリクエスト、検証条件を詰めてコンテキストクラスを組立 WebAuthnAuthenticationContext authenticationContext = new WebAuthnAuthenticationContext( credentialId, clientDataJSON, authenticatorData, signature, serverProperty, userVerificationRequired); // 永続化していたAuthenticatorの読込(方式はアプリケーション依存) Authenticator authenticator = load(credentialId); // Validatorの生成 WebAuthnAuthenticationContextValidator webAuthnAuthenticationContextValidator = new WebAuthnAuthenticationContextValidator(); // 検証の実施 WebAuthnAuthenticationContextValidationResponse response = webAuthnAuthenticationContextValidator.validate(authenticationContext, authenticator); // カウンタの更新(方式はアプリケーション依存) updateCounter( response.getAuthenticatorData().getAttestedCredentialData().getCredentialId(), response.getAuthenticatorData().getSignCount() ); 基本的な使用方法(認証) 17

Slide 19

Slide 19 text

Copyright © Yoshikazu Nojima 2018 テストサポート機能 • WebAuthnによるログインのテストを自動化する場合、 最大の問題は認証デバイスをどうするか • WebAuthn4Jではテストサポート用に認証デバイスのエミュレータを用意 18 // 認証デバイスエミュレータの接続されたクライアントエミュレータを準備 private ClientPlatform clientPlatform = EmulatorUtil.createClientPlatform(new AndroidSafetyNetAuthenticator()); @Test void validate_test(){ String rpId = “example.com”; Challenge challenge = new DefaultChallenge(); AuthenticatorSelectionCriteria authenticatorSelectionCriteria = new AuthenticatorSelectionCriteria(AuthenticatorAttachment.CROSS_PLATFORM, true, UserVerificationRequirement.REQUIRED); PublicKeyCredentialParameters publicKeyCredentialParameters = new PublicKeyCredentialParameters(PublicKeyCredentialType.PUBLIC_KEY, COSEAlgorithmIdentifier.ES256); PublicKeyCredentialUserEntity publicKeyCredentialUserEntity = new PublicKeyCredentialUserEntity(); AuthenticationExtensionsClientInputs extensions = new AuthenticationExtensionsClientInputs<>(); PublicKeyCredentialCreationOptions credentialCreationOptions = new PublicKeyCredentialCreationOptions( new PublicKeyCredentialRpEntity(rpId, “example.com”), publicKeyCredentialUserEntity, challenge, Collections.singletonList(publicKeyCredentialParameters), null, Collections.emptyList(), authenticatorSelectionCriteria, AttestationConveyancePreference.DIRECT, extensions ); // エミュレータによるCredentialの生成 PublicKeyCredential publicKeyCredential = clientPlatform.create(credentialCreationOptions); // 以下省略 }

Slide 20

Slide 20 text

Copyright © Yoshikazu Nojima 2018 WebAuthn4Jのスコープ (1/2) 19 • ユーザー認証 ユーザー 認証デバイス ブラウザ サーバー 承認ジェスチャ (指紋スキャン等) の実施 • Credential Id • 認証デバイスデータ • RP Idのハッシュ • フラグ • カウンタ • 資格情報データ • 署名 を送信 • Credential Id • チャレンジ、ドメイン (RpId)その他 • 認証デバイスデータ • RP Idのハッシュ • フラグ • カウンタ • 資格情報データ • 署名 を送信 • RP Idのハッシュ • チャレンジ、ドメイン(RpId) その他のハッシュ RP固有秘密鍵でRpIdのハッシュ、 フラグ、カウンタ、クライアント データのハッシュを署名 ドメイン(RP Id)、署名 チャレンジ、その他の検証 • チャレンジ を送信 ユーザー検証機能付き認証デバイスの場合 耐タンパ 領域 • ローカル認証情報(生体情報等) を検証 RP固有秘密鍵を読込 DB RP固有公開鍵 の読込 スコープ外 スコープ外 スコープ • WebAuthn4JはWebAuthnの Attestation/Assertionの検証のみを実施 する単機能ライブラリ • HTTPリクエストからのAttestation/ Assertionの取出処理、DBへの永続化 はスコープ外 • Servlet APIなど、特定のAPIに 依存しない為の設計

Slide 21

Slide 21 text

Copyright © Yoshikazu Nojima 2018 WebAuthn4Jのスコープ (2/2) • ギャップへの対応 • 認証フレームワークに合わせたアダプタライブラリを準備 • Spring Security • Spring Security WebAuthnというExtensionを開発中 • Spring Securityに則ったWebAuthn実装を提供 • Spring SecurityのAuthenticationProviderインタフェースの実装 • WebAuthnオプション提供用RESTエンドポイントServletFilter • 認証用ServletFilter • JavaConfig • 等々 • Spring Security本体にPull Request中 20

Slide 22

Slide 22 text

Copyright © Yoshikazu Nojima 2018 まとめ • パスワード認証には限界がある • フィッシング攻撃対応 • リスト型攻撃対応 • モバイルデバイス対応 • W3Cで新しい認証方式としてWeb Authentication仕様の策定が進められている • ローカル認証と公開鍵認証の組み合わせ • 生体情報をサーバーで保存する必要がなく安全性が高い • 仕様としてフィッシング攻撃対策、CSRF攻撃対策を盛込済 • 主要ブラウザで実装が進行中 • Edge/Chrome/Firefox/Safari • サーバーサイドの実装を補助する為、WebAuthn4JというJavaライブラリを開発 • Spring SecurityやKeycloak向けにアダプタ開発中 21