created_at
updated_at
tags
toc

Passkey への道 #6: タブーを破った Apple

Intro

TOTP/WebAuthn は、バックアップコードの適切な保管方法が示されないまま、移行だけが推し進められた。

YubiKey などの物理 Authenticator の扱いとして、「二本登録して、片方は普段使い、もう片方は貸金庫へ」などと、かなり無理のあるベストプラクティスが啓蒙されたりもしていた。

それらをスマホに移行して、登録は便利だが壊したら詰むでは、ユーザは安心して使えない。いや、正確には「よくわからないまま使って、詰んでから Apple のサポートに連絡する」という状態だったのだろう。

ここに解決策が提示されたのが、WWDC 2021 だった。

Passkey の登場

Apple による Passkey の発表は、いつも通り何の前触れもなく行われた。

実態は、単なる WebAuthn の API を使った、秘密鍵での認証の話だ。つまり今までやってきた Platform Authenticator としての iPhone 認証と全く同じ。

異なるのは、その「iPhone の中に作られた鍵を iCloud Keychain で同期する」という点だ。

元をたどれば YubiKey のような、「鍵が絶対取り出せない」ことに意味のある Authenticator を、スマホに移して使っている状態だ。スマホの中に生成された鍵は、スマホから出てはならないのが、認証業界の常識であり鉄則であり前提だった。

それを、「取り出して同期してしまおう」そして「それを Passkey と呼ぼう」という発表を、何の標準化もなく、いきなり Apple サービスの機能として発表したのだ。

It's called

当初筆者は、この内容の意味が完全には飲み込めておらず、当惑していた。

「それ、やっていいんだっけ?」と思った人も多いだろう。

Password-Less

今となっては、Passkey の発表を「秘密鍵の扱いを軽視している」ように受け取ってしまった部分が、実情とズレていたと言える。本来は「そうやってバックアップを容易にしてでも、パスワードをやめないと先はない」という点にこそ真意があったのだろう。

Apple は、OS、デバイス、ブラウザ、アプリストア、パスワードマネージャに至るまで、とにかく上から下まで全部揃える稀有なベンダだ。ここまで隙間ない垂直統合で、ここまで大きなシェアを持つのは、Google でも MS でも成し得ていない。

そして、Apple は CM でさんざんやっているように、ユーザの「セキュリティ」や「プライバシー」を非常に重視している。それはリリースしているサービスや、方針などからも明らかだ(同時期に ITP や Private Relay もリリースしている)。もちろん、ユーザが日々遭遇しているフィッシングやマルウェアといった脅威を、Apple は高い解像度で把握しているだろう。

そんな Apple が、既存の認証のボトルネックであったパスワードを終わりにし、フィッシング詐欺や Infostealer にも対策し、iPhone を落としても簡単に詰まないように考えた、理想的な認証手段の答えが Passkey だったと言える。

そう、Passkey は、その実態がほぼただの WebAuthn でありながら、もはや二要素ではなく、それ単体でログインするための単要素として活用できる。ユーザが必要なのは、iCloud にログインしたデバイスで「Sign-in with Passkey」のボタンをタップすることだけになるのだ。

その要素としての「秘密鍵を共有する」という掟破りは、その後今に至る認証の常識を変えてしまった。業界にとっての大きなイノベーションだったと言って良いだろう。

生体認証

そもそも、生体認証そのものを GitHub などに登録すればよいのでは?と思うかもしれない。ここで、最初の方で保留した生体認証について触れておこう。

確かに、かつては生体情報を読み取るデバイスがなかったが、今はスマホがあれば簡単にできる。指紋そのものを GitHub に登録すれば、スマホをタッチするだけでログインできるし、確実に自分であることを証明できそうだ。

しかし、生体認証には様々な問題がある。最も大きいのは、プライバシーだ。

生体認証は、簡単には変わらないことが利点だが、逆を言えば簡単には変えられない。指紋認証を使うとなれば、すべてのサービスで全く同じ指紋を登録することになり、結託したり漏洩したりすれば、指紋を元に全データを名寄せできてしまう。Fingerprinting などしなくとも Fingerprint そのものがあるからだ。何かの被害にあっても、指紋は高々 10 通りしかないため、サービスごとに任意のものを使うといったことができない。

また、生体認証は基本的に「外に出ている」情報であるため、窃取や偽装も比較的容易になる。知り合いであれば、顔写真や指紋は簡単に手に入る。スパイ映画のような工作を地で行えば、相応の突破が可能な場面が多くなる。

仮に、サービス自身が生体情報を預かるなら、指紋や顔そのものではなく、パスワードをハッシュにするような行為をそれらに対して行うだろう。しかし、どのようなプロセスで処理し、どのような形式で保存し、どのように管理すべきか、ユーザにはどんな同意を取るか。そうしたプラクティスが確立していないため、特殊なユースケースで環境込みで導入する場面はあっても、一般ユーザに提供する一般の Web サービスが、わざわざ生体認証ログインそのものを実装するインセンティブも特にないのだ。

そんなことをするくらいなら Passkey に対応する方が合理的になる。

少なくとも、筆者の知る範囲で「生体認証ログインそのものを実装した一般向け Web サービス」は見たことがない。もし実在するなら、試してみたいので是非教えてほしい。

デバイスの生体アンロック

いやいや、Face ID や Touch ID があるし、それでログインもできるじゃないか? と思うだろう。

ここがまた、少しややこしいところだ。

例として、もし GitHub に Passkey を登録し、それを iPhone の iCloud Keychain に保存していたら、ログイン時は Face ID や Touch ID を求められるだろう。

しかし、これは「生体認証で GitHub にログインしている」わけではない。

ユーザはあくまで、iCloud Keychain に保存された Passkey でログインしている。つまり秘密鍵を用いた「所有」の認証だ。GitHub に登録されるのは指紋情報ではなく、対応する公開鍵だ。では、iPhone はなぜ Face/Touch ID を求めるのかと言うと、それはパスワードマネージャをアンロックするためだ。

GitHub のサイトが WebAuthn の API を叩いた際に、Passkey のログインが勝手に行われてしまっては、ユーザの意図しないところでログインが行われてしまう。iCloud Keychain に保存された Passkey はあくまでユーザのものなので、勝手に取り出して認証するわけにはいかないのだ。また、その端末が誰かに盗まれたものであった場合に、パスワードマネージャを勝手に使われるわけにはいかない。

本人確認を必要としているのはサービス(GitHub)ではなく、端末(iPhone)なのだ。このプロセスを User Verification という。だから、何回か Touch/Face ID が失敗したら、いつもの iPhone の PIN コードで代替できるのは、それがあくまで iPhone に閉じた話だからだ。

したがって、iPhone/Android や Windows Hello などの機能は、生体情報が「デバイスの中に保存」されており、外には出ないようになっている。iPhone を買い直しても、指紋や顔の登録は同期されない。PIN を買うたびに設定するように、買うたびに顔と指紋を登録する必要があるのはこのためだ。

もちろん、生体認証はローカルに閉じ外には出ないというのは、ベンダの説明だ。Apple や Google や MS が、それらの情報をこっそりサーバに収集している可能性を疑うことも可能だ。疑わしいなら登録せずに PIN だけにすれば良い。PIN でも User Verification にはなり、マネージャはアンロックでき、Passkey は問題なく使える。

ちなみに、YubiKey や Titan の物理セキュリティキーの中には、中央にくぼみがあり、そこを指でタップしないと動かないものがある。これを見て、指紋認証だと勘違いする人も多い。ハイエンドなら、指紋を登録できるものもあるだろうが、大抵はただタッチすればよいだけの感圧板であることが多い。

これが必要なのは、挿しっぱなしのセキュリティキーが勝手に動くことを防ぐために、ユーザが明示的にジェスチャーをしないと動作しないようにするためだ。ただ、アンロックするためにタッチするだけなので、逆を言えば盗まれたら認証自体はできてしまう。そもそも所有の要素なので、無くしたり盗まれたら、それ相応の対応が必要なのだ。