gpg2中gpg-agent的目的是什么?

16

我已经使用gpg进行加密一段时间了。有人建议我改用gpg2。但是当我尝试使用gpg2时,几乎什么都做不了;它会抱怨需要访问私钥,但我似乎无法在没有运行gpg-agent的情况下使用私钥。

事实证明,我有意地禁用了gpg-agent(使用chmod -x /usr/bin/gpg-agent);这导致gpg2的功能非常有限,并向stderr投诉。

我禁用gpg-agent的原因是以下事件链。

首先,我会通过SSH连接到远程机器,“代理程序”会打开一个弹出窗口要求我解锁我的SSH密钥。我不喜欢这样做,因为:

  • 屏幕上的弹出窗口打断了我的工作流程
  • 屏幕上的弹出窗口不太可能被注意到,因此看起来连接停滞不前而不是查询以解锁加密密钥
  • 代理程序似乎会缓存我的密码,而我绝对不希望我的密码被缓存(就像sudo烦人的使用密码缓存一样,在其配置中我可以禁用它);我将始终希望为我的加密密钥输入密语,每次它们用于任何正在使用它们的程序时
  • 弹出窗口似乎是由单独的进程拥有,而我想要使用密钥的特定进程来查询密语(即使是实际进行查询的库也是如此);由于我大部分的活动都是使用命令行工具,因此GUI应用程序并不理想,因为我所做的并不是所有事情都有X11访问权限
  • 自动在后台启动单独的进程会删除“一个命令,一个进程”的概念,特别是如果该后台进程然后在原始命令退出后持续存在

事实证明是 GNOME 的密钥代理,我无法卸载该代理而不卸载 GNOME。所以我通过 chmod -x /usr/bin/gnome-keyring* 禁用了它。然后我发现 SSH 会退回到另一个代理,所以我也使用相同的方法禁用了它 chmod -x /usr/bin/ssh-agent*

当我开始使用 gpg 时,我发现它有一个类似的代理,就是我正在询问的那个代理。出于同样的原因,我立即禁用了它;我希望软件始终要求我输入密码来使用私钥。我不希望密码被缓存任何原因。

因此,由于 gpg2 看起来需要 gpg-agent,我想问:

  • 我对密码短语缓存过度担忧吗?我很想看看或被指向与之相关的讨论。
  • 是否存在最佳实践,可以更好地避免意外启用缓存密码的使用?
  • 是否有一种方法可以在不运行 gpg-agent 的情况下使用 gpg2
  • 由于代理是预期能够回答查询的 守护程序,是什么防止本地机器上运行的另一个用户或服务能够访问我的缓存或存储凭据?

4
我想强调我完全同意这里的观点。这就是为什么我仍然继续在可以的情况下只使用和安装 gpg 而不是 gpg2 的原因。 - mtraceur
1
除了可能存在恶意进程访问套接字的可能性外,还存在已安装工具监视通过d-bus传输的所有内容的可能性。 d-bus用于启用套接字通信。 当我安装Ubuntu 16.04时,我发现有很多信息自动存储在数据库文件中,记录了使用的应用程序和文件,还有另一个数据库文件似乎存储了通过dbus传输的信息。 当然,我将它们全部禁用了。 - Craig Hicks
2个回答

8
我对使用密码短语缓存是否过度担心了?我想看一下或被指向有关此问题的讨论。
在我看来,你的担忧是合理的。好消息是,有办法自定义gpg-agent的行为以适应你的需求。例如,使用基于终端的密码短语提示(PIN输入)而不是GUI提示,并且缓存密码短语。
有没有最佳实践能够更好地避免甚至意外启用缓存密码短语的使用?
一个快速的解决方案,可能不是最佳做法,是使用以下选项自定义您的~/.gnupg/gpg-agent.conf:
# Expire cached PINs (passphrases) after zero seconds
default-cache-ttl 0
max-cache-ttl 0

# If you use your GPG keys for SSH auth...
default-cache-ttl-ssh 0
max-cache-ttl-ssh 0
enable-ssh-support

# Use TTY-based PIN entry program (I see pinentry, 
# pinentry-curses, pinentry-gnome3, pinentry-tty and 
# pinentry-x11 on my system)
pinentry-program /usr/bin/pinentry-tty

我在GPG密钥最佳实践方面找到了以下指南(更多关于密钥管理的通用指南,与您要求的内容有些不同),这些指南相当信息丰富并易于理解:

是否有一种方法可以在不运行gpg-agent的情况下使用gpg2?

据我所知,在gpg 2.x中不可能。手册说明如下:

   --use-agent
   --no-use-agent
          This is dummy option. gpg always requires the agent.

我有gpg 2.1.15版本。
考虑到代理是期望能够回答查询的守护程序,那么是什么阻止另一个用户或在本地机器上运行的服务能够访问我的缓存或存储的凭据呢?
很好的问题... 默认情况下,gpg-agent使用一个套接字,因此从技术上讲,任何以你的用户身份运行的进程都可能劫持你的密钥。不过请不要引用我的话。以下是关于gpg-agent如何工作的概述,希望可以帮助你找到真正的答案: https://unix.stackexchange.com/questions/188668/how-does-gpg-agent-work

1
我在Ubuntu 16.04 LTS上使用的gpg2版本为2.1.11;我已经设置了除pinentry程序之外的所有选项。但是,似乎gpg-agent并不遵守这些选项。将pinentry程序设置为/usr/bin/pinentry-tty似乎会在守护进程的终端上调用pinentry程序(否则,如果代理的守护进程没有附加的终端,则无法使用代理),并且它会破坏终端的交互能力(甚至无法输入所要求的PIN)。整个过程似乎非常笨拙,并且感觉设计得不好。 - inetknght
在写完那个评论后,pinentry-tty 就崩溃了,这肯定不会让人觉得它是一个好程序。 - inetknght
我忘了提到的一件事是,在编辑gpg-agent的配置文件后,您需要重新启动它。您可以使用通常的kill方法来执行此操作,或者使用以下命令来优雅地执行:gpg-connect-agent reloadagent /bye - Rouben Tchakhmakhtchian
调用gpg?我所做的就是调用ssh <remote host>。然后OpenSSH客户端查询其代理(即gpg-agent,由环境变量SSH_AUTH_SOCK=${HOME}/.gnupg/S.gpg-agent.ssh指定,在我的.bashrc中描述如man gpg-agent所述)。GPG代理然后注意到我有一个Yubikey(GPG卡)身份验证令牌,并希望呈现它;这时就会调用pinentry。以前,会弹出一个X11窗口。使用pinentry-tty,将查询我启动gpg-agent守护程序的终端(这不是我尝试使用SSH的终端)。 - inetknght
1
谢谢您的概述。经过一番搜索,我找到了答案,但它相当笨重:https://unix.stackexchange.com/questions/280879/how-to-get-pinentry-curses-to-start-on-the-correct-tty - Rouben Tchakhmakhtchian
显示剩余4条评论

4
根据https://wiki.archlinux.org/index.php/GnuPG#Unattended_passphrase,为了直接向gpg提供密码(而无需运行gpg-agent),您需要使用以下选项运行:
gpg --passphrase-fd 0 --pinentry-mode loopback ...

您需要在运行此命令后在控制台中提供密码。在输入期间不会显示密码提示,但您将看到已输入的密码。
为了在输入时隐藏密码,您可以在命令中包装 stty:
stty -echo ; gpg ... ; stty echo

我用GnuPG v. 2.2.4测试了这个:杀死了gpg-agent,删除了/usr/bin/gpg-agent,然后按照上述描述运行。 运行良好。

1
使用GNuPG 2.2.7并使用--passphrase-fd 0 --pinentry-mode loopback对我不起作用:密码:gpg:无法启动代理'/usr/local/bin/gpg-agent':没有这样的文件或目录// gpg:无法连接到代理:没有这样的文件或目录// gpg:代理出现问题:没有运行代理 - Craig Hicks
1
你提到的文档(无人值守密码短语)确实提到了“如果gpg-agent正在运行,请重新启动该进程以使更改生效。”。这似乎意味着gpg-agent仍然作为输入的接收器(通过控制台而不是GUI),并且将通过套接字传递。对于这种情况,您有何看法? - Craig Hicks
@CraigHicks 正如我所写的:我销毁了gpg-agent可执行文件并将其删除。在那之后,gpg-agent无法运行,因此它不起作为输入接收器的作用。 - cryptogopher

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接