はじめに
秘密鍵って、無防備なストレージに置きたくないですよね?
と言う事で、おはこんばんにちは(書いてるのは午前四時)
皆さんはSSHでサーバーに接続するとき、どんな認証を使用していますか?
まさかroot
ログインを許可した上でパスワード認証を使っていたりしませんよね?
冗談はさておき、多くの人は少なくともRSAやED25519などを使用した公開鍵認証を利用していることでしょう。
ではその秘密鍵、どうやって管理していますか?
カジュアルな運用を行っている自宅サーバーなど以外の真面目なサーバーは、恐らくはパスフレーズ付きの秘密鍵を使用しているのではないかと思います。
しかしその秘密鍵は通常、ローカルストレージ上に保管されます。
これでは、ランサムウェアによる暗号化や誤操作で失われるリスク、さらにはリモートから盗まれるリスクがあります。
そこで登場するのが、セキュリティキー(ハードウェアトークン)です。
たとえばYubiKeyなどのデバイスを使えば、秘密鍵を物理デバイスのセキュアエレメントの中に閉じ込めたまま、SSH認証を行うことができます。
秘密鍵はデバイス外に出すことができないため、たとえマルウェアに感染しても、秘密鍵を盗まれたり改ざんされたりすることはほぼ不可能です。
あと、ちょっとカッコいいです。
「秘密鍵をファイルに置いておきたくない」
「でもWindowsからSSHを安全に使いたい」
「セキュリティーキーってロマンがあってカッコいいよね」
という方にぴったりの内容です。
この記事では、Windows上でTera Term
を使い、YubiKey
を利用してできるだけ簡単にSSHサーバーに公開鍵認証で接続する方法を紹介します。
必要なもの
- YubiKey (PIV機能対応)
YubiKey Manager
YubiKey PIV Tool
YubiKey MiniDriver
OpenSC
-
TeraTerm
5.5.0 -
PuTTY CAC
0.83-1
※ 注意:
- これらは可能な限り最新バージョンを推奨します。
- PIV対応のYubiKeyの現在の正規代理店価格は大体1万円前後です。(円安って嫌だね)
- YubiKeyのファームウェアにより対応する鍵形式が異なります。可能な限り最新のファームウェアを搭載した製品を選んでください。
-
PuTTY CAC
はPuTTYをスマートカードなどに対応させたフォークです。
ダウンロードページ
インストール
インストール方法は基本的にそれぞれのインストーラに従って進めていくだけなので割愛します。
詳しく知りたい場合は他の人が書いた良質な記事があると思うので検索しましょう。
設定手順
ここからは、それぞれのソフトウェアのインストールが完了したという前提で進めます。
1. YubiKeyの準備と鍵ペアの生成
-
YubiKeyをUSBポートに接続します。しばらくすると自動的にデバイスドライバが適用されるはずです。
-
YubiKey Manager
を起動しましょう。接続されたYubiKeyが無事に認識されていると製品情報(製品名、ファームウェアバージョン、シリアル番号など)が表示されるはずです。
-
YubiKeyファームウェアに関する注意:
- バージョン
5.4.x
のYubiKeyは、対応している公開鍵アルゴリズムがRSA1024
、RSA2048
、ECCP256
、ECCP384
に限られます。さらに修正不能な脆弱性が存在するため、万一YubiKeyが盗まれた場合、資金力のある国家や大規模組織であれば困難ではありますが理論上鍵を取り出せる可能性があります。(私のYubiKeyは5.4.x
です(涙)) - バージョン
5.7.x
の人は喜びましょう。RSA4096
やECDSA
、ED25519
に対応しています。
- バージョン
-
YubiKeyファームウェアに関する注意:
-
PIN Management
メニューからConfigure PINs
を押し、PINとPUKを変更します。
-
重要: YubiKeyは標準では
123456
や12345678
などの弱いPIN/PUKが設定されているので必ず変更しましょう。 - 補足: コマンドラインツールを使用するとPINの失敗許容回数を変更できますが、変更後にPINやPUKが初期値にリセットされるので、やりたい方は先に調べて設定しておきましょう。
-
重要: YubiKeyは標準では
-
PINの設定が終わったら左下の
Back
を押して戻り、Certificates
メニューからConfigure Certificates
を押します。 -
Generate
を押してキーペアを生成します。これらはYubiKeyのセキュアエレメント内で生成され、秘密鍵は一度もその外に出ることがありません。 -
Self-signed certificate
(自己署名証明書)を選びNext
を押します。 -
Algorithm
でお好みのアルゴリズムを選びNext
を押します。
例:5.4系ならRSA2048やECCP384、5.7系ならRSA4096やECDSAやED25519など。 -
Subject
には、SSH専用にするならスロットを判別しやすい名前(例:SSH_Auth_Key
など)を付けておくと、他のスロットを使う時に識別がしやすくなります。 -
Expiration date
(有効期限)を設定しますが、SSHの公開鍵認証に使うだけなら証明書の有効期限は関係ないので適当に設定してNext
を押します。 -
最後に設定した項目が一覧で表示されるので、確認後に
Generate
を押して先ほど設定したPINを入力します。 -
スロットが
No certificate loaded.
から変わり、Issuer
やSubject name
、Expiration date
が見えていたら鍵の生成は完了です。
【重要】ここで一度YubiKeyを抜き差ししてください。
WindowsによってYubiKeyの証明書が証明書ストアの「個人証明書」に自動的にインポートされて後々便利です。
こんな感じで鍵マーク付きの証明書があればOK
余談: Slot 9a
は、マイナンバーカードで言うところの「公的個人認証APの利用者証明用電子証明書」が入っている領域に相当します。一方、Slot 9c
は「署名用電子証明書」の領域に相当します。
2. Pageant (SSHエージェント) の設定
次にPuTTY CAC
に付属するPageant
(SSHエージェント)を操作していきます。
-
Pageant
を起動すると、タスクトレイに常駐します。 -
アイコンをダブルクリックするか、右クリックしてコンテキストメニューから
View Keys & Certs
を押すとPageant Key List
ウィンドウが開かれます。
-
Add PKCS Cert
を押すとPlease Select PKCS #11 Library File
というファイル選択ウィンドウが表示されます。 -
以下のどちらかの
dll
ファイルを指定してください。"C:\Program Files\OpenSC Project\OpenSC\pkcs11\opensc-pkcs11.dll"
"C:\Program Files\Yubico\Yubico PIV Tool\bin\libykcs11.dll"
-
タスクトレイのアイコンを右クリックして
Remember Certs & Keys
にチェックを入れると、次回からPKCS#11ライブラリを指定する作業が不要になります。(※Windowsの個人証明書ストアへのインポートが済んでいる場合)
※インポートが済んでいる場合Add CAPI Certでも登録ができるようになります。
3. 公開鍵のサーバー登録
-
Pageant Key List
ウィンドウで、使用する公開鍵を選択した後Copy To Clipboard
を押します。 - Windowsのクリップボードにssh形式の公開鍵がコピーされるので、接続先サーバーの
~/.ssh/authorized_keys
ファイルに登録しておきます。
TeraTermでの接続
ここまでで準備は終了です。では実際に使っていきましょう。
-
TeraTerm
を起動し、通常の公開鍵認証と同じようにホストを指定後、サービスでSSH
を選びOK
を押します。 - SSH認証画面が表示されたら、ユーザー名を入れた後、認証方式に
Pageantを使う
を選択してOK
を押します。 - WindowsセキュリティのウィンドウでPINの入力を求められるので、入力して
OK
を押すと自動的に公開鍵認証が行われてログインが完了します。
おまけ: FIDO2を使った認証
YubiKeyにはPIVの他に、Webのログインに使うFIDO2
機能があります。
TeraTerm 5.5.0
ではどれだけ試しても上手く動作しませんが、OpenSSH_for_Windows_9.8p2
などの新しいOpenSSHなら、PageantとFIDO2を使用した公開鍵認証にも対応しています。
※もちろんPuTTYでもできます。
PuTTY CAC
やOpenSSH
(ssh-keygen
) からFIDO2の鍵をYubiKeyに生成した後、Pageant Key List
ウィンドウからAdd FIDO Key
を選んでPageantに登録することで、PIVと同じような手順で利用可能です。
このとき、FIDO2の鍵には2つのタイプがあります。
-
Resident Key (Discoverable Credential)
- 鍵自体がYubiKeyのストレージ内に保管されます。
- これにより、YubiKeyをどのPCに接続しても、同じ鍵を利用できます。
-
ssh-keygen
で生成する際のオプション:-O resident
-
Non-Resident Key (Non-Discoverable Credential)
- 秘密鍵はPCのローカルストレージ上に生成されます。
- YubiKeyは、その秘密鍵ファイルを利用するための「認証器」として機能します(秘密鍵の暗号化解除にYubiKeyのタッチが必要)。
- 鍵ファイル自体はPCに存在するため、別のPCで利用するには鍵ファイルをコピーする必要があります。
そして、OpenSSHでPageantを認証エージェントとして利用するには、OpenSSH側の設定ファイルに少し追記が必要です。
これは、Pageant
に特定のコマンドラインオプションを付けて起動し、設定ファイルを出力させ、そのファイルをOpenSSHのconfig
から読み込むことで実現します。
詳しい手順は、下記の公式マニュアルを参照してください。
openssh-config "C:\Users\ユーザー名.ssh\pageant.conf"
※ 補足: 未検証ですが、このOpenSSHを使った方法を設定しておけば、GitHubなどもセキュリティーキーを使用した公開鍵認証を使えるはずです。