systemdがリモートソケットを所有しているときにSSH経由でGPGプロキシ配信を使用する方法は?

systemdがリモートソケットを所有しているときにSSH経由でGPGプロキシ配信を使用する方法は?

私はこのガイドと答えに従おうとしています。

そしてそれをするために私が見つけることができる他のものは:

  • macOSからUbuntu 18.04へのSSH
  • gpg --decryptリモートシステムで実行できるようにローカルgpgエージェントを渡します。

リモートコンピュータの公開鍵を--export編集しました。--importリモートgpgは、にあるプロキシソケットと /run/user/1001/gnupg/S.gpg-agentにある追加のソケットについて報告します/run/user/1001/gnupg/S.gpg-agent.extra

しかしssh -v -R /run/user/1001/gnupg/S.gpg-agent:/Users/rasmus/.gnupg/S.gpg-agent.extra -l rasmus <remote-host>警告しよう

警告:リスニングパス/run/user/1001/gnupg/S.gpg-agentへのリモートポート転送に失敗しました。

これは、systemdがすでにリモートソケットを所有しているためです。

$ sudo journalctl -xe
Mar 11 15:06:21 pact-cube sshd[4972]: error: bind: Address already in use
Mar 11 15:06:21 pact-cube sshd[4972]: error: unix_listener: cannot bind to path: /run/user/1001/gnupg/S.gpg-agent

macOSからUbuntu 18.04にgpgエージェントを渡すにはどうすればよいですか?両方のシステムで必要なGPGとSSHのバージョンを使用してください。

答え1

gpg配信機能を取得する最も簡単な方法は、まずsystemdにこれらのソケット干渉を停止するように指示することです。 sudo権限なしで現在のユーザーに対してリモート側で次のコマンドを実行すると、これを行うことができます。

systemctl --user 'disable' 'gpg-agent.socket'
systemctl --user 'disable' 'gpg-agent-extra.socket'
systemctl --user 'stop'    'gpg-agent.socket'
systemctl --user 'stop'    'gpg-agent-extra.socket'

不要な問題のあるコンポーネントを取り除いた後の次のステップは、コンセントを配置する場所を決定することです。実行すると簡単に完了しますgpgconf --list-dirs。 (これらのソケットディレクトリは次のようにハードコードされています。メインディレクトリ.c。 gnupgをパッチして再コンパイルしないと設定できません。 )

必要なのは、クライアントソケットがサーバーに渡され、誤動作する第三者がこれを維持することだけです。 SSH構成ブロックは、次のコマンドを実行して生成できます。 (update $remote)

remote='host.example.com'
local_sock=$( gpgconf --list-dirs | sed -n 's/agent-extra-socket://p' )
remote_sock=$( ssh $remote "gpgconf --list-dirs" | sed -n 's/agent-socket://p' )
echo "Host $remote\n  RemoteForward $remote_sock $local_sock"

通常、次のような結果が生成されます。 (数値uid:sは間違いなく異なる場合があります。)

Host host.example.com
  RemoteForward /run/user/1/gnupg/S.gpg-agent /run/user/2/gnupg/S.gpg-agent.extra

systemdが退去されても、これらのパーティーに表示される傾向がある別の招待されていないゲストがいます。これはリモートシステムのSSHエージェントです。私たちが望む唯一のものはローカルプロキシなので、リモートで実行されているプロキシを終了してソケット配信をブロックするのをやめる必要があります。

ssh $remote "pkill gpg-agent"

gpgプロキシ転送を有効にせずに使用しようとするたびに、最後の手順が必要になることがあります。ソケットが利用できないときにエラーメッセージで終了するようにgpg:s設定が更新されない限り、どのキーでも信頼できない愚かなリモートエージェントを起動しようとするものではありません。これは次の方法で行うことができます。

ssh $remote "echo 'no-autostart' >> .gnupg/gpg.conf"

要約すると、次のようにssh -v話す必要があります。リモート配信の成功...

答え2

未使用のソケットファイルを削除します。

ssh mylinuxserver 'rm /run/user/1001/gnupg/S.gpg-agent'

次に接続します。

ssh -vvv mylinuxserver

これはすでにRemoteForward存在していると仮定します~/.ssh/config

# File: ~/.ssh/config
[...]
Host mylinuxserver
HostName mylinuxserver.example.com 
#RemoteForward <socket_on_remote_box>  <extra_socket_on_local_box>
RemoteForward /run/user/1001/gnupg/S.gpg-agent /Users/rasmus/.gnupg/S.gpg-agent.extra
[...]

詳細出力には、次のような内容が表示されます。

debug1: remote forward success for: listen /run/user/1001/gnupg/S.gpg-agent:-2, \
   connect /Users/rasmus/.gnupg/S.gpg-agent.extra:-2

その後、リモートシステムでgpg-agentを使用すると機能します。

毎回未使用のソケットファイルを削除したくない場合は、次のようにStreamLocalBindUnlink yesサーバーに追加してください。/etc/ssh/sshd_confighttps://wiki.gnupg.org/AgentForwarding

Fedora Linuxでこれを実行したい人は注意してください。ソケットの有効化が機能するには、Fedora Linuxワークステーションで2つのソケットを有効にする必要がありました。

systemctl --user enable gpg-agent.socket
systemctl --user enable gpg-agent-extra.socket

gpg-agent.serviceその後、要求は次の2つのソケットによってトリガーされることを報告します。

$ systemctl --user status gpg-agent.service
○ gpg-agent.service - GnuPG cryptographic agent and passphrase cache
     Loaded: loaded (/usr/lib/systemd/user/gpg-agent.service; static)
     Active: inactive (dead)
TriggeredBy: ● gpg-agent-extra.socket
             ● gpg-agent.socket
       Docs: man:gpg-agent(1)

関連情報