旅とプログラミングを少々

趣味に関する記録などをします。おそらくプログラミング入門に関しての内容を連ねていきます。

Yubikey5にssh用秘密鍵を置く

貸与されたPC等自分のgithubアカウントにアクセスできると便利だが絶対に秘密鍵を置きたくない環境で使うための鍵ペアを準備した
自己同一性の証明用鍵のサブキーではない場合、意外と簡単だった

下記脆弱性のため、2017年6月以降に出荷されたYubikeyであることを確認してから実行すること Security Advisory 2017-10-16 | Yubico

環境

手順

  1. 必要な、あるいは便利なプログラムをインストールしていく
  2. Yubikey as OpenPGP card の PINを設定する
  3. YubiKey上で鍵生成する
  4. ssh公開鍵を確認し、登録する
  5. 生成した鍵をssh鍵として使う

プログラムのインストール

apt install gnupg2 gnupg-agent scdaemon pinentry-gnome3 (pinentry-guiならなんでもいい) 

PINを初期設定から変更する

gpg2 --change-pin

初期設定はPINが123456、Admin PINは12345678なので変更する。

鍵設定する

gpg2 --card-edit

gpg cardとのCLIに入る

gpg/card> help  

このカードでgenerateできる事を確認して、 *1

gpg/card> admin  
gpg/card> generate  

適切に答えていって4096bit RSA鍵を作る。今回は単にgithubと自分の管理するサーバのssh鍵の代わりに用い、pgp上のアイデンティティを想定していないのでオンラインのパソコンでそのまま作り、秘密鍵のバックアップをドライブ上に一切作らない。失くしたらauthorized_keysから消すのみである。
また、sshで使うためにはauthentication機能だけで良いのだがgpg cardに詳しくないためsign等用の鍵も生成してしまった。
エントロピー生成のためにいろいろしながら過ごして待つ。一所懸命に何か入力して過ごしてもそこそこ時間がかかるので、Yubikeyを反射的に抜いてしまわない限り他の事をやって鍵の事を忘れるくらいでいい。(1敗。運良く特に壊れなかった。)

gpg: key <key id> marked as ultimately trusted  

これでgnupgのキーリングで対応する公開鍵が信頼された状態となる。

ssh公開鍵を確認する

今回生成した鍵は普段の環境では使うつもりがない*2ので、gpg-agentの導入を一時的にしかしない。

SSH_AUTH_SOCK="$(gpgconf --list-dirs agent-ssh-socket)"  ssh-add -L

sshがgpg-agentのssh-agentモードに繋ぐようにソケットを変え、agentに登録されている公開鍵のリストを出す。
他にgpg-agent内に鍵がある場合はcardnoでどの鍵かを識別し、これをgithubssh鍵の設定なり必要なマシンのauthorized_keysなりに追加する。
githubにはcommit verification用のgpg鍵の設定もあるので混同しないようにする。

生成した鍵をssh鍵として使う

鍵を使う側のPCの方ではsshからgpg-agentを常用するように設定する。こちらは何が必要で何が必要でなかったのかあまりわからないが、そこまできつく縛る環境でもないので適当に入れている。

sudo apt install scdaemon gpg2 gpg-agent pcscd

環境変数の設定

# In .bashrc etc
export GPG_TTY=$(tty)
gpg-connect-agent updatestartuptty /bye

なお、こちらでもpinentry-gnome3 のたぐいを入れておいた方が多数のttyでPINを入れ直したりせずに済む。

# ~/.gnupg/gpg-agent.conf
enable-ssh-support
pinentry-program /usr/bin/pinentry-gnome3

あとはYubikeyを刺してssh-add -lしてみたり、試しにgit clone等してみて動作を確認する。

補遺

日本のマイナンバーカードの鍵なども一切利用が進まず、他のSmart Cardを使う事がないのでscdaemonのみ使用する環境を想定しているが、IT先進国ではopenscと共存させるための設定が追加で必要となるはず。

*1:gpg2 --card-info みたいなコマンドでどのような鍵を生成できるのか確認できた気もするが、詳しくない

*2:物理的に持ち歩かないタワーPC、鍵付き。USBポートまで行くのが面倒と判断