YubiKeyのPIVカードでSSHする


前回はYubikey NEOをFIDO U2Fの多要素認証デバイスとして利用する方法を紹介しました。

YubiKey NEOはFIDOの他にも幾つかの機能を持っていて、PIV(Personal Identity Verification)カード仕様に準拠しています。 PIVは米NISTが定めた身分証明ICカードに関する技術仕様です。 例えばNSAやCIAなどの米国公務員が身肌放さず持ち歩いているICカードの仕様となります。 この様なプロフェッショナルなスパイ達も利用している認証デバイスを米国外の一般人がAmazonで購入して利用できるのは素晴らしいことですね。

一方、日本の国家公務員が利用している身分証明ICカードの技術仕様は非公開です。1 技術仕様を公開することで安全性を高めている米国のICカードと、技術仕様を非公開にすることで安全性を高めいている日本のICカード、同じ所を目指しているはずなのにどうしてこれほど方針が違うのでしょうか。

それはともかく、このPIVカードを持っているとCIAごっこなどをして遊ぶことができます。 さらにYubiKeyのPIV機能はOpenSCを経由してアクセスできるので、OpenSSHやOpenSSLから利用できます。 つまりYubiKey内の秘密鍵や証明書を用いてSSH認証やSSLクライアント認証できるということです。

SSH鍵を物理的なトークンで管理することには幾つかのメリットがあります。 SSH秘密鍵をファイルで管理するという従来のやりかたは、秘密鍵を盗まれた際に盗まれたことに気が付かない という欠点があります。 SSH鍵を複製不可能な物理トークンとして管理することで、ログイン権限を一時的に貸し出したり、金庫に入れて厳重に保管することが可能です。

YubiKey NEOを操作するためのツールはオープンソースで公開されているのでLinuxやMacOSでも簡単に利用できます。 ここではYubiKey NEOで生成した秘密鍵でSSH認証を行う方法を紹介します。

現在のところ、YubiKeyのPIVを操作するツールはDebian Jessieには用意されていませんので、sidから持ってくるか、自分でビルドする必要があります。

# apt-get install yubico-piv-tool opensc

もしくはこちらからビルド

PIVカードの状態は以下のようにして確認できます。

% yubico-piv-tool -a status
CHUID: No data available
Slot 9a: No data available.
Slot 9c: No data available.
Slot 9d: No data available.
Slot 9e: No data available.
PIN tries left: 3

9a, 9c, 9d, 9e という4つの空スロットが見えます。 ここでは、9aスロットにRSA2048bitの秘密鍵を生成します。

% yubico-piv-tool -s 9a -A RSA2048 -a generate -o pub.pem
Successfully generated a new private key.

これで秘密鍵の生成とペアとなる公開鍵がファイルに出力されます。 秘密鍵はデバイス内部で生成されており、取り出すことは不可能です。

続いて自己署名の証明書を作成し、PIVカードにインポートします。

% yubico-piv-tool -a verify-pin -P 123456 -a selfsign-certificate -s 9a -S "/CN=test/" -i pub.pem -o cert.pem
Successfully verified PIN.
Successfully generated a new self signed certificate.
% yubico-piv-tool -a import-certificate -s 9a -i cert.pem

改めて、PIVカードの状態を確認するとインポートした証明書を確認出来ます。

% yubico-piv-tool -a status
CHUID: No data available
Slot 9a:
    Algorithm: RSA2048
    Subject DN: CN=test
    Issuer DN: CN=test
    Fingerprint: ce739670d09c6ca1de9b835b2650891627f4c336443eab356faca19d115498b6
    Not Before: Aug 10 16:33:37 2015 GMT
    Not After: Aug  9 16:33:37 2016 GMT
Slot 9c: No data available.
Slot 9d: No data available.
Slot 9e: No data available.
PIN tries left: 3

OpenSCをインストールしていれば、以下のコマンドでOpenSSH形式の公開鍵を取得出来ます。

% ssh-keygen -D opensc-pkcs11.so > id_rsa.pub

こいつを対象ホストの.ssh/authorized_keysに追加すると、YubiKeyでSSH出来るようになります。

% ssh -I opensc-pkcs11.so host

参考文献