パスキーによる認証を開発したとき、パスキーの安全性をどう評価するのが妥当なのか検討していた。もちろんフィッシング耐性が高いというような特性については把握していて、サービス利用者にとって便益の多い認証であることはわかっている。ただそれが、例えばパスワードとTOTPを組み合わせた多要素認証に対して、どちらがより安全と言えるのか。これを一言に表すのはあまり簡単ではない。
パスキーは多要素認証なのか
多要素認証というのは、something you know、something you have、something you are の3種類の要素のうち複数を組み合わせる認証を言う語だ。
多要素認証は単一種類の要素による認証と較べて飛躍的に安全である。例えば、物理的な鍵は something you have であるが、それが盗まれてしまえば安全ではない。鍵が複数あっても、一度に盗まれてしまうかもしれない。もしここに something you are である生体認証が加われば、鍵だけが盗まれても問題ないから、安全性が大きく向上する。
パスワードは something you know、TOTPは something you have であるから、このふたつを組み合わせると多要素認証になる。
ではパスキーは単一要素なのか多要素なのか。
スマートフォンでパスキーを利用したことがある人ならご存じのとおり、パスキーを利用する際にはスマートフォンの生体認証が要求される。このことで、基本的には多要素認証として扱ってよいのだろう。パスキーが保存されているスマートフォンを持っており(something you have)、生体認証(something you are)でアクティベートされている。
ところが、生体認証のための機能を備えていないパソコンでは、パスキーの利用時に、何も問われないか、あるいはパソコンのログインパスワードが要求されるかする。特に前者の場合、something you have しか満たさないのではないか。このようなケースがある以上、パスキー全体を多要素認証とは見做せないのではないか。
ユーザーの確認
このような問題のために、パスキー(WebAuthn)には仕組みがある。詳細はweb.devの次の記事が詳しい。
RP(認証するサービス側)はuserVerification
の値によって、パスキーの挙動を制御できる。そして送られてくるユーザーの確認(UV)フラグの値によって、実際のユーザーがデバイスを操作していることを検証できる。
要するに、UVフラグが真のとき、実質的に多要素認証の要件が満たされたと見做せるはずだ。
NIST SP 800-63B
ここまでで、UVフラグが真の場合のパスキーが多要素認証と同等であると見做せるだろうということを説明した。このことを改めて確認するために、米国国立標準技術研究所(NIST)が発行するNIST SP 800-63 Digital Identity Guidelinesを参照する。この文書は、アメリカ政府を対象としたガイドラインであるから、普遍的に適用できるものではないが、網羅的に整理されており、一定の頻度でアップデートが重ねられていることから、これを基準として用いるのが普通だ。特に、いままさに第4版への改訂作業が進んでおり、そのPublic Draftではパスキーに相当する概念が扱われている。
Syncable Authenticatorsというのは、パスキーが複数のデバイスで同期できることからくるネーミングだ。
この文書のImplementation Requirementsに、以下の記述がある。
User Verified (UV)
The User Verified flag indicates that the authenticator has locally authenticated the user using one of the available “user verification” methods. Verifiers SHALL indicate that UV is preferred and SHALL inspect responses to confirm the value of the UV flag. This indicates whether the authenticator can be treated as a multi-factor cryptographic authenticator. If the user is not verified, agencies SHALL treat the authenticator as a single-factor cryptographic authenticator. A further extension to the WebAuthn Level 3 specification (see Sec. 10.3 of WebAuthn) provides additional data on verification methods if agencies seek to gain context on the local authentication event.
要するに、UVフラグが真のとき「multi-factor cryptographic authenticator」として扱えるが、そうでなければ「single-factor cryptographic authenticator」として扱わなければならない、ということになっている。
NIST SP 800-63Bでは、認証のレベルを3つのAuthentication Assurance Level (AAL)に分けており、AAL3が最も信用でき、AAL1が基本的なレベルという風に設定されている。AALを満たすための条件の一つに、「Permitted Authenticator Types」がある。
AAL3で許可されているauthenticatorは、「multi-factor cryptographic authentication」か「single-factor cryptographic authentication used in conjunction with a password」のどちらかである。つまりパスキーは、UVフラグが真ならそれ単体でAAL3の(authenticatorの)要件を満たし、UVフラグが偽であったとしてもパスワードとの組み合わせで要件を満たす。
パスワードとTOTPの組み合わせではAAL2までの要件しか満たさない。この差は、cryptographic authenticationがフィッシング耐性を持つ「single- あるいは multi-factor cryptographic authentication」ではない、手動入力を必要とするauthenticatorはフィッシング耐性を持たない*1という性質からきているものと思われる。
パスキーの安全性について
パスキーはUVフラグの値が真なら実質的に多要素認証であり、フィッシング耐性の面から、パスワードとTOTPの組み合わせよりもセキュアであると考えられている、ということを説明した。
もちろん、パスキーに限ったものではないが、実装の詳細や運用によって問題が起きる場合も考えられ、間違いなくいつでも安全ということはない。パスキー自体も進歩しており、これからさらに使いやすく便利になっていく。しかし現時点でも、安全かつ便利な有力な選択肢と思う。
はてなはパスキーに対応しています。