今月、取引所のBitbankでパスキー(Passkey)を用いたパスワードレス認証でのログインが可能になりました。これに関連するものと思われる質問が読者様から寄せられていたので今回はこれに回答していきます。

最近ログインに際して、passkeyを設定できるサービスが増えてきた印象があります。
「メールアドレス・パスワード+アプリ2FA」と比較してメリットデメリットは何がありますか?

・Passkeyの概要と、FIDO2・2FAなどとの違い

・パスワード+2FAに対するPasskeyの優位性

・Passkeyに弱点はあるのか?

Passkeyの概要と、FIDO2・2FAなどとの違い

まず、ご存知のない方も少なくないと思うのでPasskeyについて軽く説明します。

FIDO2(WebAuthn)とは

まず、パスワードレスログインと聞いて最初に思い浮かぶのはFIDO2 (WebAuthn)という方も多いかもしれません。FIDO2とは、認証サーバー↔ブラウザ↔認証機の間のやり取りを定めたプロトコルで、簡単に言えばスマートフォンの指紋認証や顔認証で銀行のアプリにログインする際に使われているような規格です。

認証サーバー↔ブラウザの通信はWebAuthnという規格になっており、実装も簡単なのでそこそこの数のサービスが取り入れています。スマートフォンの普及によって多くの人が指紋・顔といった生体認証が行える認証機を持っているために実現できたものです。

WebAuthnでは登録時に対象ドメインごとに新しいキーペアをデバイス内で生成し、その公開鍵を認証サーバー側に登録します。その後、そのドメイン上のページからチャレンジと呼ばれるメッセージとともに認証要求があり、ユーザーは生体認証をし、成功するとデバイス内でチャレンジに署名し、それを提出することでログインを検証します。

よく勘違いされますが、認証に用いる指紋や顔の特徴データはデバイス上に保存されており、サーバーに送信されるわけではありません。

Passkeyとは

FIDO、FIDO2はデバイスごとにキーペアが異なるため新しいデバイスから利用するたびに古いデバイスで認証して新しい鍵を登録するというプロセスが必要であり、利用フローのみならず認証システムも複雑化する問題があります。

またいくらパスワードレスがセキュアであっても、鍵を1つしか登録していないときにそのデバイスが壊れた場合にどのように認証してアクセスを取り戻すかという部分も脆弱になりやすいです。大抵の場合、人間が介在するリカバリープロセスになるためです。(セルフィーの提出・身分証との照合など、他の個人情報の収集などにもつながり様々なリスクが増大します)

そこで登場したのがPasskeyという規格で、異なるデバイス間で同じ鍵(FIDOで使われているのと同様のもの)をクラウドを介して同期することができます。例えばApple、Google、Microsoftといったプラットフォームでそれぞれのアカウントと紐づけて同期されます。1Passwordなどのアプリケーションで管理することもできます。

Yubikeyなどのハードウェアに保存できて鍵をデバイスから出し入れできない(FIDO2に近い)Passkeyもあります。英語ですがYubikeyがわかりやすいインフォグラフィック(PDF)を出しています。

言い換えると、FIDO2では生体認証に紐づく鍵を各デバイスで持っていたところ、Passkeyでは生体認証を行うデバイスによらず同じ鍵を使えます。その気になればセルフホスト型のPasskeyインフラを使うこともできるようです。

2FA(2要素認証)とは

一般的に認証とは「知っている情報」「持っているモノ」「身体的特徴」などを使って行い、これらのカテゴリを要素と呼びます。ATMを利用する際に必要なそれぞれの要素の例としてPINコード、キャッシュカード、静脈認証などが挙げられます。

パスワード認証は知っている情報だけによる認証であり、仮に攻撃者がパスワードとIDの組み合わせを手に入れてしまうと容易に突破されてしまいます。そこで2要素認証として「セットアップによってデバイスに組み込まれた秘密鍵から生成されるワンタイムキー」を追加することで、パスワードを知ってしまっただけの攻撃者に対してもう1段階のセキュリティを用意することができ、防御力が飛躍的に向上します。これが一般的な2要素認証です。

似た用語として頻出する2段階認証とは、同じ要素に当てはまる2つの情報を用いて認証するもので、2要素を使うわけではない場合に用いる用語です。十分に関連性が低ければ多少のセキュリティ改善は見込めるかもしれませんが、改善しない場合もあります。(2段階目が生年月日や出身小学校などの推測しやすい情報の場合など)

多くの場合、2つの用語はあまり意識的に区別されずに使われている印象があります。自分もよく2要素認証の意味で2段階認証と言ってしまいます。

パスワード+2FAに対するPasskeyの優位性

これまで取引所の口座をはじめとするセキュリティの求められるアカウントの管理方法として「パスワードに加え、2要素認証を設定する」というものがありました。読者の皆様もほとんどが利用しているのではないでしょうか。

この場合の2要素認証は一般的にGoogle AuthenticatorやAuthyなどの専用アプリに秘密鍵を登録して、一定時間ごとに切り替わる6桁のワンタイムキーを生成させ、パスワードに加えてこのワンタイムキーをログイン時に送信することで「パスワードだけが流出しても攻撃者にアカウントを乗っ取られないというわけです。ワンタイムキー以外に、前述したFIDO2を使った2要素認証を行うアプリもあります。

逆に言えば2要素認証用の秘密鍵、あるいはその鍵が入ったデバイスにもアクセスされてしまうと2要素認証は突破されてしまいます。2FAの登録時に表示されるリカバリー用のパスフレーズやQRコードのスクリーンショットなどを撮ってしまうと、それが流出した場合に問題になりますね。ランダムなので可能性は低いですが、ダメ元で入力したワンタイムキーが当たる確率も1/100万と、期待される報酬が高い場合には低くないと考える人もいるでしょう。

例えばGoogleアカウントが乗っ取られた場合、メールアドレスとともに上記の方法でバックアップしてしまった2FA用のデータも奪われてしまい、問題なく2段階認証を突破されるという問題があります。また、Google Authenticatorではデバイス間の移行を簡単にするために既定で2FA用の秘密鍵がクラウド同期されており、やはりGoogleアカウントが乗っ取られてしまうと流出してしまいます。(Googleアカウント自体にも2FAを設定できますが)

2FAの課題

2FAは確かに便利で、正しく運用すればどこからかパスワードが流出してしまった場合などにアカウントを守ってくれる機能を果たしてくれます。しかし、いくつかの課題が残ります。

まず、おそらく私達が考えている以上に2段階認証を面倒くさがって設定しない人は多いです。専用のアプリを入れて、鍵を登録して、機種変更のたびに新しく登録しなおして、どこかにリカバリーキーを残して、、、と、それなりに導入をためらう要因になっているのではないでしょうか。最近ログイン時にメールやSMSでワンタイムキーを伝えてくるサービスも多いですが、ログインに1分近くかかってしまうこともありもどかしいですよね。

次に、フィッシング攻撃によっては2段階認証を突破できるものもあったりします。間違ってフィッシングサイトにアクセスしてしまい、ログインフォームにIDとパスワードを入力したとします。そこにさらにフィッシングサイトが2段階認証を求めてくるので入力すると、その背後では攻撃者が別のブラウザで正規のサイトにパスワード・ID・2段階認証を用いてログインしてしまえるという問題です。

このとき、ログイン通知メールなどが来てもユーザーは実際にログインしたつもりので違和感を感じないという特徴もあります。仮にAuthenticatorではなくプッシュ通知(例えばGoogleアカウントにログインする際に、Androidスマートフォンに来る通知)でも間違って承認してしまう可能性が高い攻撃といえるでしょう。

つまりワンタイムキー型の2FAは脆弱なパスワードがあるアカウントを守ったり、パスワードの流出からアカウントを守るのには優れていても、フィッシング攻撃には弱い部分があります。(FIDO2であれば、フィッシングサイトに対する認証では新しい鍵を生成することになり、正規サイトの鍵を使わないので、ここの脆弱性はありません。)

Passkeyの優位性

まず、上記で述べた通りPasskeyはFIDOの鍵を同期できるようにしたものなので、フィッシング耐性が非常に強いです。ドメイン名が異なる場合、新しい鍵を生成してしまうため、間違ってフィッシングサイトに正規のクレデンシャルでログインを試みてしまうことはありません。

さらにワンタイムキー型の2要素認証と同じく、「持っているモノ」で認証できるという意味で、仮にパスワードと組み合わせた2要素認証として使っても上位互換といえるでしょう。

そして強力なのが、高々100万通りで運用される6桁のワンタイムキーより、公開鍵暗号を用いたPasskeyには十分なセキュリティがあり、完全にパスワードレスな運用が可能になるという点です。これはパスワードにまつわる面倒な部分(生成、保存・記憶、変更、入力、安全確保)を一気に排除しても大丈夫ということです。

また、ユーザー視点で見ても「パスワードを入力させるサイトが、流出したら大変な平文でパスワードを保存していないか」を確認することは困難ですが、Passkey(FIDO)ではサーバー側には公開鍵が登録されるだけなので、間違っても秘密鍵が保存されている可能性はありません。したがって安心して使えるという魅力もあります。(パスワードを平文で保存してしまうようなサイトがPasskey認証を導入する技術力を持っているかはともかく)

Passkeyに弱点はあるのか?

さて、ここまで読んでPasskeyにはデメリットがなさそうに見えてきます。実際にデメリットを考えても、同期にまつわる根本的なセキュリティの問題と、いくつかのエッジケースしか思い当たりません:

・デバイスの共有を考慮されていない。FIDO同様、デバイス単位でハードウェア的に鍵が管理されているため、パスワードレス認証の場合だと共有デバイス=共有アカウントとなってしまう。つまりOS上でアカウントを分けていても家族などで共有する(複数人の生体認証が可能な)デバイスには向いていない。パスワード+2FAの場合、デバイス上のアカウントを分ければ問題を軽減できる。

・使っているサービスにログインできるかどうかのセキュリティが完全に「Passkeyを保管しているデバイスのセキュリティ」と等しくなる。意図に反して(寝ている、意識を失った状態などで)指紋認証するだけでサービスにログインさせられる可能性がある。ただし、これはパスワード(自動入力)+2FAと変わらない。

・Passkeyを同期するのに使うプラットフォームのセキュリティがアキレス腱となりうる。(新しいデバイスを追加されてしまうとセキュリティがなくなる。)パスワードも必要なくなるため、パスワード+2FAでいう2FAの登録情報の流出よりも深刻だが、既存のデバイスでの認証による承認が必要になるためハードルは高い。

・パスワードと法的な保護が異なる可能性がある(専門外だが、米国ではパスワードは憲法で保護されるが生体情報やデバイスは保護されないため、警察などに強制的に認証させられる可能性がある)

フィッシング被害が近年拡大しつづけているので、フィッシングに対して強固なことの1点だけでも企業側・ユーザー側でPasskey認証を導入する大きな理由になると思います。私自身も積極的に使っていきたいと思います。

国内のフィッシング情報の届け出件数の推移

フィッシング対策協議会 フィッシングレポート2023 (PDF