当 systemd 拥有远程套接字时,如何通过 ssh 使用 GPG 代理转发?

当 systemd 拥有远程套接字时,如何通过 ssh 使用 GPG 代理转发?

我正在尝试遵循这些指南和答案

以及我能找到的其他任何东西来完成这项工作:

  • 从 macOS 到 ubuntu 18.04 的 SSH
  • 转发我的本地 gpg 代理,以便我可以gpg --decrypt在远程计算机上。

我已经--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

我必须做什么才能将 gpg 代理从 macOS 转发到 Ubuntu 18.04?两台机器上都使用所需的 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_config,如下所示:https://wiki.gnupg.org/AgentForwarding

给任何试图让它在 Fedora Linux 上工作的人注意:我需要在我的 Fedora Linux 工作站上启用两个套接字才能使套接字激活工作:

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

然后报告gpg-agent.service说它将由这两个套接字按需触发:

$ 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)

相关内容