[令和5年最新][備忘録]YubikeyでSSH
YubikeyでSSHする方法は4種類
メリデメとかは公式参照
Securing SSH with the YubiKey
- PIV
- PGP
- FIDO2
- OTP
FIDO2が比較的新しい
OpenSSH 8.2 (was released on 2020-02-14) で追加されたらしく、それ以前のブログ等を読むとPIVでSSHする方法しか書かれていない。
FIDO2はクライアントとサーバー両方の対応が必要で対応しているサービスが少ないっぽい。GitHubがFIDO2のSSHに対応したのは2021年5月
GitHubの推しはFIDO2っぽい
GitHubのドキュメントには、FIDO2を使った方法が書かれているので、盲目的にこれを使ってみることにした。
$ ssh-keygen -t ed25519-sk -C "YOUR_EMAIL"
-sk
がセキュリティキーを使用した鍵生成
ecdsa-sk
もあるようだが強度が高いのは、 ed25519-sk
コマンドを実行するとYubikeyのPIN入力、キーのタッチを求められる。
その後はいつものssh-keygenと同じ要領。
生成された秘密鍵はYubikeyの参照らしくこのファイル単体が流出しても問題ないかつ、Yubikeyが挿入されていないときは機能しない。
$ ssh-keygen -t ed25519-sk
Generating public/private ed25519-sk key pair.
You may need to touch your authenticator to authorize key generation.
Enter PIN for authenticator:
You may need to touch your authenticator (again) to authorize key generation.
Enter file in which to save the key (/home/user/.ssh/id_ed25519_sk): test
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in test
Your public key has been saved in test.pub
The key fingerprint is:
SHA256:FL5Rcwrp6Sea0SdceqzPK1KriIq7MDFxzCH0mntHaxc user@hostname
The key's randomart image is:
+[ED25519-SK 256]-+
|o.. o.o . |
| +.. ..+ + |
|. +. .+.. |
| oo .oo. |
|oo . ES+ |
| o. . o X = |
|o. . + * O |
|o...o.= +. |
|=+. . .o o+. |
+----[SHA256]-----+
秘密鍵をYubikeyに保存することもできる
-O residentを付けると鍵がYubikeyにも保存される。
residentを2回実行すると1回目の鍵が無効になるので注意
$ ssh-keygen -t ed25519-sk -O resident
他のPCで使いたいときは、このコマンドでカレントディレクトリに秘密鍵と公開鍵が作成されるので、~/.sshにコピーして使う。(鍵を取り出すときにはPINが必要)
macOS標準のOpenSSHはセキュリティキーに対応していないのでbrew install opensshすること
$ ssh-keygen -K
鍵を使用するときにPIN入力を強制することもできる
-O verify-requiredを付けると、PIN入力が必須の鍵が生成されるので、Yubikeyを刺した状態のPCが盗まれた場合も安心
ssh-keygen時のpassphraseは、ローカルの鍵にしか適用されない。residentでYubikey内に保存した鍵には適用されないので注意
$ ssh-keygen -t ed25519-sk -O verify-required
鍵使用時のタッチは無効化できない
remoteのgitを操作 (e.g. git push) するときには毎回Yubikeyのタッチ操作が必要
ssh-keygenには、 no-touch-required
のオプションがあるがGitHub側が対応していない模様
Yubikey紛失時の対応
Yubikeyから秘密鍵を取り出すときのPIN入力は8回連続失敗するとFIDO2がブロックされリセットが必要になるらしい。現実的に取り出すことは不可能なはずなので、慌てずにGitHubから公開鍵を削除すれば問題なさそう(削除前に最終アクセスの日時確認を忘れずに)
Discussion