YubiKey を購入したので FIDO について調べてみた

AWS運用自動化サービス「Cloud Automator」



はじめに

技術一課の山中です。
先日同僚にのせられて以下を購入しました。

Yubico | YubiKey 5C Nano Security Key | USB-C | Strong authentication

利用してみてすごく便利なことは実感できたのですが、いまいち今までの認証方式と何が違うのかわからなかったので、調べてみた内容をまとめています。

そもそも FIDO ってなに

FIDO ってよく聞くけれど、そもそもこれはなんなんでしょうか。

What is FIDO? – FIDO Alliance

FIDO は Fast IDentity Online の略で ファイド と読みます。
FIDO は従来のパスワード認証に代わる新しい認証規格のひとつです。

規格の策定と普及推進は FIDO Alliance という業界団体が行っており、グーグル、マイクロソフトや NTT ドコモ等のメンバーが参画しています。
今回購入した YubiKey を販売している Yubico 社ももちろんメンバーとなっています。

FIDO の特徴

FIDO の核となる考え方は以下のとおりです。

  • 使いやすさ
  • プライバシーとセキュリティ
  • 標準化

FIDO はクライアント層とプロトコル層を標準化の共通化を促進することで、幅広いオンラインサービスで相互に利用できる生体認証や PIN コード、 2 段階認証などのクライアント認証方式のエコシステムを活発化しようとしています。

FIDOの特長 – FIDO Alliance

UAF と U2F

FIDO には 2 つのプロトコルがあります。
完全なパスワードレスの UAF (Universal Authentication Framework) と 2 段階認証の U2F (Universal Second Factor) です。
簡単な違いを以下にまとめてみました。

プロトコル 認証方式 安全性 利点 欠点
UAF 指紋や声紋などの生体情報 パスワード不要かつ生体情報を盗まれることはないため、かなり安全 パスワードを入力する必要がない 端末側の対応が必要
U2F 従来の認証 (ユーザー ID とパスワード) に加えセキュリティトークン等の認証を行う パスワード入力が残るため UAF よりは安全面で懸念が残る FIDO 未対応の端末でも使えるため、導入がしやすい 従来どおりのパスワード認証も必要

詳細は U2F の技術的なドキュメントを参照ください。

YubiKey 5C Nano は U2F に対応しています。

YubiKey の実装

YubiKey が U2F に対応しているということは、サービスプロバイダごとの秘密鍵をすべてデバイスに保存しているということでしょうか。
実際に YubiKey がどのように U2F を実現しているかドキュメントを読んでみました。

Key generation

For a U2F device with lots of (tamper-resistant) storage, the above implementation would work. Unfortunately, this would make devices more expensive. However, since U2F does not specify how to store keys, we are free to come up with another solution — so we did:

なるほど、 U2F としてはどのように鍵を保存するのか明確に示してないんですね。
実際に YubiKey では以下の図のように鍵を生成しているようです。

登録時

新しいサービスに登録する場合は、以下の手順で登録されます。

  1. サービスプロバイダから AppID が提供される
  2. RNG で生成した Nonce と AppID から Device Secret で HMAC を計算しこれを秘密鍵とする
  3. 秘密鍵から公開鍵を生成し key handle (Nonce と MAC) と合わせてサーバに送る(サーバには Key handle 及び公開鍵が登録される

認証時

認証時は以下手順です。

  1. サーバからクライアントに対して AppID、 key handle 及び Challenge が送られる
  2. key handle から 登録時に利用した None と MAC を取り出す
  3. Nonce と AppID から Device Secret で HMAC を計算し秘密鍵とする
  4. Device Secret と秘密鍵及び AppID から MAC を生成し、 key handle から取り出した MAC と一致するか検証する
  5. Challenge は秘密鍵によって署名されサービスプロバイダに送り返される
  6. 内部カウンタを加算する

単語メモ

ついでに単語メモ。

単語名 意味
AppID ドメイン名を含む(フィッシング対策となる)
RNG Random Number Generator
Nonce を生成する
Nonce 16 – 40 文字のランダムデータ
Device Secret デバイスごとに固有のキー
MAC 秘密鍵のハッシュコード
Device Secret と秘密鍵及び AppID から生成

上記からわかるように、 YubiKey では各サービスの秘密鍵をデバイスに保持していないため、登録数の上限はなく、 無限に登録できる ようです。

セキュリティ的には大丈夫?

とはいえ、持っているだけで認証というのはセキュリティ的には問題ないのでしょうか。
詳しくは以下に記載されていたので、是非ご覧ください。

OTP VS. U2F: 強固な認証からより強固な認証へ | YubiKey BLOG

最後に

今回購入した YubiKey はかなり小さく、指で触るだけなので極めて使いやすいと感じました。
加えて、セキュリティキーの安全性についても多少知ることができたので、とても勉強になりました。
これからどんどん使い倒していこうと思います。


AWS運用自動化サービス「Cloud Automator」