はじめに
皆さんはYubikey使ってますか?Webサイトの2段階認証だけではなくスマートカードとして動作するので証明書を入れられたり,OpenSSHの2段階認証手段や鍵管理に使えて非常に便利ですよね.私はここ2年ほど毎日のように使っていて完全に生活必需品となっています.
最近になってWindows11がパスキーをサポートしたりGitHubやAmazon,Googleでパスキーによるログインができるようになるなど,パスキーという単語を聞く事が増えました.
パスキーとFIDO2とWebAuthnに関して調べていたら思っていたより複雑だったのでここにまとめることにします.
FIDO2とは
FIDO2はFIDO Allienceによって策定されたパスワードレス認証のための規格で,CTAP2(Client-to-Authenticator Protocol)とWebAuthn(Web Authentication)の2つの規格から構成されています.
簡単に説明すると,CTAP2は認証デバイス(セキュリティキー)とクライアント(ブラウザやOS等)間で通信するための規格で,WebAuthnはRelying Party(Webサイト)とクライアント(ブラウザやOS等)間で通信するための規格です.
CTAP2とは
CTAP2はClient To Authenticator Protocolの略で,USB/Bluetooth/NFC等で接続されたAuthenticator(セキュリティキー)とClient(ブラウザ等)間で通信するための規格です.
FIDO U2F(Universal 2nd Factor)と呼ばれる方式の後継規格で,基本的な仕様はU2Fを踏襲しています.
WebAuthnとは
WebAuthnはWeb Authenticationの略で,Relaying Party(Webサイト)とClient(ブラウザ等)間で通信するためのWeb標準です.Chrome 67以降,Firefox 60以降で対応しています.
FIDO2における主な用語
Client
認証を行うクライアントで,WebブラウザやOSのことを指します.
Relying Party(RP)
認証を行うWebサイトのことを指し,多くの場合RPと略されます.
Authenticator
認証デバイス.主にセキュリティキーやスマートフォンのことを指します.
Credential
認証情報のことを指します.いくつか種類が存在しており,主に認証デバイスに格納されるものとRPに格納されるものがあります.
FIDO2のCredential
FIDO2で生成される認証情報をCredentialと呼びます.
Credentialは大きく分けて2種類存在します.
Discoverable Credential / Passkey / Resident Credential
Discoverable Credential(Client-side discoverable Credential)は認証デバイスに保存され,クライアントから検出可能なCredentialです.
WebAuthn Level2以前ではResident Credential/Resident Keyと呼ばれていましたが,Level2で正式な名称としてはDeprecatedになり,WebAuthn Level3では"Passkey"という新たな名称が追加されるなど少々ややこしい経緯があるようです.(https://www.w3.org/TR/webauthn-3/#client-side-discoverable-credential) 互換性のため,API内では引き続き"resident"という名称が使われています.
Discoverable Credentialは認証デバイスに保存されるため,登録可能数は認証デバイスのスペックに依存します.(Yubikey5の場合25個)
Discoverable Credentialは秘密鍵以外に以下の情報を含むようです.
- Credential ID(id/Credentialの識別子)
- RP ID(rp id/RPのドメイン)
- RP Name(rp name/RPの名前)
- User ID(user id/ユーザの識別子)
- Username(name/メールアドレス等のユーザ名)
- Display Name(displayName/氏名等の表示名)
Server-side Credential / Non-Discoverable Credential / Non-Resident Credential
Server-side Credential(Server-side Public Key Credential Source)は認証デバイスに保存されず,RPに保存されるCredentialです.WebAuthn Level2以前ではNon-Resident Credential/Non-Resident Keyと呼ばれていました.
Server-side Credentialは認証デバイスに保存されません.そのため登録できるサイトの数は実質無限となっており,基本的な仕組みはFIDO U2Fに近いものになっています.
パスキーって何?
FIDO2は非常にセキュリティの高い方式である一方,一般ユーザにとって物理セキュリティキーは未だにハードルが高い(価格が高い,管理が難しい,紛失時のリスクが高い)のが現実です.
これらの問題を解決するため,携帯電話やPC等のデバイスにCredentialを保存し,それを同期する仕組みがWebAuthn Level3に盛り込まれました.
主な変更点として,"Client-side discoverable Credential"のことを指す新たな単語として"Passkey"が追加され,Passkeyを異なるデバイス間で同期するための仕組みと同期状態を認識するための仕組みが追記されました.
PasskeyはDiscoverable Credentialのうちパスワードレス認証が可能なものを指します.そのため,携帯電話等のデバイスだけでなくYubikey等の認証デバイスにも保存することが可能です.
GitHubでは登録済みのYubikeyをPasskeyに昇格させることでパスワードレスでのログインが可能になります.
まとめ
FIDO2におけるWebAuthnとCTAP2の仕組みと認証に使われるCredential,新しく登場したパスキーの概要について理解することができました.
FIDO2対応のサイトにYubikeyを登録した際Credentialが保存されなかったことがあったので,Server-side Credentialの仕様を知り納得しました.