=kthrtty/(+blog)

最近旅してないフルスタックサラリーマンジャーマネの旅行の記録

Yubikey4に秘密鍵を保存してPuttyでSSHログインする

はじめに

  • Yubikey4をたまたまソフト技研のスポンサードするイベントか何かでもらっていた
  • 職務上の変化でSSHログインする機会が増えそうだった
  • そのためYubikey4に手元のキーペアをインポートして、USBドングルでログインできる環境を作ろうと思った

なお、

  • OneDriveのPersonal Vaultに鍵は保存するのが好みなのだが、保存には適していても利用には適していない(面倒)
  • FIDO対応なOpenSSHバージョンが登場したが、まだまだマジョリティではない

ということも補足的な理由です。

結論を先に

  • Yubikeyのセットアップの面倒さに加え、クライアント環境を構築しないといけないので、結局のところ秘密鍵の置き場をUSBセキュリティキーにできる、という以外はあまり効率的な印象はありませんでした。
  • Multi-factor Cryptographic Deviceを強制するような物理的な保護要件がなければ、クライアント証明書をPIN保護してMulti-factor Cryptographic Softwareでもいいなぁ、というところです。
  • あまり流行らないうちにネイティブ対応のOpenSSHが普及しそう。Ubuntu 20.04LTSから使えるらしいので。

参考

細かいことはいろいろ書いてくださっているサイトが複数あるのでそちらを合わせて参照。 主に眺めたのは以下です。

設定

肝心なところだけ備忘で残しておきます。

YubiKey ManagerのPIV設定画面から"PIN Management"でPIN, PUK, Management Keyの登録を行う。

f:id:kthrtty:20210520213109p:plain
Yubikey4のPIV機能の設定画面
初期状態のYubikeyの場合は、Current値を入れる部分にデフォルト値を入れてくれるチェックボックスがあるので、それにチェックしておけば、好きなPIN, PUKを登録できる。 f:id:kthrtty:20210520213823p:plain Management Keyも同様。あとで自己署名証明書(と秘密鍵)を作る際に必要になるようなので、メモっておく(と参考リンク先にもある)。 f:id:kthrtty:20210520213859p:plain

Certificates設定画面から秘密鍵(pem)をセキュリティキーにインポート

"Import"ボタンを押してpemファイルを指定すればよし。秘密鍵自体の保護PINと、YubikeyのPINを聞かれる。 f:id:kthrtty:20210520214405p:plain Management Keyの値が聞かれなかったがとりあえずこれで良いみたい。参考リンクが記載された時よりもGUIアプリが進化して省力化できるようになっている模様。もしコマンドラインからインポートする場合は以下。

>"C:\Program Files\Yubico\Yubico PIV Tool\bin\yubico-piv-tool.exe" -a import-key -s 9a -i id_rsa -K PEM -k(ManagementKeyの値)

画面上はあまり変化はないものの、秘密鍵はとりあえず保存されている。 なおここでの秘密鍵ファイルは以下のフォーマットになっていればよいはず。

-----BEGIN RSA PRIVATE KEY-----
・・・(省略)
-----END RSA PRIVATE KEY-----

Certificates設定画面から自己署名証明書を登録する。

あとはキーペアとなる証明書も追加でインポートすればよい。 ただし、普通にSSH用のOpenSSH用の公開鍵をエクスポートしていると形式が以下のようになっているはず。

---- BEGIN SSH2 PUBLIC KEY ----
AAA...(省略)
---- END SSH2 PUBLIC KEY ----

ここから証明書を作成する場合、大抵の場合はハマるので、証明書作成に適したPEMに変換しておく。 いわゆるMIIで始まるやつです。

---- BEGIN RSA PUBLIC KEY ----
MII...(省略)
---- END RSA PUBLIC KEY ----

コマンドは以下。

$ openssl rsa -in id_rsa -pubout > id_rsa.pub.pem

あとはopensslでCertification requestつくって自己署名証明書をつくってもよいと思われるが、ここではyubicoのツールを使ってみることにする。(参考リンクの通り)

>"C:\Program Files\Yubico\Yubico PIV Tool\bin\yubico-piv-tool.exe" -a verify-pin -a selfsign-certificate -s 9a -S "/CN=*.localhost.localdomain/OU=test/O=localhost.localdomain/" -i id_rsa.pub.pem -o id_rsa.crt --valid-days=1100
Enter PIN:
Successfully verified PIN.
Successfully generated a new self signed certificate.

f:id:kthrtty:20210520223719p:plain (Issuerにもワイルドカードが入ってしまったが、、、とりあえずスルー)

GUIからのcrtのインポートがどうにも成功しないので、コマンドラインからインポート。

>"C:\Program Files\Yubico\Yubico PIV Tool\bin\yubico-piv-tool.exe" -a import-certificate -s 9a -i id_rsa.crt -K PEM -k(ManagementKeyの値)
Successfully imported a new certificate.

f:id:kthrtty:20210520224430p:plain インポート済みの秘密鍵のペアとなる公開鍵の自己署名証明書が無事に登録された。

実際にPuttyを使ってホストへログインしてみる。

WindowsならCertification APIに対応したPutty-CAC、OSXならbrew install openscしてスマートカード用のモジュールを取得してから接続。

改めて結論

  • Yubikeyのセットアップの手間だけでなく、結局はクライアント環境の構築が必要。結構面倒。
  • Multi-factor Cryptographic Deviceを強制するような物理的な保護要件がなければ、クライアント証明書をPIN保護してMulti-factor Cryptographic Softwareでもいいかもしれない。
  • あまり流行らないうちにネイティブ対応のOpenSSHが普及しそう。