皆様はSSHの秘密鍵をどのように管理していますか?
PCに秘密鍵を保存し、サーバー接続に使用するケースが多いと思います。
YubiKeyにSSHの秘密鍵を保存し、SSH接続のときにYubiKeyをPCに挿せば、秘密鍵を複数のPCに保存しておく必要がなくなり安心です。また、YubiKeyから秘密鍵を取り出されるといった心配も無用です。今回は、既存の秘密鍵をYubiKeyに保存し、SSH接続を行う方法をご紹介いたします。
環境
・OS:Windows 10 ver1809
・YubiKey 4 (YubiKey 4または5シリーズが利用可能)
・Yubico PIV Manager
・Putty CAC 0.71
・CentOS 7 rsa 2048bitで鍵を生成し、SSHの公開鍵認証を設定しています。
注意
掲載情報の利用によって問題が生じても当社は一切責任を負いません。
YubiKeyの資格情報を上書きすると、現在使用している資格情報が削除され使用できなくなる場合があります。すべて自己責任で行ってください。
鍵の変換
※既にPEM形式で使用している場合はこの箇所を読み飛ばしてください。
まず、既存の秘密鍵をPEM形式に変換します。
OpenSSH 7.8以降のssh-keygenで鍵を生成した場合、独自仕様の形式で生成されるようなので、PEM形式に変換します。※OpenSSH: Release Notes
以下のコマンドを入力し、PEM形式に変換します。
※このコマンドでは既存の秘密鍵を上書きしてしまうため、バックアップを取った上で実行してください。
ssh-keygen -p -f id_rsa -m pem
変換した秘密鍵から公開鍵を生成します。
openssl rsa -in id_rsa -pubout > id_rsa_pub.pem
YubiKey 4の設定
秘密鍵を保存するにはYubiKeyに設定を行う必要があります。設定に使用するYubiKey PIV ManagerとYubico PIV Toolをダウンロードします。
※Windows環境の場合、scoopを利用したツール一式のインストールが可能です。
詳しくはYubiKey の開発者向けツール【YubiKeyとは-part3】のまとめに記載しています。
yubico-piv-tool-1.6.2-win64.zipを解凍し、Cドライブ直下に配備します。
そして、C:¥yubico-piv-tool-1.6.2-win64¥bin にパスを通します。
次に、yubikey-piv-manager-1.4.2g-win.exeを実行し、インストールします。
インストール後自動でアプリが起動します。お手持ちのYubiKeyを差し込んでください。
最初にPINコードを設定します。
YubiKeyのクレデンシャル情報にアクセスする際にPINコードを使用します。
次に、「Use a separate key」を選択します。
※何も表示されていない場合は「Randamize」ボタンを押して生成してください。
YubiKeyのすべてのPIV管理操作には、マネジメントキーと呼ばれる24バイトの3DESキーが必要です。
※Management Keyは後で使用するため、コピーしてエディタなどに貼り付けてください。
最後に、PUKを設定します。
PUKとはPINがロックされてしまった際に、PINのリセットを行うために利用するコードです。
YubiKey PIV Managerの操作は以上です。
秘密鍵をYubiKeyに格納
YubiKeyには証明書の保存領域が4つあります。
・9a — PIV Authentication
・9c — Digital Signature
・9d — Key Management
・9e — Card Authentication
今回は「9a」スロットを使用します。
ここからはCUIツールを用いて操作します。
コマンドプロンプトで以下のコマンドを実行し、秘密鍵を9aスロットに格納します。
yubico-piv-tool -a import-key -s 9a -i id_rsa -K PEM -k(マネジメントキー)
※-kの後はスペースを空けずに続けてマネジメントキーを入力してください。
公開鍵の自己署名証明書の格納
公開鍵を自己署名し、秘密鍵の正当性を担保します。
SSHの秘密鍵の対になる公開鍵を自己署名して、自己署名証明書を作りYubiKey内部に保存します。
まず、自己署名署名書を作成します。
※以下のコマンドは9aスロットに秘密鍵を保存した状態で実行してください。
yubico-piv-tool -a verify-pin -a selfsign-certificate -s 9a -S "/CN=host.example.com/OU=test/O=example.com/" -i id_rsa_pub.pem -o 9a-cert.pem --valid-days=(日数)
この操作にはPINコードの入力が必要になります。
-S: x.509証明書の記述です。CNに記載した名前がOSの証明書選択画面で表示されます。
–valid-days: 証明書の有効期限を表し、指定しない場合はデフォルトで365日に設定されます。
次に、この証明書をYubiKeyに格納します。
yubico-piv-tool -a import-certificate -s 9a -i 9a-cert.pem -K PEM -k(マネジメントキー)
設定を確認します。
yubico-piv-tool -a status
9aスロットに保存されていることを確認します。
YubiKeyを使用したSSH接続
Putty-CACを利用してSSH接続します。Putty-CACはダウンロードはこちら。
※本記事では、puttycac-64bit-0.71-installer.msi をインストールしています。
それでは、YubiKeyを用いたSSH接続の設定をしていきましょう。
YubiKeyをUSBポートに挿し込み、Puttyを起動してください。
カテゴリー>Connection>SSH>Certificateから証明書の設定を行います。
「Attempt certificate authentication」にチェックを入れ、「Set CAPI Cert…」を押します。
証明書の選択画面が表示されるので、今回作成した証明書を選択します。
以上で接続設定は完了しました。
さっそくYubiKeyを使用したSSH接続を試してみましょう。
ユーザー名を入力後、PINが求められます。
PINを入力して
ログイン完了です。
んー、ログインできたのはいいですが、この方法だと毎回証明書を選択して接続することになるので面倒ですよね。さらに快適に利用するためPutty Pageantの設定をしましょう。
Putty PageantはPuttyのインストーラーに同梱されています。デフォルト設定でインストールした場合は「C:\Program Files\PuTTY」にpageant.exeがあると思います。
pageant.exeを実行します。
実行後、タスクバーにpageantが表示されます。
pageantを右クリックし、「Add CAPI Cert」を選択してください。
証明書を追加します。
設定が完了すると、次回アクセス時には証明書の選択なしで接続できます。
Puttyで接続先を登録しておけば、Saved Sessions>接続先選択>アカウント入力>PIN入力でログイン完了です。
また、pageantを設定しておくことで、Tera Termでもご利用いただけます。
最後に
今回はYubiKeyを利用したSSH接続についてご紹介しました。これで秘密鍵を複数の端末に保存することなく運用できると思います。次回は、Mac編の記事を書こうと思います。