YubiKey 5 NFC

このエントリは、圧倒的令和ッ!!ぴょこりんクラスタ Advent Calendar 2019のために書かれたものです。 たまには、少しまじめな記事を書いてみようと思いました。

なんとなくセキュリティ的意識の高まりに乗じて、YubiKey 5 NFCを購入してから1年あまりが経ちました。 Windowsマシンからどうやって使っているかについて、まとめて書いてみようと思いますので、何かの参考になれば幸いです。

なお、筆者は、セキュリティの専門家ではないので、下記の使い方や用語法などが正しくないおそれがあります。 あくまで参考程度にとらえ、ご自分で利用される場合には十分ご注意ください。

どんなものか

そもそもどんなものかといいますと、いろんなプロトコルをサポートしたセキュリティキーです。 詳しくは、YubiKey 5 Series Technical Manualを参照いただきますとわかるかと思いますが、あまりにもプロトコルが多いので何が何だかからなくなるほどです(筆者個人の感想です)。

典型的には、FIDO U2Fの使い方が想像されますが、ほかのプロトコルについても簡単に紹介していきます。 なお、筆者は、同じものを2つ購入して、片方をバックアップとしています。これは、紛失というよりかは故障に備えるためです。

なので、それぞれのケースで、どのように複数キーを設定したかについても書いていきます。一応、紛失等した場合にRevokeするにはどうするかも簡単に付記しています。

ユースケース

筆者は、下記の用途で利用しています。

  • 各種WebサービスのMFA
    • FIDO U2F
    • OATH TOTP
  • 各種キーペアの格納先
    • OpenPGP (メール署名・ssh公開鍵認証)
    • PIV (SSLクライアント認証に利用しようとして断念)

注意点

注意点といいますか、ハマったことを先にメモしておきます。

Yubico Authenticator / YubiKey Manager (Windows)が一部のUSBポートに挿したキーを認識しない: このissueによると、 libusbに起因するバグのようです。自分の場合は、Thunderbolt 3接続のUSB Hubの先に挿したキーが認識されませんでした。 FIDO U2FやOpenPGPを使用するアプリは動作するので、問題になるのは、主にセットアップやOATH-TOTPを使う場合でしょう。 workaroundとしては、上記のissueにある通り、CLI(ykman.exe)で--reader yubiオプションをつけるというものです。あとは、挿すポートを変えるというのも、最も単純にして効果的でしょう。

PIVモードでは、4096bit RSAを利用できない: このissueにある通り、そもそもPIVの定義に4096 bitが存在しないので、プロトコル的にサポートできていない(できない)ようです。

OSの同じインタフェースを使うアプリは同時に使えない: 例えば、PIVとOpenPGPは、Windowsにおいて(Windowsでなくても?)同じスマートカードのAPIを使用する(はずな)ので、たとえばFirefox+OpenSCで証明書を使おうとすると、Firefoxが常にカードに接続しっぱなしになってしまうので、OpenPGPがカードにアクセスできなくなってしまうという問題があります。そのため、OpenPGPを利用しようとすると、Firefoxをすべて終了する必要があり、あまり現実的ではありません。なお、FIDO U2Fなどは、HIDを利用している(はず)ので、この場合でも同時に利用できます。

AWSが複数のキーを登録できない: YubiKeyの制約ではありませんが、AWSアカウント(Amazonアカウント全般?)で複数のSecurity keyの登録ができませんでした。これでは、バックアップキーの登録ができません。しょうがないので、OATH-HOTPを使うことにしました。

物理インタフェース

YubiKey 5シリーズにはいくつか製品が存在しますが、主な違いは物理インタフェースと物理サイズです。 筆者の所有しているYubiKey 5 NFCは、USB Type AとNFCです。といっても、NFCを利用したことはかなり少ないです。

なお、筆者は、当初はType Aのあるノートパソコンを利用していたので問題なかったのですが、最近Type Cしかないものに買い換えたので、USBハブを経由するか変換アダプタをかませる必要がでてきました。 他方、Type C版のYubiKey 5Cシリーズは、NFCに対応しておらず、帯に短しな感じです。 このあたりの制約を踏まえて、製品を選択するとよいでしょう。

NFCでもいろいろなプロトコルを利用できるようですが、もっぱらスマホからの利用で、しかもあまり通信が安定しないので、OATH-HOTPとFIDO U2Fでしか使用していません。 Androidでは、Yubico AuthenticatorGoogle Authenticatorを使用しています(後者はGoogleアカウントでFIDO U2Fを使用するため)。

FIDO U2F

最近最も認知されているセキュリティキーの使い方はこれでしょう。 MFAとして、ブラウザからのログイン時にセキュリティキーを挿しておき、パスワードの認証後、キーにあるボタンをタッチすることで「所持情報」を認証に使用するものです。

セットアップ

Webサービスがサポートしている必要があります。GoogleやAWSやGitHubといったものが対応しています。

セットアップは簡単で、それぞれのWebサービスにログインして、アカウントの設定からセキュリティキーを登録するだけです。

バックアップキー

だいたいのサービスは、一つのアカウントに対して、複数のセキュリティキーを登録することができるので、メインキー→バックアップキーの2回登録を行えばよいだけです。

Revokeも単純にそのキーの登録を削除するだけです。

OATH-TOTP

ワンタイムパスワードのプロトコルです。TOTPは時刻ベースでワンタイムパスワードを生成するものです。生成されたコードを、ログイン時にパスワードに加えて入力することで認証に使用します。

最近よく見かけるタイプのワンタイムパスワードで、スマホの各種Authenticatorアプリで6桁~10桁の数字を生成するタイプのものは、ほぼこれに該当するでしょう。

セットアップ

こちらもWebサービスがサポートしている必要があります。FIDO U2Fよりはサポートしているサイトが多い印象です。

アプリとしては、Yubico Authenticatorを使用しています。 Authenticatorに各Webサービスで表示されるQRコードを読み込ませることで、各種パラメータ・SecretをYubiKeyに登録することができます。

バックアップキー

QRコードは最初の一回しか生成されませんし、各種パラメータをYubiKeyから読むことは当然できませんので、そのパラメータを何らかの方法で保存し、Authenticatorに登録する手順をそれぞれのキーで繰り返します。 つまり、もっとも簡単には、QRコードの画像を何らかの方法で保存し、YubiKeyを差し替えてAuthenticatorで登録することで複数のキーを使うことができます。 パラメータが同じであれば生成される数字も同じですので、どちらのキーを使用しても同じ値を得ることができます。

筆者の知る限り、複数に対応しているサービスはないと思いますので、これ以外にバックアップキーを利用する方法は事実上ないと思われます。 この方法では二つのキーの持っている情報は同じなので、Revokeについては多少問題になります。 各Webサービスに、バックアップキーを用いてログインしたのちに、再度新たなパラメータを生成して登録しなおすことになるでしょう。

Static Password (OTP)

自分は使ってはいませんが、YubiKeyでは、静的なパスワードを設定することができます。 YubiKeyの真ん中の金色のボタンに触れることで、キーボード入力としてそれを入力することができます。 用途としては、パスワードマネージャのマスターパスワードとか、パスワードの共通部分(prefix)として使うとかでしょうか。セキュリティ的に本当によいのかどうかはよくわかりません。

Staticなので、厳密にはOTPではない気がしますが、YubiKeyのカテゴリとしてはOTPに入っています。 いちおう理論上、StaticとOATH-TOTPを併用することができるかと思いますが、それだと複数要素にならない(Staticをそのまま使う場合)と思うのでやらないほうがよさそうです。

セットアップ

ykmanなどでできます。YubiKey 5 NFCにはOTPのスロットが二つあり、スロット1が短くボタンに触れた場合、スロット2が長くボタンに触れた場合に選択されます。

バックアップキー

同じ静的パスワードを設定すればいいので、自明です。 Revokeについては、TOTPの場合とほぼ同じく、利用しているサービスすべてでパスワードを変更するということになるでしょう。

OpenPGP

個人的に重要なのは、このOpenPGPです。利用法は、メールのアレに使っているというよりは、sshの認証鍵の格納先としてがメインです。

次節のPIVでもできるようですが、PIVはRSA 4096bitに対応していないというのと、Windowsだとputtyの改造であるPuTTY-CACくらいしか、サポートしているsshクライアントがWindowsには存在しないという問題点があったため、自分はOpenPGPを利用しています。

セットアップ

ソフトウェアとしては、Gpg4winを利用しています。

スマートカード上での鍵のセットアップについては、gpgのマニュアルとか例えばこういう解説をご覧ください。

その後は、Gpg4winのgpg-agentを使って、enable-putty-supportオプションをgpg-agent.confに追加して、pageant互換のエージェントを有効にします。

最近のWindowsでは、sshクライアントとしては、次の3パターンが考えられると思いますので、それぞれのやり方を簡単に述べます。

PuTTY: gpg-agentがpageantと同じ役割をするので、エージェントを使う設定にするだけでOKです。

WSLのssh: wsl-ssh-pageantを用います。-wslオプションで、AF_UNIXなソケットを作成することができます。

Windows標準のssh: これもwsl-ssh-pageantを使うことができます。-winsshオプションで、Windowsの名前付きパイプを作成することができます。

個人的には、上記の2番目と3番目の両方を使っています。というのは、普通の操作はWSLなのですが、Visual Studio CodeのRemote development(ssh)を利用するときには、ホスト(Windows)のsshを利用するほうが簡単だからです。 幸い、wsl-ssh-pageantは両方のオプションを同時に指定(ソケットとパイプを両方作成)することができますので、これ一つで万事解決となります。

バックアップキー

同じキーペアを2つのYubiKeyで使うことは、revokeができなくなってしまうので避けたほうがいいと思います。 同じセットアップ手順を繰り返し、多少手間ではありますが、authorized_keysに二つの公開鍵を書くのがよいのではないでしょうか。

その場合には、revokeをするには対応する公開鍵を削除すればよいだけです。

PIV (Smartcard)

PIVモードをWindowsから利用するには、OpenSCを用いるのが確実なようです。いちおうWindows標準でもなにがしか認識しているようですが、肝心の鍵を利用できなかったりするので、要調査です。

なお、筆者は結局のところこれは利用していません。 sshで利用しようとしたのですが、前述のとおり、PuTTY-CACくらいしかWindowsでは使えないので断念しました。(Linuxでは、sshコマンドの-IオプションでOpenSCのモジュールを指定するとできるようです) また、(HTTPSでの)TLSのクライアント証明書の格納に使おうと思ったのですが、セットアップこそしましたが下記の理由で結局使っておりません。

  • ブラウザ(もしくはWindowsのスマートカードサービス?)がカードとのコネクションを占有するので、OpenPGPを同時に利用できない (ブラウザを開きながらsshできない, vice versa)
  • RSA 2048bitまでという制約

他方、OpenPGPの証明書をブラウザから使う方法は、全く見つかりませんでした。それがあれば問題ないんですけどね・・

セットアップ

ともかく、どうセットアップしたかについて説明をします。

まずは、とりあえず鍵の生成が必要です。ykmanなどのツールを使います。 (PIN等の設定は省きます)

なお、下記の9aはスロット番号です。適当な番号に変更してください。

$ ykman piv generate-key 9a (public key file)
Enter a management key [blank to use default key]:

$ ykman piv generate-csr -s (common name) 9a (public key file) (csr file)
Enter PIN:

これでできたCSRをCAに対して送って、証明書を発行してもらいます。その証明書をカードに書き込めば完了です。

$ ykman piv import-certificate 9a (certificate file)

なお、別のCAを使わない場合には、ykman piv generate-certificateを使うと自己署名の証明書を発行することができます。

次に、smart cardのminidriverをインストールすれば、Chrome等からクライアント証明書として利用可能になります。 firefoxでは、OpenSCのPKCS #11モジュールを追加して、証明書をカードをインポートすることで利用できます。

バックアップ

OpenPGPの場合と同様に、セットアップを各YubiKeyで繰り返すことになると思います。 Revokeは、CA側で対象のKeyの証明書をrevokeしてもらえばOKのはずです。

そのほか

自分は使用していませんが、Windowsのログイン(ローカルアカウントの場合)に利用できたりするようです。 また、個人的にはLinuxはssh経由以外で使っていないので、Linuxでの例についてはほとんど触れられませんでした。

え?Mac?なんですかそれ。