ssh の公開鍵認証方式で YubiKey を使うための準備


ことの発端

ここ数年で「パスワードのみの認証」は無くなり、2要素認証、多要素認証が主流になることは間違いないです。
そんな中、 USB デバイスを使用した認証モジュールが出現してきて、中でも Yubico 社の YubiKey は有名だったりします。
一般的には FIDO2(WebAuthn) で、この YubiKey を認証方法として登録したりするのですが、今回は GitHubBitBucket などの ssh の公開鍵認証方式で YubiKey を使うことになりました。
なお、 公開鍵認証方式で YubiKey を使用するためには YubiKey シーリーズの中でも YubiKey 5 シリーズ のように、PIV (Personal Identification Verification)という ICカード 機能を搭載しているものを使用する必要があります。

この記事では YubiKey 5 シリーズ の設定を行い、公開鍵を取得するまでをまとめています。
取得した公開鍵を使って、 GitHub を使用する手順については別の記事とさせていただきます。

作業の流れ

一度、流れが分かれば、そんなに手数が多いわけではないので、簡単だと思いますが、画面キャプチャが多くて見通しが悪いので、やることを下記にまとめます。

1. インストールと起動
2. PIN を設定
3. PUK を設定
4. Managemenet Key を設定
5. 証明書を登録
6. 公開鍵を取得

1. インストールと起動

YubiKey の各種設定は YubiKey Manager を使用すると簡単です。

  1. 下記 URL より YubiKey Manager をインストールします。
    https://www.yubico.com/support/download/yubikey-manager/

  2. YubiKey Manager を起動します。

  3. YubiKey を挿入すると下記のような画面になります。

2. PIN を設定

YubiKey の PIN を指定します。
この PIN は PIV のみならず FIDO2 などでも使用します。

  1. Applications をクリックして PIV を選択します。

  2. Configure PINs をクリックします。

  3. Change PIN をクリックします。

  4. Current PIN (初回設定時 1User default にチェックを入れます)、 New PINConfirm new PIN を入力して Change PIN をクリックします。

3. PUK を設定

PUK は PINロック解除キー(​PIN Unlock Key) と呼ばれるもので、 PIN を3回連続失敗してロックした YubiKey を復旧するための文字列を設定します。

  1. Applications をクリックして PIV を選択します。

  2. Configure PINs をクリックします。

  3. Change PUK をクリックします。

  4. Current PUK (初回設定時 2User default にチェックを入れます)、 New PUKConfirm new PUK を入力して Change PUK をクリックします。

4. Managemenet Key を設定

個人で使用する分には、この設定は行わずにデフォルトを使用した方が無難です。「何となく設定したい」レベルなら設定しないことをオススメします。

Managemenet Key を変更した後、この Managemenet Key を忘れたなんて事になると、もう証明書の追加・変更・削除ができなくなります。 3
設定するケースとしては、企業内のセキュリティ担当者が証明書を登録し、むやみに証明書を変更したり削除したりしないようにする場合です。
(仮に紛失や盗難に遭ったとしても、最終的には PIN で保護されます)
ウチの会社みたいに YubiKey を社員に配布して、「勝手に設定して使ってね」というケースでは、デフォルトのままで使うことをルールとしています。

  1. Applications をクリックして PIV を選択

  2. Configure PINs をクリック

  3. Change Management Key をクリックします。

  4. Current Management Key (初回設定時 4User default にチェックを入れます)、 Generate をクリックしたら New Management Key をメモしておきましょう。 その後、 Protect with PIN にチェックを入れて Finish をクリックします。

5. 証明書を登録

YubiKey には証明書を4つ保存することができますが、今回は Authentication(Slot 9a) に証明書を登録します。
ちなみに、他のスロットでも問題ないのですが、 Authentication(Slot 9a)Key Management(Slot 9d) は1回 PIN 入力を実施すると YubiKey を抜去(切断)するまで使用できます。

  1. Applications をクリックして PIV を選択

  2. Configure Certificates をクリックします。

  3. Authentication を選択して、 Generate をクリックします。

  4. Self-signed certificate を選択して、 Next をクリックします。

  5. AlgorithmRSA2048 を選択して 5Next をクリックします。

  6. Subject に 適当な名前を入力して、 Next をクリックします。( Subject の文字列中に、このスロットの用途やスロット名 Authentication (Slot 9a) などを示した方が、後々の選択画面で迷わないのでオススメします。)

  7. Expiration data を入力して、 Next をクリックします。

  8. 確認画面が表示されるので Generate をクリックします。

  9. Management key 入力して OK をクリックします。(出荷時から変更していなければ User default にチェックを入れます)

  10. PIN を入力して、 OK をクリックします。

  11. 暫くして下記のような画面が表示されれば終了です。

6. 公開鍵を取得

一度、 YubiKey に入れた秘密鍵は二度と外に出すことはできません。秘密鍵を用いた暗号化・複合化は YubiKey 内部で実行されるため、秘密鍵が外に出ることがなく、これにより安全性を担保しています。
従って、この節でのエクスポートは公開鍵のエクスポートになります。
エクスポートした公開鍵を、各種サービスに登録することで認証サービスを使用できるようになります。

  1. Applications をクリックして PIV を選択

  2. Configure Certificates をクリックします。

  3. これで証明書の作成は完了したので、 Export をクリックして公開鍵をエクスポートします。

  4. エクスポートされるファイルは CRT形式なので、必要に応じて下記コマンドにて ssh の公開鍵に変換します。(例として、エクスポート時のファイル名称を yubikey_9a.crt とし、 yubikey_9a.pub が変換後のファイルになります。)

openssl x509 -in yubikey_9a.crt -pubkey -noout > yubikey_9a.pub.tmp
ssh-keygen -f yubikey_9a.pub.tmp -i -m PKCS8 > yubikey_9a.pub

  1. 出荷時の Current PIN123456 です。 

  2. 出荷時の Current PUK12345678 です。 

  3. 出荷時の Management Key010203040506070801020304050607080102030405060708 です。 

  4. Reset PIV を使用して、すべてを消去し出荷時設定に戻すことは可能です。 

  5. ECC (楕円曲線暗号)をサポートしていないケースが稀にあるので、今回は RSA を設定しましたが、対向システムや運用ポリシーに応じて選択すれば良いと思います。