しばらくぶりの鍵周りの整理でOpenPGP(GnuPG)の暗号用鍵を更新したり、フォールバック用に長いこと残しっぱなしにしていたOpenSSHのRSAの公開鍵を消して回っているなどしている時に、だいぶ前の話のようですがOpenSSH 8.2でFIDO U2Fがサポートされ、ed25519-skおよびecdsa-skなる-skが付いた鍵タイプが追加されたという話にたどり着きました。
FIDO U2Fということは黒いYubiKey 5 NFCシリーズ(PDF)ではなくて、青いSecurity Keyシリーズ(PDF)でもOKということになことになります。これは試さねば! というわけでmacOSとUbuntuとFreeBSDとCygwinで試してみました。
その前に現在のSSHとYubiKeyの関係のリストを紹介しておきます。Yubicoのサイトによれば、4つのモジュールを使うことができます。各モジュールが入ったYubiKeyかどうかは購入前に比較表などを参照してよく確認してください。すでにお持ちの場合はYubiKey Managerで確認できます。これまでのYubiKeyの一覧はYubiKeyの見分け方にあるようです。
- PIVモジュールをPKCS#11(ykcs11)経由で使う。各OS用のバンドルを指定してsshに読み込ませます。
- OpenPGPモジュールを使う。例えばgpg-agentをssh-agentとして利用します。OpenPGP(GnuPG)の鍵を利用するのでOpenPGPを利用している場合は超便利です。OpenPGPを使っていない場合には煩雑なのと、gpg-agentがed25519-skやecdsa-skの鍵タイプにまだ対応していない(as of 2021-10-15)のでssh-agent機能を使って-skとそれ以外の鍵タイプの併用ができないため旨味が減ります。
- FIDO U2Fモジュールを使う(ed25519-sk, ecdsa-sk)。これだけであれば安く調達できます。今回試します。
- OTPモジュールをサーバ側のPAMを設定して使います。sshd_configでユーザや接続元に応じて除外することもできますが、原則として全員YubiKeyを持つ構成になるかと思います。sshサーバー側にOATH Toolkitを追加して、クライアント側はGoogle AuthenticatorでもIIJ SmartKeyでもYubico Authenticatorでもなんでも良いという構成の方がシンプルかつ十分という場合も多そうです。
これらのうち青いSecurity Keyシリーズで使えるのはFIDO U2F, FIDO2だけです。なおYubiKeyはfirmware 5.2.3よりEd25519に対応しているそうです。5.2.3未満の場合はecdsa-skをお試しください。2020年あたりに買ったYubiKeyくらいから対応となるでしょうか。firmwareのバージョンもYubiKey Managerで確認できます。
全くどうでも良いのですが今ではEd25519のdjbさんですがqmailやdjbdnsとか懐かしいです。そしてEd25519はChaChaやPolyのような軽い感じの名前じゃないのが寂しいです。
YubiKey Managerを起動したついでにPINやPUKやManagement Key(青いSecurity KeyシリーズはPINだけ)がデフォルトの123456, 12345678などの場合は変更しておきます。ssh-keygen -O residentでdiscoverable credentialsを作成してGitHubに登録してデフォルトPINのYubiKeyを落としたらパスフレーズを訊かれることもなくユーザ名を知らなくても接続できるので結果ユーザー名も分かり、持ち主としてがんがんpushできてしまいます。そもそも落としたりなくしてはいけないものですがリスクは検討しないとです。
YubiKeyの種類やfirmwareはYubico Authenticatorでも確認できます。
Yubico Authenticatorは32アカウントしか登録できませんが、カメラ不要で画面に表示されているQRコードも読んでくれますし、スマホなしでTOTPできるのは結構便利です。
KVMスイッチにUSBハブがついている場合はそこに刺す使い方がこれまた便利です。これからやるFIDO U2FでのSSHも抜き差しすることなく切り替え機のUSBハブにつなげて実験しました。問題発生時には直接本体に挿してください。
前置きが長くなりましたがed25519-skを試していきます。課題は大きく
- OS付属のOpenSSHが8.2未満
- unknown key type ed25519-sk
- unknown key type ecdsa-sk
- Error loading key “/home/x/.ssh/id_ed25519_sk”: invalid format
- sshd: userauth_pubkey: unsupported public key algorithm: [email protected] [preauth]
- sshd: userauth_pubkey: unsupported public key algorithm: [email protected] [preauth]
- sshd: Postponed publickey for x from x port x ssh2 [preauth]
- OS付属のssh-agentまたはその代替が-sk鍵タイプに対応していない
- Could not add identity “/home/x/.ssh/id_ed25519_sk”: agent refused operation
- ssh-agent: error: process_add_identity: decode private key: unknown or unsupported key type
- USBデバイスとの送受信権限
となりました。以下が各環境での結果です。