Yubikeyでssh鍵を管理する on Ubuntu 24
モチベーション
サプライチェーン攻撃が頻発し、ローカルマシンがマルウェアに侵入される事例も増えてきています。
またローカル環境で AIAgent を使用するようになったこともあり、ガードレールはあるもののAIがさわれる場所に秘密鍵を置いている状態も気になります。
ということでこれを機に~/.ssh以下にSSH鍵を置くのをそろそろ卒業しようということでYubikey管理に移行することにしました。
環境
- OS: Ubuntu 24.04.3 LTS
- PC: Lenovo ThinkPad X9-14 Gen 1
- Yubikey: Yubikey 5C NFC
手順
Yubicoに記事があるので基本的にはそのとおり。
Securing SSH Authentication with FIDO2 Security Keys
YubiKey ManagerというのはYubico Authenticatorのことで以下からダウンロードできます。

SSH鍵をyubikeyで作成するためには事前にYubikeyのPINを設定する必要があります。
あとは手順にあるようにオプションをつけて鍵を作成。
ssh-keygen -t ed25519-sk -O resident -O verify-required -C "your_email@example.com"
無事ssh用のパスキーが作成されています。

「かんたんかんたん」と思いきやこれだけでは使用できませんでした。
トラブルシューティング
しかし手順通り作成してもアクセスできないのです。
$ ssh -T git@github.com
sign_and_send_pubkey: signing failed for ED25519-SK "/home/ocknamo/.ssh/id_ed25519_sk" from agent: agent refused operation
git@github.com: Permission denied (publickey).
いろいろredditの記事などを探し回って、SSH_AUTH_SOCK=0をセットすることで一旦回避できました。
Yubikey no longer working for GitHub SSH auth
$ SSH_AUTH_SOCK=0 ssh -T git@github.com
Confirm user presence for key ED25519-SK SHA256:95yyY5RycVXH7REN4we+mRS+dWrTFw2OZBoJV0AIv4A
Enter PIN for ED25519-SK key /home/ocknamo/.ssh/id_ed25519_sk:
Confirm user presence for key ED25519-SK SHA256:95yyY5RycVXH7REN4we+mRS+dWrTFw2OZBoJV0AIv4A
User presence confirmed
Hi ocknamo! You've successfully authenticated, but GitHub does not provide shell access.
これはssh-agentを無効にするオプションであるのでssh-agentの問題だとは切り分けられたのですが、SSH_AUTH_SOCK=0を常に設定するとssh-agentを他のユースケースでも使えなくなるし微妙な感じです。
ArchWikiさんにも記載がありました
この問題を回避するには、-o IdentityAgent=none オプションを ssh コマンドに使用するか、関連するホストの ssh_config ファイルに追加します。
gitに使用するのみであればssh_configに設定でも良さそうだなと思ったのですが記憶力のなさには自信があるので、個別対応ではなく根本対応したいと考え別の方法を探ってみることにしました。
するとYubikeyはssh-agentの対応をできておらずgpg-agentを使用する必要があるとの古い情報がありました。
Need help with setting up a Linux host with a Yubikey for 2FA SSH access(5年前なのでかなり古い)
最新の情報ではないがssh-agentのサポートが薄い可能性があるのであればということで、
ssh-agentをgpg-agentに入れ替える対応方法を試してみます。
こちらの記事を参考に対応しました。
Ubuntu で OpenSSH の鍵管理を gpg-agent に委譲する【たぶん決定版】
入れ替え自体は以下のように成功したみたい。
$ env | grep SSH
SSH_AUTH_SOCK=/run/user/1000/gnupg/S.gpg-agent.ssh
鍵の入れ替えはできなかったので鍵は作り直ししました。この方法で対応したあと念の為rebootして実行成功しました。
$ ssh -T git@github.com
Confirm user presence for key ED25519-SK SHA256:NlH+ABCDXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Enter PIN for ED25519-SK key /home/ocknamo/.ssh/id_ed25519_sk:
Confirm user presence for key ED25519-SK SHA256:NlH+ABCDXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
User presence confirmed
Hi ocknamo! You've successfully authenticated, but GitHub does not provide shell access.
そのほか
-
.ssh/id_ed25519_skに秘密鍵のような形式のデータが入るので気になるが鍵の参照情報なので問題ない。 - YubikeyのPINを必須にした場合秘密鍵のパスフレーズっていらないのでは?とおもったら似たような問題意識の話があった。
- https://www.reddit.com/r/yubikey/comments/1id36bw/fido2_ssh_keys_is_a_passphrase_beneficial/
- 個人的にはPINが必須であれば秘密鍵のパスフレーズはいらないのかなと考えている。ハードから秘密鍵出てこないし。
- PINを入力して更にタッチするのは結構めんどくさいのでしばらく使ってみてなれなければ他の方法を模索するかもしれない。
Discussion