Yubikey bio でssh鍵を管理する on Ubuntu

Yubikey bioをつかってsshすることでワンタッチの快適さとセキュリティを両立させることができます
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 pushnpm 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