Yubikeyの導入でブラウジングとSSHのセキュリティを向上する
ビットコインに触れる方は情報セキュリティに注意すべきというのは、昨年原さんが書かれた記事にある通りです。
久しぶりにパスワードの見直し等を行っていたら、消えていったサービスをたくさん見つけて懐かしさが込み上げてきたほか、こんなにたくさんあったっけ?という数のログイン情報があることを再認識できました。みなさんもパスワードマネージャーを使ってパスワードの使いまわしをなくしましょう。
そのついでに、パスワードマネージャーが単一障害点になってしまうので、セキュリティ向上のためにかねてから使ってみたいと思っていたYubikeyを導入してみました。
Yubikeyでのログインに対応しているサービス一覧はこちら
今日は一般的なPCユーザーに役立つYubikeyの利用方法と、開発者などに役立つSSHでYubikeyを使用する方法についてレポートしていきます。
・アカウントの依存関係
・Yubikeyとは
・パスキー vs 二要素認証
・セットアップ&利用手順
・SSHにYubikeyを使う
アカウントの依存関係
読者の皆様も様々なアカウントを所有していると思いますが、それぞれが「何によってユーザーを認証している(どの経路でパスワードリセットやパスワードの覗き見などを通して乗っ取れる)」か把握されていますか?例えば、多くの人が下のような構造になっていると思います(出典):

パスワードマネージャーは、これをこのような構造に作り変え、パスワードマネージャーを死守すればすべて守れるようにするものです(出典):

すると、肝心なのはパスワードマネージャーを守ることです。少なくとも2要素認証は必ず使いたいところです。
同時に、上記の図のように独立させるためにはパスワードの写真やリセット用のコードをGoogle Photosなどに保存するのもだめです。パスワードマネージャーについては、上記の図の出典元の記事がとてもわかりやすいです。

Yubikeyとは
そしてそのパスワードマネージャーを物理的なキーで守ろうというのがYubikeyなどのFIDO2デバイスです。
Yubikeyはログイン権限の保存を想定して開発された、FIDO2、TOTP/HOTP(ワンタイムパスワード)、数種類の公開鍵暗号などに対応したハードウェア署名装置です。この界隈の人には、パスワードレス認証や二段階認証に使う秘密情報を保存しておくハードウェアウォレットみたいなものといったほうが通じるかもしれません。
2要素認証でポピュラーなワンタイムパスワードは、誤ってフィッシングサイトに入力してしまうと意味がありませんが、Yubikeyを使えばFIDO2/WebAuthnの特徴によりフィッシングサイトに正常なワンタイムパスワードを入力してしまうことはありません。Yubikey自体をパスキーとしてパスワードレスログインを使用することもできます。
ただ、正直なところ一般的なユーザーにはYubikeyのような専用ハードウェアまでいかなくても、二段階認証アプリをインストールしたスマホなどで良いような気はします。(Google Authenticatorの同期機能はオフにしないとパスワードマネージャーに加えてGoogleアカウントも単一障害点になりますが。)
けっこうな種類数がありますが、Yubikey 5シリーズが一番汎用性とコストパフォーマンスを両立していると思います。なので、4種類揃えてみました。(Yubikey 5C、Yubikey 5Ciは立ち位置が謎なので買いませんでした)

Yubikey Bioシリーズは指紋認証がついていますが、$90~$95ほどします。また、FIDO2・U2Fにしか対応していません。同じ対応範囲で廉価版にYubikey Security Key NFCシリーズもありますが、パスワードレスログインのFIDO2・U2Fにしか対応していません。その代わり$25~$29で買えます
パスキー vs 二要素認証
まず前提として、Yubikeyを単一の認証手段(パスワードレスログイン)として使うか、パスワードと組み合わせた二要素認証手段として使うか考える必要があります。
パスキーとして
パスキー(FIDO2)によるパスワードレスログインにYubikeyを使用する場合は、パスワードを管理する必要がなくなり、フィッシング耐性もあり、アカウントのセキュリティはYubikeyに事実上一本化できます。
一方、Yubikeyの故障や紛失に備えて予備のYubikeyを設定しておく必要があります(でなければアクセスを失ってしまう)。YubikeyのPINも忘れてはいけません。また、対応しているサービスが比較的少ないという問題があります。
二要素認証として
FIDO2・U2Fを使った二要素認証はパスキーよりは多くのサービスが対応しています。また、Yubico Authenticatorアプリを入れればYubikeyをワンタイムパスワードに使用することもできます(が、それならGoogle Authenticatorでいいような気はします)。ログインのためにID・パスワードとYubikeyの両方が必要なため、ある意味ではパスキーより強固かもしれません。
逆に、YubikeyのPINに加えてメールアドレス・パスワードを管理したり、ワンタイムパスワードに利用する場合はリカバリー用コードを管理する手間がかかります。2要素認証がFIDO2だけならやはり2台目のYubikeyをセットアップしておく必要があるでしょう。
個人的には二要素認証として設定し、紙媒体やスマートフォン内の認証機でリカバリー用キーをバックアップする(クラウド同期はオフ)のが現時点では一番使いやすいでしょうか。
例えばBitwardenの場合、Yubikeyでできる機能はまだ限られていて、パスキーに設定してログインに使用してもその後のパスワードのアンロックにはマスターパスワードが必要です。また、まだパスワード等の暗号化にも使用できないようでした。したがって、パスキーとしてセットアップしても事実上は二要素認証の手段の1つにとどまるので、今は最初から二要素認証としてセットアップするのがおすすめです。
余談ですが、パスキーの受け渡しでアカウントを共有するようなニッチなユースケースが思いついたら教えて下さい。Yubikeyを使ってビットコインウォレットを作るニッチなユースケースについては昨年記事にしました:
セットアップ&利用手順
シードフレーズをバックアップできるハードウェアウォレットとは異なり、Yubikeyに入れた鍵情報はバックアップすることはできません。なので、複数台をセットアップしておくことをおすすめします。なかなか壊れなさそうではありますが、1台壊れたら新たに1台購入してまた複数台体制を再セットアップする(鍵を更新する)運用を想定します。Google Authenticatorなどのワンタイムパスワードと併用ならYubikeyが壊れてもそれでログインできるので一台で問題ないです。
ちなみに、これはパスワードマネージャーとの相性の良さが現れる側面でもあります。例えばYubikeyが壊れて、2台体制を維持するために新しい鍵をセットアップする場合、パスワードマネージャー1箇所だけ鍵を更新するのと、各サービスで鍵を更新するのとでは大きく手間が異なります。
まず届いたYubikeyを開封します。自分はスウェーデンの公式ストアから購入しましたが(送料と消費税を払ってもそっちのほうが安かった)、日本国内の正規代理店から買うこともできます(ソフト技研など。Amazonにも出品しています)。スウェーデンから買う場合、住所が長い方はできるだけ短く書いたほうがよさそうです(住所が途中で切れていて部屋番号が省略されてしまっていたので配送業者から電話が来ました)。

NFC対応のモデル(Yubikey 5 NFC、Yubikey 5C NFC)は輸送中にNFC経由でタンパリングされないために無効化されて配送されているので、最初に3秒以上USB経由で電源供給してアクティベーションする必要があります。
その後、すべてのYubikeyモデルはデバイスのUSBポートに挿す、あるいはNFCリーダーにかざすだけで使用できます。さっそくつなげてみましょう。タッチする場面があるのでタッチしやすい位置のUSBポートがおすすめです。
Bitwardenの二要素認証としてセットアップするには、設定>セキュリティ>FIDO2 WebAuthn(Yubico OTPセキュリティーキーではない)>名前をつけて「読み取りキー」>画面に従って操作(PINの設定、入力、Yubikeyのタッチ)>保存、という流れになります。
次にログインするときはパスワード入力→(最近YubikieyのPINを入力していないならPIN入力)→Yubikeyのタッチ、でログインできます。
ただし、モバイルでは未対応のようなので、モバイルでも使いたいなら結局Google Authenticatorのような別の二要素認証も入れておかないと使いづらいと思います。
そもそもChromeに入っているGoogle Password Managerも便利なので、一般的なユーザーはパスワードマネージャーに課金しなくても、他のブラウザとパスワードを共有する必要がないならそれでも十分かと思います。家族には最低限Google Password Managerを使うように言っています。その場合はGoogleアカウントも二要素認証などで確実に保護しましょう。
以後、同じキーで別のサイトでセットアップする場合も、FIDO2/WebAuthnの2要素認証として選択→PINの入力→本体のタッチ、という流れになります。
もしパスキーとして使用する場合は、大抵のブラウザはGoogle Password ManagerやTouchIDなどを既定で使用しようとするので、ダイアログから外部セキュリティーキーを選択しましょう。(そこでQRコードが表示されたら、別の外部セキュリティーキーと書かれたメニューを開いてみましょう。UX悪いですね)
Yubikeyを失くしたり壊したりしてもログインできなくならないように、ちゃんと複数(あるいは別の二要素認証手段と合わせて)セットアップしておきましょう。

SSHでYubikeyを使う
さて、上でもさらっと書きましたが、ウェブ上のアカウントの管理なら別にYubikeyを導入しなくても一般的な二段階認証アプリを使うだけで十分かもしれません。しかし、ここからがYubikey使ってる!って感じになってきます。
開発者がリモートにある端末にログインするのに使うSSHは、パスワード式のログインでは脆弱なので公開鍵暗号によるログインが一般的になってきています。その暗号鍵をYubikeyを使って複数台のマシンで利用できたら便利ですよね。
YubikeyをSSHの鍵として使う方法は3種類(FIDO2、Smartcard、GPG)ありますが、2020年2月にリリースされたOpenSSH 8.2以降で使えて一番カンタンなFIDO2方式で説明します。
PINを設定したYubikeyを接続した状態で、SSH鍵を生成してYubikeyに格納します:
ssh-keygen -t ed25519-sk -O resident -f ~/.ssh/id_keyname_skもしed25519に関するエラーが出た場合は、以下でやり直します:
ssh-keygen -t ecdsa-sk -O resident -f ~/.ssh/id_keyname_skPINの入力とタッチが求められた後、通常通りid_keyname_skとid_keyname_sk.pubという2つのファイルが生成されます。後者の公開鍵ファイルは接続先のサーバーのauthorized_keyに追加します。(OpenSSH 8.2以降であることを確認!)
前者のファイルは通常は秘密鍵ですが、今回はただのスタブファイルです。別のデバイスの~/.ssh/下にコピーすることでそこのSSHエージェントに登録することもできますが、Yubikeyを接続した状態で
ssh-add -Kするとファイルをコピーしてくる手間なく自動的にSSHエージェントに利用可能な秘密鍵として追加されます!(実際の秘密鍵はYubikey内部にあるままで、スタブファイルが~/.ssh/下に追加されます)
公開鍵をまた取り出したい場合も、Yubikeyを接続した状態で
ssh-add -Lするだけで一覧取得できます。使うときは普通のSSH公開鍵ログインと同様、
ssh -i ~/.ssh/id_keyname_sk user@serverでログインできます。(PIN入力、タッチ後)
SSH鍵の持ち運びがしやすいのはかなり便利なのではないでしょうか。
まとめ
・一般的な用途なら、Google Password Manager+Googleアカウントの二段階認証でそこそこセキュリティは強化できる。(この場合、各アカウントのパスワードのリセット方法もGoogleアカウントに集約するのを忘れず)
・Yubikeyは鍵の持ち運びをクラウド同期などに頼らずに行いたい場合に便利。ただしパスキーに対応しているサービスは少ないので、多くの場合2要素認証手段の1つとして使うことになる
・OpenSSH 8.2以降で利用可能になったFIDO2を使ったSSHログインには非常に便利
次の記事
読者になる
一緒に新しい世界を探求していきましょう。
ディスカッション