前回の記事の続きです。 たまに gpg-agent forwarding が切れるようで、それ自体はまだ原因がわかっていません。 使えなくなったときに ssh を再接続しても直らないことがあったので、 ssh を再接続すれば確実に直る状態まで改善できました。

動作確認バージョン

前回と同じです。

ローカル側:

  • macOS Monterey 12.6
  • Homebrew でインストールした gpg (GnuPG) 2.3.7
  • OpenSSH_8.6p1, LibreSSL 3.3.6

リモート側:

  • Ubuntu 22.04.1 LTS (jammy)
  • gnupg 2.2.27-3ubuntu2.1
  • openssh-server 1:8.9p1-3

ownertrust

前回の記事に書き忘れていたので追記したのですが、 ownertrust の情報もコピーしておかないと 信用していない鍵の確認が毎回出てきてしまいます。

% gpg --export-ownertrust | ssh $REMOTE gpg --import-ownertrust

以下のように gpg --edit-keytrust しても大丈夫です。

ubuntu@outgoing-cat:~$ gpg --edit-key 262ED8DBB4222F7A
gpg (GnuPG) 2.2.27; Copyright (C) 2021 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.


pub  rsa4096/262ED8DBB4222F7A
	 created: 2010-06-27  expires: 2040-08-10  usage: SC
	 trust: unknown       validity: unknown
sub  rsa4096/7515B686FAFB96B8
	 created: 2010-06-27  expires: 2040-08-10  usage: E
[ unknown] (1). Kazuhiro NISHIYAMA <z...m>
[ unknown] (2)  Kazuhiro NISHIYAMA (ZnZ) <z...m>
[ revoked] (3)  Kazuhiro NISHIYAMA <n...p>
[ unknown] (4)  Kazuhiro NISHIYAMA (znz) <k...m>

gpg> trust
pub  rsa4096/262ED8DBB4222F7A
	 created: 2010-06-27  expires: 2040-08-10  usage: SC
	 trust: unknown       validity: unknown
sub  rsa4096/7515B686FAFB96B8
	 created: 2010-06-27  expires: 2040-08-10  usage: E
[ unknown] (1). Kazuhiro NISHIYAMA <z...m>
[ unknown] (2)  Kazuhiro NISHIYAMA (ZnZ) <z...m>
[ revoked] (3)  Kazuhiro NISHIYAMA <n...p>
[ unknown] (4)  Kazuhiro NISHIYAMA (znz) <k...m>

Please decide how far you trust this user to correctly verify other users' keys
(by looking at passports, checking fingerprints from different sources, etc.)

  1 = I don't know or won't say
  2 = I do NOT trust
  3 = I trust marginally
  4 = I trust fully
  5 = I trust ultimately
  m = back to the main menu

Your decision? 5
Do you really want to set this key to ultimate trust? (y/N) y

pub  rsa4096/262ED8DBB4222F7A
	 created: 2010-06-27  expires: 2040-08-10  usage: SC
	 trust: ultimate      validity: unknown
sub  rsa4096/7515B686FAFB96B8
	 created: 2010-06-27  expires: 2040-08-10  usage: E
[ unknown] (1). Kazuhiro NISHIYAMA <z...m>
[ unknown] (2)  Kazuhiro NISHIYAMA (ZnZ) <z...m>
[ revoked] (3)  Kazuhiro NISHIYAMA <n...p>
[ unknown] (4)  Kazuhiro NISHIYAMA (znz) <k...m>
Please note that the shown key validity is not necessarily correct
unless you restart the program.

gpg> q

使えなくなる原因

gpg コマンドを実行したときに、 gpg-agent につながらないと、 gpg コマンドが自動で gpg-agent を起動してしまいます。

すると forwarding された gpg-agent には接続できずに、 起動した gpg-agent につながるようになってしまって、 手元の秘密鍵が使えない、という状況になるようでした。

gpg に gpg-agent を起動させない

gpg --no-autostart で自動起動しなくなるので、たとえば Pass: The Standard Unix Password Manager なら export PASSWORD_STORE_GPG_OPTS=--no-autostart で設定できます。

しかし、この方法だと動作確認のための gpg -K などもすべて gpg --no-autostart -K などにしないといけなくて大変です。

そこで ~/.gnupg/gpg.conf に以下のように no-autostart を設定しました。

ubuntu@outgoing-cat:~$ cat ~/.gnupg/gpg.conf
no-autostart

systemd からも gpg-agent を起動させない

$XDG_RUNTIME_DIR/gnupg/S.gpg-agent などのソケットは systemd で待ち受けしているので、 そこ経由で起動してしまう可能性もあります。 これで起動した場合は ps x などで確認すると gpg-agent --supervised という引数になっています。

これを止めるために systemctl mask でマスクしておきます。

ubuntu@outgoing-cat:~$ systemctl --user mask gpg-agent.service gpg-agent.socket gpg-agent-ssh.socket gpg-agent-extra.socket gpg-agent-browser.socket
Created symlink /home/ubuntu/.config/systemd/user/gpg-agent.service → /dev/null.
Created symlink /home/ubuntu/.config/systemd/user/gpg-agent.socket → /dev/null.
Created symlink /home/ubuntu/.config/systemd/user/gpg-agent-ssh.socket → /dev/null.
Created symlink /home/ubuntu/.config/systemd/user/gpg-agent-extra.socket → /dev/null.
Created symlink /home/ubuntu/.config/systemd/user/gpg-agent-browser.socket → /dev/null.

動作確認

gpg-agent の設定の再読み込みは (今回は無関係ですが) gpg-connect-agent reloadagent /byegpgconf --reload gpg-agent でできるように、 停止は pkill gpg-agent などで kill しても良いですが gpgconf --kill gpg-agent でできます。

agent forwarding ありでの正しい実行結果例は以下のようになります。

ubuntu@outgoing-cat:~$ gpg -K
/home/ubuntu/.gnupg/pubring.kbx
-------------------------------
sec   rsa4096 2010-06-27 [SC] [expires: 2040-08-10]
      B863D6DCC2B957B852386CE0262ED8DBB4222F7A
uid           [ultimate] Kazuhiro NISHIYAMA <z...m>
uid           [ultimate] Kazuhiro NISHIYAMA (ZnZ) <z...m>
uid           [ultimate] Kazuhiro NISHIYAMA (znz) <k...m>
ssb   rsa4096 2010-06-27 [E] [expires: 2040-08-10]

agent forwarding なしでの正しい実行結果は以下のようになります。

ubuntu@outgoing-cat:~$ gpg -K
gpg: no gpg-agent running in this session

失敗例

gpg -K で何も出力されなくて gpg-agent が起動してしまっているときは、 $XDG_RUNTIME_DIR/gnupg/S.gpg-agent が forwarding したものではなく、 gpg-agent のものになってしまっています。

ubuntu@outgoing-cat:~$ gpg -K
ubuntu@outgoing-cat:~$ pgrep gpg-agent
3464
ubuntu@outgoing-cat:~$ ls -1 $XDG_RUNTIME_DIR/gnupg
S.dirmngr
S.gpg-agent
S.gpg-agent.browser
S.gpg-agent.extra
S.gpg-agent.ssh

この状態で復号が必要な処理を実行すると gpg: decryption failed: No secret key になります。

まとめ

gpg-agent の起動を止めることで、確実に forwarding した gpg-agent への接続を試してくれるようになりました。

forwarding が切れる原因は調べきれていないのですが、複数同時接続しているので、 後から接続した方が StreamLocalBindUnlink yes でソケットを上書きして、 そちらが切れると forwarding 自体も切れるのかなという可能性を考えているので、 ControlMaster などで解決できるのかもしれません。

Disqus Comments

Kazuhiro NISHIYAMA

Ruby のコミッターとかやってます。 フルスタックエンジニア(って何?)かもしれません。 About znzに主なアカウントをまとめました。

znz znz


Published