GPGの鍵でSSH接続しようとして大変苦労した話
Intro
以前常用していた5年前のノートPC (NEC PC)が、バッテリーとSSDの交換を経て快適によみがえった。
ついでにそのPC内のWSL環境も一新しておこうと考えた。
その詳細は別の記事に記すが、その際にGPGの鍵でSSH接続しようとして大変苦労したので、その記録を残す。
はじめからryeやgpgを前提にした構成にするだけでなく、
shellもzsh (prezto、powerlevel10k)に変更するなどしている。
TL; DR
- gpgをインストールし、GPGの主鍵とSub鍵を作成する
- GPGのSub鍵からSSH接続用の公開鍵を出力する
- gpg-agentをssh-agentとして利用する
- ssh-agentに従来の秘密鍵とGPGの認証用鍵を登録する
- 不具合に適切に対処する
GPGとは
GPG (Gnu Privacy Guard) は、OpenPGPの実装であり、データの暗号化や署名を行うためのツールである。
細かい説明は省くが、公開鍵暗号方式によって、署名(S)・証明(C)・認証(A)・暗号化(E)の3つの機能を提供する。
つまり、安全にデータの暗号化、本人証明、改竄検知、SSH接続などができる。
GPGについては、ここの記事が大変詳しく、かつ網羅的だ。素晴らしい。
SSH with GPG
上記の記事にも紹介されているが、GPG鍵をSSH接続に利用することができる。
その際の手順と詰まった点を記す。
GPGのinstall, GPG鍵の作成
1 | |
(上記の記事を参考に) GPGのMaster鍵を作成する。
以前に作成したものがあるならそれを利用する。
GPG Sub鍵の作成
安全のため、GPGのMaster鍵をそのまま用いることは推奨されない。
(上記の記事を参考に) GPGのSub鍵を作成する。
その際、暗号化・署名・認証のそれぞれ3つの機能を持つSub鍵を作成できる。
1 | |
ここまで来ると、ファイルの暗号化や署名もできるようになる。
また、各サービスとの連携や、サービスへの公開鍵の登録も行おう。
(記事「ファイルの暗号化」「ファイルへの署名」「公開鍵の公開」節)
特に、Gitへの署名は重要だ。
(記事「Gitコミットへの署名」節)
公開鍵の出力
参考記事: OpenSSH の認証鍵を GunPG で作成・管理する
こちらの記事でもSub鍵の生成の説明が行われている。
その続きでは、GPGの鍵から公開鍵を生成する。
(公開鍵はGPGのMaster鍵でもSub鍵でも共通である)
1 | |
NAMEは鍵の識別子であり、以下のいずれかを用いる。
- 鍵のID
- 鍵に紐づいたメールアドレス
- 鍵に紐づいた名前
これはgpg --list-keysで確認できる。
1 | |
上記の場合は、ABCD1234EF5678901234567890ABCDEF12345678やYour Name、[email protected]がNAMEとして使える。
ここで出力した公開鍵は、いつものSSHの公開鍵のように、サーバーに登録する。
すなわちscpなどでサーバーに送り、~/.ssh/authorized_keysに追記する。
1 | |
gpg-agentをssh-agentに利用する
恥ずかしながら、ここに来るまで筆者はssh-agentすら用いていなかった (~/.ssh/configまでの管理で済ませていた)。
なので、ssh-agentとgpg-agentの両方の勉強をすることになった。
まずはgpg-agentがssh-agentとして機能するように設定する。
1 | |
1 | |
これで、gpg-agentがssh-agentとして機能するようになる。
agentへの秘密鍵の登録
ssh-agent (実態はgpg-agent) に従来の秘密鍵とGPGの認証用鍵を登録する。
1 | |
さらにGPGの認証用鍵も登録する。keygrip付きでGPG鍵の情報を表示する。
1 | |
そのうち認証(A)のkeygripをコピーして、~/.gnupg/sshcontrolに追記する。
1 | |
その後、改めてssh-add -Lとすると、GPG鍵も登録されていることが確認できる。
1 | |
詰まった点
公開鍵の出力
実は公開鍵の出力にはいくつか方法があり、そのいずれでも構わない。
ただ、不具合が出た際に選択肢が多い分、無駄に公開鍵の出力部分を疑うことになってしまった。
(重要) GPG鍵の認証エラー
1 | |
おそらく、GPG鍵のフレーズ入力に一度裏で失敗し、その状態が残り続けたものと思われる。
gpg-agentをssh-agentとして用いている限り、GPG認証鍵を用いない場合でも、公開鍵認証ができなくなる。
これには大変苦しめられた。
1 | |
上記を入力するとフレーズを入力する画面になるなどして、解決する。
(引用元: StackExchange)
ちなみに、gpg-agentの再起動では直らなかった。 罪深い……。
1 | |
GPG認証鍵の登録
GPG鍵でSSH接続しようという記事は多いのだが、なぜかGPG認証鍵をgpg-agentに登録するくだりが触れられていない記事が多かった (あるいは、僕が見逃してしまいがちだった)。
gpg-agentをssh-agentとして利用している時点で、GPG側の鍵を自動的に登録してくれると思っていたが、そうではなかったようだ。
手順がわかればなんてことはなかったのだが……。
ssh接続におけるssh-agentやgpg-agentの挙動を調べるうえでは、Dockerが大変役に立った。
軽くて簡単で再現性のある仮想環境最高すぎる。
1 | |
1 | |
1 | |
コンテナ内外でのport接続を行う場合は、docker-compose.ymlのportsの設定に加えて--service-portsオプションが必要。
さらに、終了する場合は--remove-orphansオプションをつける必要がある。
まとめ
GPG鍵を用いたSSH接続は、セキュリティを高めるためにも有用だ。
しかし、その設定にはgpg-agentやssh-agentの設定が必要で、また、その設定には躓きやすい点が多い。
この記事が読者の一助になれば幸いだ。





