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

WebAuthn for Java developers

WebAuthn for Java developers

An introduction to WebAuthn for Java developers

Yoshikazu Nojima

May 18, 2019
Tweet

More Decks by Yoshikazu Nojima

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  15. 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仕様で定められた
    検証を実施
    リプレイ攻撃防止用のチャレンジを送信

    View Slide

  16. 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

    View Slide

  17. 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); // 認証に備え、永続化(方式はアプリケーション依存)

    View Slide

  18. 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

    View Slide

  19. 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);
    // 以下省略
    }

    View Slide

  20. 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に
    依存しない為の設計

    View Slide

  21. 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

    View Slide

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

    View Slide