Yubikey bio でssh鍵を管理する on Ubuntu
なにこれ
zennに書いた記事と同じです: https://zenn.dev/ocknamo/articles/dec1802a2d9ba2
以前の記事で Yubikeyでssh鍵を管理する方法を紹介しました。今回は Yubikey bio を使います。
https://zenn.dev/ocknamo/articles/86ba7416cfc680
https://www.yubico.com/jp/product/yubikey-bio-series/yubikey-c-bio/
モチベーション
以前の方法で期待通り git push や npm publish でYubikeyの認証を挟むことができるようになりました。
しかし、Yubikeyを使う前にキーボードでPINコードを毎回打つから認証する必要がありちょっとめんどくさいという問題がありました。
毎回のPINをなくそうとすると今度はPINコードなしでYubikeyの物理ボタンのみで認証できるようになります。
ただしこのようにまったく何も検証がない状態だと、ボタンにタッチできさえすれば認証できてしまうのでカフェや会社など他の人がいる場所で使うことにリスクを感じていました。極端な話Yubikey挿しっぱなしのPCを物理的に奪われると認証ができてしまいます。
たとえばですがYubikeyをつないではじめはPINが必須で二回目以降はキャッシュされて不要になる、みたいな柔軟な設定はできなかったので、しょうがなく毎回PINを手打ちする運用にしていました。
今回、Yubikey bioというタッチ時に指紋認証できる端末を頂いたのでこれで解決できるか設定しました。(くれた人に感謝)

参考 https://developers.yubico.com/SSH/Securing_SSH_with_FIDO2.html
環境
- OS: Ubuntu 24
- PC: Lenovo ThinkPad X9-14 Gen 1
- Yubikey: Yubikey C Bio
Yubikeyの準備
Yubikey へのPINと指紋認証の設定をあらかじめ行っておく必要があります。
YubiKey Manager (ykman)を使っても良いが、Google Chrome の「セキュリティキーの管理」から、PINと指紋を設定するのが簡単でした。
chrome://settings/securityKeys

鍵の生成
鍵の生成コマンド
ssh-keygen -t ed25519-sk -O resident -O application=ssh:github -C "your_emai@example.com" -C "comment"
- PINなしで認証するため
verify-requiredはなし - applicationの
githubの部分とcomment、メールアドレスは自分の設定に変更してください - 秘密鍵のパスフレーズも聞かれるが設定しないようにしてください
その他の準備
- Githubアカウントへの公開鍵の設定
~/.ssh/configに以下を設定
Host github.com
IdentityFile ~/.ssh/id_gitnpm_sk
User git
IdentitiesOnly yes # IdentityFile で指定した秘密鍵でのみ認証を試み
動作確認
ログの日本語コメントは私の追記です。
本人想定の場合の挙動
$ ssh -T git@github.com
Confirm user presence for key ED25519-SK SHA256:7/pHASHVALUEXXXXXXXXXX
User presence confirmed
# ここで指紋認証を求められるので登録済みの指紋で認証する
Hi xxx! You've successfully authenticated, but GitHub does not provide shell access.
# 認証に成功
狙い通り指紋認証のワンタッチでssh鍵を使うことに成功しました。これで認証が通るのであればかなり快適です!
つづいて、別人が認証したときにちゃんと拒否できるかを確認します。
別人想定の挙動
$ ssh -T git@github.com
Confirm user presence for key ED25519-SK SHA256:7/pHASHVALUEXXXXXXXXXX
# ↑で指紋認証を求められるので設定していない指でタッチするとPINの認証にフォールバック ※1
Enter PIN for ED25519-SK key /home/xxx/.ssh/id_gitnpm_sk:
# 間違ったPINを入力するとYubikeyへのタッチを求められる ※2
Confirm user presence for key ED25519-SK SHA256:7/pHASHVALUEXXXXXXXXXX
sign_and_send_pubkey: signing failed for ED25519-SK
# ここで再び間違った指でタッチする ※3
"/home/xxx/.ssh/id_gitnpm_sk": incorrect passphrase supplied to decrypt private key
git@github.com: Permission denied (publickey).
ちゃんと(?)失敗できました。
別人想定の挙動をいろいろいじってわかったこと
いろいろいじってみてましたが、結構面白い動作だったので紹介します。
- ※1以降で求められるPINはYubikeyのPINです
- ※1で正しいPINを入力して かつ その後 Yubikey をタッチすれば タッチしたのが正しい指でなくても 認証が通ります
- ※2で間違ったPINを入力しておいて、※3で 正しい 指で指紋認証したら 認証は通ります
- 何度も間違えるとこのフロー自体の挙動が変わって、はじめから指紋ではなくPINを求められるようになります
はじめに書いたように verify-required なしで作成しているんですが、指紋認証かPINが必須の挙動にできています。 Yubikeyの PIN が通れば指紋がだめでも認証が通るので PIN が結構重要と言えそうです。(スマホなどの他の認証機でもこれは同じですが)
間違えると次の挙動が変わるのがとくに面白いポイントです、YubikeyのPINは8回間違えるとロックされるので多分上記の操作で何度も間違え続けるとロックされる可能性が高いそうです。ロックされたら困るので今回はそこまで試していません😁
その他
秘密鍵のパスフレーズ設定しなくて大丈夫なの?
ローカルの~/.ssh以下にある鍵のファイルはYubikeyの参照になっているだけで鍵の実体はYubikey内に保管されています。Yubikey内の鍵はYubukeyのPINで守られているので秘密鍵のパスフレーズはなくてもよいという判断です。
秘密鍵のパスフレーズを設定してしまうと毎回の入力をスキップすることができませんでした。
「verify-required なし」なのになぜ指紋認証を求められるの?
なぜか bio の仕様がそうなってるとしか。
まとめ
- Yubikey bio の指紋認証ワンタッチでssh鍵を使うことができた
- PINを知らない他人では認証が通らないことも確認できた
- これでさらに快適な Yubikey ライフが過ごせそうですね!
有料部分に入れる有用な内容が特に思いつかいないのでYubikeyをくれた人が作ってくれたYubikey教育サイトのリンクを本邦初公開。(別に秘密ではない)
⚠️ この続きは有料コンテンツです。 Blogstr で続きを読む
Write a comment