Yubikey 4に秘密鍵を入れてssh接続に利用する

個人的に、sshの接続は基本的には公開鍵認証を使うようにしている。

で、秘密鍵はローカルマシンで保持させてるのだけど、Yubikeyに秘密鍵を入れて、証明書認証の設定をすることでトークン認証にすることもできるようだ。 確かに、これなら複数のマシンで共通の秘密鍵を利用できるし、PINコードでの認証も必要になるので、2要素認証的な要素もあってセキュリティも固くなる。

触ってみないとなんともいえないので、ひとまずは実際に試してみることにした。なお、Yubikeyから鍵を取得するため、OpenSCが必要になるらしい。 ssh接続先にはCentOS 7、Ubuntu Server 18.04 LTSを利用する。また、クライアント側についてはMac OSを利用している。

1. OpenSCのインストール

まず、ssh接続時にYubikeyから鍵を読み込む時にOpenSCが必要になるので、それをインストールする。 Macであればbrewからインストールできる。

brew install opensc

なお、Debian/Ubuntuでもaptからインストールできる。

sudo apt install opensc

2. Yubico PIV Managerを利用して秘密鍵を生成する

次に、Yubicoに秘密鍵を生成して書き込むために『Yubico PIV Manager』を利用する。 『Yubico PIV Manager』は以下からダウンロードできるので、使用しているOSに応じたインストーラーを入れる。

インストール後、『Yubico PIV Manager』を起動したらPINを設定するように言われるので、6-8桁のPINを設定する。 ※忘れると秘密鍵を利用できなくなるので、忘れないように注意すること。

PINを設定したら、「Certificates」を開く。 「Certificates」は「Authentication(9a)」「Digital Signature(9c)」「Key Management(9d)」「Card Authentication(9e)」の4種類ある。 以下、それぞれの概要(詳細についてはこちらを参照)。

  • Authentication ... カードとカード所有者を認証するために使用される。秘密鍵の操作にPINの入力は必須。
  • Digital Signature ... 文章、またはファイル・実行可能ファイルへの署名を目的としたデジタル署名に使用される。秘密鍵の操作にPINの入力は必須。
  • Key Management ... 機密保持のための暗号化に使用される。秘密鍵の操作にPINの入力は必須。
  • Card Authentication ... PIV対応ドアロックなどの物理認証のサポートに使用される。秘密鍵の操作にPIN入力が必須ではない。

それぞれの用途はあるようだけど、ssh認証で使う分にはどれでもそんなに変わらないようだ。

自分のYubikeyでは「Authentication」「Key Management」が設定済なので、「Digital Signature」でsshの鍵を生成…しようとしたところ、どうもうまくいかない。どうやらOpenSC側に9aに証明書、9cに鍵があるとエラーになるバグが存在するようだ。しょうがないので、9eにssh鍵を登録することにする(ちなみに、9aに鍵が入ってる場合はこの問題は起きないらしい。面倒臭いな…)。 「Certificates」を開いたら、「Digital Signature」を開き、「Generate new key ...」をクリックする。

あとは、ここから秘密鍵の生成をするだけだ。 Expiration dateについては、1年だとちょっと短いので適当に2030年とかにしておく(画像は9cスロットのもの)。

これで、秘密鍵がYubikeyに登録されたはずだ。

3. サーバ側に公開鍵を登録する

秘密鍵をYubikeyに登録したら、サーバ側に公開鍵を登録する必要がある。 以下のコマンドを実行し、Yubikeyから公開鍵を取得する。

ssh-keygen -D /usr/local/opt/opensc/lib/opensc-pkcs11.so

Yubikeyに秘密鍵が登録されていれば公開鍵が出力されるはずなので、これをサーバ側に登録してやる。

4. ssh接続する

最後に、実際にssh接続してみる。 ssh接続の際にYubikeyの秘密鍵を参照する場合は、秘密鍵のPATHとしてOpenSCのライブラリを指定してやればいい。

ssh -I /usr/local/opt/opensc/lib/opensc-pkcs11.so user@host
[blacknon@BlacknonMacBook-Pro2018][~/Work/201901/20190127]                                          [BATTERY:100%]
(`・ω・´)  < ssh -I /usr/lib64/opensc-pkcs11.so blacknon@172.20.100.122            [2019/01/28 00:54:32 (月) JST]
C_GetAttributeValue failed: 18
C_GetAttributeValue failed: 18
Enter PIN for 'Yubico PIV Authentication':
Welcome to Ubuntu 18.04.1 LTS (GNU/Linux 4.15.0-29-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Sun Jan 27 15:54:36 UTC 2019

  System load:  0.0               Processes:            116
  Usage of /:   6.9% of 97.93GB   Users logged in:      1
  Memory usage: 9%                IP address for ens18: 172.28.0.122
  Swap usage:   0%                IP address for ens19: 172.20.100.122

 * MicroK8s is Kubernetes in a snap. Made by devs for devs.
   One quick install on a workstation, VM, or appliance.

   - https://bit.ly/microk8s

 * Full K8s GPU support is now available!

   - https://blog.ubuntu.com/2018/12/10/using-gpgpus-with-kubernetes

 * Canonical Livepatch is available for installation.
   - Reduce system reboots and improve kernel security. Activate at:
     https://ubuntu.com/livepatch

94 個のパッケージがアップデート可能です。
0 個のアップデートはセキュリティアップデートです。

*** System restart required ***
Last login: Sun Jan 27 15:53:30 2019 from 172.28.10.222
blacknon@bs-pub-ubuntu-03:~$

9cスロットを使う場合に出るバグに苦しめられたけど、ひとまずこれでうまくいった。 使いこなせれば結構面白いんじゃないだろうか。