WebAuthnでパスワードレスなサイトを作る。安全なオンライン認証を導入するFIDOの基本

FIDO(Fast IDentity Online)とは、公開鍵認証方式を応用し、オンライン経由で認証を行う仕組みです。パスワード認証の安全性は限界が指摘されるなか、Webサイトにおいても生体認証などパスワードレスな仕組みを導入する企業が増えており、このFIDOやWebAuthnに注目が集まっています。Capy株式会社で情報セキュリティに関する研究開発や分析などに携わる、松本悦宜さんの解説です。

WebAuthnでパスワードレスなサイトを作る。安全なオンライン認証を導入するFIDOの基本

こんにちは、松本悦宜@ym405nmです。
FIDO(ふぁいど)に関しては、昨年(2018年)から多くのメディアや技術ブログで取り上げられ、導入するWebサイトも増えています。

FIDO2プロジェクトにおいて話題になったWebAuthn(Web Authentication API)についても、主なWebブラウザやWindows Helloでサポートが発表され、幅広い利用が期待されるようになりました。

この記事では、FIDOが開発される経緯や特徴といった基本的な事柄を解説します。ご自身のシステムで導入される際に、検討の一部として活用していただければ幸いです。

パスワードが限界にきている

FIDOや、FIDOを活用した生体認証がなぜ注目を集めているのか? について改めて解説しておきます。背景として、皆さんも体感されているように、パスワードの管理というものが限界にきていることがあります。

利用者にアカウントを発行しているサイトの多くが、各ユーザの認証をIDパスワードの組み合わせで行っています。このとき、ログイン画面に脆弱性があったり、総当たり攻撃を受けたりすることで、場合によっては第三者により不正ログインされ、アカウント情報が漏えいするなどの被害を受けることがあります。

パスワードリスト攻撃の流行

さらに2013年ごろから、パスワードリスト攻撃という攻撃手法が流行しました。

これは、同じID/パスワードの組み合わせを使い回しているユーザを狙って、別のサービスから漏えいしたIDパスワードの組み合わせを、攻撃者がそのまま他のサイトのログイン画面で試行するものです。ID/パスワードを使い回しているユーザは非常に多く、多くのサイトが継続的に被害を受けています。

パスワードの使い回しが原因なのであれば、サービス提供者としてはユーザに使い回しを止めてもらうよう連絡してお願いする対策が考えられますが、全てのユーザに対してこれを強制することは現実的ではありません。

フィッシングサイトによる被害の増加

既存サービスのログイン画面とそっくり同じページを作成して、なりすましメールやSMS(携帯電話のショートメセージ)などで誘導し、それと気づかずID/パスワードを入力してしまったユーザのアカウント情報を盗むフィッシング詐欺の被害が、継続的に発生しています。

フィッシングは、典型的には不正送金を目的としてオンラインバンキングのアカウントが被害にあってきましたが、それだけではなくオンラインゲームで使用するアカウントや、クレジットカード、SNS、宅配業者、ECサイトなど、さまざまな事例が報告されています。

ページをしっかり確認すれば、パスワードを送信する画面であるのに通信がHTTPSではなくHTTPだったり、そもそもドメインがそのサービスで利用されているものではなかったりして、フィッシングサイトだということは見分けられるのですが、フィッシングサイトのリンクを偽の警告メッセージとともに送って不安を煽るなど、攻撃が巧妙化しており、ふとした瞬間に騙されてしまうことがあります。

フィッシングサイトでID/パスワードが漏えいすることにより、不正ログインされ、場合によっては金銭的な被害を受けることもあります。

パスワードレスな認証へ

このようなパスワードに関するリスクを避けるために、パスワードの代わりにFIDOを使用して認証する方法や、FIDOを使用した二要素認証を実装することが注目されるようになりました。

FIDOによるオンライン認証の仕組み

FIDOは、Fast IDentity Onlineの略で、直訳すると「素早いオンライン認証」という意味になります。公開鍵認証方式を応用し、オンライン経由で認証を行う仕組みです。

一般には「FIDOイコール生体認証」というイメージを持たれていますが、この名称から分かるようにFIDOはオンライン認証の仕様であり、必ずしも生体認証とセットになっているわけではなりません。

ここで例として、あるシステムの認証でFIDOに準拠した生体認証をパスワードの代わりに導入する場合に、どのような手順で登録・認証されるのかを簡単に解説します。この方法は、後述するUAFという仕様をもとにしています。

登場する人物・機器としては、まずユーザと、そのユーザのスマートフォンがあります。スマートフォンの生体認証を利用しますが、FIDOではこれを認証器と呼んでいます。

次に、あなたが導入しようとするシステムです。これをFIDOでは、RP(Relying Party)と呼んでいます。導入前までは、IDとパスワードで管理されていました。

そして、FIDOの認証自体を行う認証サーバがあります。RPによっては、認証サーバとRPのサービスは同一サーバで処理されることもあります。

それでは、FIDOに登録する際と、認証する際の手順を解説します。FIDOの認証では、公開鍵暗号方式を使用しています。

登録の手順

登録の手順を下図に示します。

1

手順のそれぞれで、次のようなことが実行されています。

  1. ユーザがRPにアクセスし、登録のリクエストを送る
    このときの認証には従来のID/パスワードが使用される
  2. RPが、認証サーバにリクエストを送る
  3. 認証サーバが、登録時に使用するチャレンジを生成する
  4. あらかじめ定めている認証ポリシーとチャレンジを送る
  5. ポリシーをもとに、ユーザに認証を求める
    生体認証の場合は、ここで認証器が使用される
  6. 認証で使用する公開鍵・秘密鍵のペアと、鍵IDを生成する
  7. 生成した認証用の公開鍵と鍵IDなどを、あらかじめアプリが用意しているアテステーション秘密鍵で署名し、署名データを認証サーバに送信する
  8. 認証サーバがあらかじめ用意しているアテステーション公開鍵で署名を検証し、送信された公開鍵と鍵IDを保存する
  9. RPが結果を問い合わせ、登録を確認する

認証の手順

認証の手順を下図に示します。

2

手順のそれぞれで、次のようなことが実行されています。

  1. ユーザが、ログインのリクエストを送る
  2. RPが、認証サーバにリクエストを送る
  3. 認証サーバが認証で使用するチャレンジを生成する
  4. あらかじめ決めている認証ポリシーと、チャレンジを送る
  5. ポリシーをもとに、ユーザに認証を求める
    生体認証の場合は、ここで認証器による生体認証を行う
  6. チャレンジを認証用の秘密鍵で署名し、認証サーバに送付する
  7. 認証サーバが認証用の公開鍵で署名を検証する。
  8. RPが結果を問い合わせ認証を確認します。

FIDOによる生体認証のメリット

上記の手順により、FIDOには次のような利点があります。

  • 生体認証を簡単に利用できる
  • 生体情報がネットワーク上を流れない

生体認証を導入するにあたって、ユーザの手元のスマートフォンがFIDOに対応さえしていれば特別な機器は不要です。ハードウェアトークンなどの機器を利用するときでも、FIDOに対応していればそのまま利用できるため、連携も可能です。

また、登録時でも認証時でも、生体認証がユーザと端末の間で完結していることに注目してください。そのため、生体情報がネットワーク上に流れることはありません。

一般的に生体認証を使用したオンライン認証で懸念されることは、生体情報の漏えいです。例えば、指紋は一生変わらないと言われており、指紋情報はパスワードよりもセンシティブであると考えられます。

FIDOでは、ネットワーク上に生体情報が流れないため、仮にシステムが被害を受けたり、ネットワークが盗聴されたりして情報が漏えいした場合でも、攻撃者が生体情報にたどり着けないようになっています。

FIDO2とWebAuthn

FIDOには、当初からU2FUAFという2つの仕様があります。

U2F(Universal 2nd Factor)
認証器を用いた二要素認証を実現する。1つ目の認証をパスワードで、2つ目の認証をハードウェアトークンなどを用いて行う
UAF(Universal Authentication Framework)
パスワードを使用せず、UAFに準拠したスマートフォンなどの認証器を用いた生体認証により認証を行うことができる

FIDOの活用を進めるため、FIDOアライアンスによってこれらの仕様を拡張したFIDO2プロジェクトがあります。

FIDO2は、WebAuthnとCTAPという仕様で構成されます。中でも、目玉はWebAuthnだと考えられます。

WebAuthnは、FIDOをJavaScriptで使用するためのAPIです。このJavaScript APIを使用することによって、Webブラウザ上で各Webサービスに対してFIDOによる認証を行うことができます。

3Web Authentication: An API for accessing Public Key Credentials Level 1

PCのWebブラウザを使用してWebAuthnで認証する場合、PCに付属する指紋認証や顔認証などの認証器を用います。他に、FIDO2に対応しているUSBトークンで認証することもできます。

FIDO2ではこれに加えて、スマートフォンの認証器を使用できます。スマートフォンやスマートウォッチなど、外部認証器を使用してFIDO認証できる仕組みが、CTAP(Client-To-Authenticator Protocol)として現在仕様が策定されています。

4Client to Authenticator Protocol (CTAP)

CTAPでは、USBを経由する着脱型や、NFCやBluetooth/BLE(Bluetooth Low Energy)を経由する無線型がサポートされています。

WebAuthnを実際に動かしてみよう

WebAuthnは、Webブラウザと認証器があれば簡単に試すことができます。ここでは、デモサイト「WebAuthn Demo」のコードを自身の環境で動かして、WebAuthnの一連の流れを確認してみましょう。

WebAuthn Demo

WebAuthn Demoはオンラインで公開されており、すぐに確認することができます。ソースコードは、Adam Powers氏@apowers313により公開されており、自身の環境で動かすことで、動作確認やデバッグなどを試しながらWebAuthnに触れることができます。

5GitHub - apowers313/fido2-server-demo: A set of FIDO2 / WebAuthn demo servers

WebAuthn Demoを起動する

エンジニアHubに会員登録すると
続きをお読みいただけます(無料)。
登録のメリット
  • すべての過去記事を読める
  • 過去のウェビナー動画を
    視聴できる
  • 企業やエージェントから
    スカウトが届く