Libelektra: 测试产生无限的gpg-agents

创建于 2018-04-19  ·  36评论  ·  资料来源: ElektraInitiative/libelektra

重现问题的步骤

  • 例如在Docker容器中构建elektra或检查v2服务器
  • 运行测试make run_nokdbtests
  • ps -ef
  • 运行测试make run_nokdbtests
  • ps -ef
  • ????
  • 想知道你所有的pid都去了哪里

预期结果

测试应该在完成后停止gpg-agent

实际结果

每次测试都会产生更多的gpg-agent

系统信息

  • Elektra版本:大师

更多日志文件和输出

+ ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 05:57 pts/0    00:00:00 bash
root     11296     1  0 07:01 pts/0    00:00:00 sh -c /usr/bin/python2 /root/cppcms-1.2.0/tests/http_timeouts_test.py 
root     11297 11296  0 07:01 pts/0    00:00:00 /usr/bin/python2 /root/cppcms-1.2.0/tests/http_timeouts_test.py write 
root     28509     1  0 07:55 ?        00:00:00 gpg-agent --homedir /tmp/elektra-test.NmmZ2I/.gnupg --use-standard-soc
root     28519     1  0 07:55 ?        00:00:00 gpg-agent --homedir /tmp/elektra-test.6mb1t2/.gnupg --use-standard-soc
root     28539     1  0 07:55 ?        00:00:00 gpg-agent --homedir /tmp/elektra-test.5XdxDR/.gnupg --use-standard-soc
root     30656     1  0 08:00 pts/0    00:00:00 ps -ef
+ make run_nokdbtests
+ ps -ef
+ ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 05:57 pts/0    00:00:00 bash
root     11296     1  0 07:01 pts/0    00:00:00 sh -c /usr/bin/python2 /root/cppcms-1.2.0/tests/http_timeouts_test.py 
root     11297 11296  0 07:01 pts/0    00:00:00 /usr/bin/python2 /root/cppcms-1.2.0/tests/http_timeouts_test.py write 
root     28509     1  0 07:55 ?        00:00:00 gpg-agent --homedir /tmp/elektra-test.NmmZ2I/.gnupg --use-standard-soc
root     28519     1  0 07:55 ?        00:00:00 gpg-agent --homedir /tmp/elektra-test.6mb1t2/.gnupg --use-standard-soc
root     28539     1  0 07:55 ?        00:00:00 gpg-agent --homedir /tmp/elektra-test.5XdxDR/.gnupg --use-standard-soc
root     30778     1  0 08:02 ?        00:00:00 gpg-agent --homedir /tmp/elektra-test.GZbzqb/.gnupg --use-standard-soc
root     30788     1  0 08:02 ?        00:00:00 gpg-agent --homedir /tmp/elektra-test.PEjcKs/.gnupg --use-standard-soc
root     30808     1  0 08:02 ?        00:00:00 gpg-agent --homedir /tmp/elektra-test.d6yL2g/.gnupg --use-standard-soc
root     30923     1  0 08:02 pts/0    00:00:00 ps -ef
bug work in progress

最有用的评论

请记住,如果您共享主目录,则可能无法并行运行测试。
而且之后您仍然需要删除GNUPGHOME(您不想让已登录的用户权限缠绵的pgp-agent接听电话吗?)。

如果目标系统在GNUPGHOME上中继,会发生什么,因此您需要保存现有的env,并在测试后手动将其还原。

如果我们可以退后一步,看看这些测试如何影响用户机器,而不仅仅是测试服务器环境,我将不胜感激。

所有36条评论

感谢您报告问题!

@ petermax2测试期间的gpg命令是否有可能产生gpg-agent?

糟糕,我认为gpg总是会连接到同一代理。 我会调查。

@ markus2330这也是v2上使用您的用户ID报告的gpg代理如此之多的原因,因为

但问题不仅限于docker:debian-stretch-minimal也有超过250个

一些节点不受影响,因为它们被设置为生成用于詹金斯的gpg代理,该代理被测试使用(可能需要确认)

谢谢你们双方对此的关注!

一些节点不受影响,因为它们被设置为生成用于詹金斯的gpg代理,该代理被测试使用(可能需要确认)

如果我们找不到杀死我们启动的代理的方法,我们可以简单地要求环境中已经有一个gpg-agent(#1888)。

也许根本不需要gpg代理启动,我们可以在测试期间取消它。 但是我必须在晚上看看。

mh通常GPG_AGENT_INFO应该在启动一个时设置,在过去,我们清除了环境变量,以便可以解释过去的多次启动。 不知道为什么它现在仍在发生...

@ petermax2需要gpg-agent的测试(通过将gpg-agent重命名为gpg-

  • testmod_fcrypt
  • testmod_crypto_openssl
  • testmod_crypto_gcrypt

testmod_crypto_botan应该与testmod_crypto_gcrypttestmod_crypto_openssl完全一样运行。 Botan测试是否正在服务器上运行?

@ petermax2可能是。 在我测试过的环境中,没有安装Botan。 它在这里运行

没那么简单。 我尝试在单元测试期间使用--no-autostart参数调用gpg ,但是gpg仍然启动了代理。 --no-use-agent是一个有趣的。 该手册页显示:

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

如果我们找不到杀死我们启动的代理的方法,我们可以简单地要求环境中已经有一个gpg-agent(#1888)。

我们可以试一下吗?

或像

pgrep gpg-agent | xargs -d "\n" kill

还是构建服务器/容器上类似的东西?

我将进行测试检查代理是否可用,如果不启动它并保留它的pid。 在测试清理中停止代理。 其他一切都是hack。

没错,唯一的问题是开始和停止应该在哪里发生。 在我们的代理/泊坞窗中执行此操作似乎比在用C编写的单元测试中更容易。

这是我到目前为止所学到的:

如果始终与所有gpg调用一起使用,则可以使用--no-autostart选项抑制gpg-agent的自动启动。 但是,如果没有gpg-agent gpg2不能执行任何需要私钥的操作(即解密,签名)。

也可以分叉gpg-agent --server但随后gpg2无法连接到代理。 环境变量GPG_AGENT_INFO已被弃用, gpg2不再考虑。

我将尝试分叉并执行execv gpg-agent --daemon 。 我只需要一种方法来找出已启动的gpg-agent的PID,以便在测试完成后可以SIGTERM

在我们的代理/泊坞窗中执行此操作似乎比在用C编写的单元测试中更容易。

我想起来容易得多:-)

我认为您的决定是正确的,只需使用gpg的默认方式来连接代理即可。

作为启动/停止gpg-agent的替代方法,我们还可以在.gnupg / gpg.conf中禁用“ use-agent”

我没有一个代理自动启动的问题(甚至正在运行)。 我在后续测试中开始新测试时遇到问题

我认为您的决定是正确的,只需使用gpg的默认方式来连接代理即可。

在生产环境中,这是更好的选择。 在我的计算机上, cryptofcrypt始终连接到同一代理,并且与Yubikey的集成非常好。

在我们的测试环境中,我们必须在启动测试之前保持代理的单个实例正常运行。 我认为问题在于我们已经清除了环境,就像@ingwinlu之前提到的那样。

我认为问题在于我们清除了环境

我们不应该了。 但问题仍然存在

如果gpg-agent尝试通过环境进行通信,则显然无法正常工作,那么下一次测试运行将永远不会获得之前测试运行所设置的环境。

我最喜欢以下两个选项:

  1. 我们会在容器内正确启动/停止一个gpg代理,并在TESTING.md中记录该gpg代理需要运行(请参阅#1888)。
  2. 我们禁用了gpg代理的启动(禁用.gnupg / gpg.conf中的“ use-agent”应该可以工作,尽管没有对其进行测试),并在TESTING.md中进行了说明(请参阅#1888)。

守护程序按需启动而没有全局方式来知道守护程序是否已经启动的设置(环境变量不是全局的,而是特定于进程的)似乎已被破坏。 我们不应该尝试在测试中修复此问题。

https://stackoverflow.com/questions/27459869/how-to-stop-gpg-2-1-spawning-many-agents-for-unit-testing

产生大量代理的原因是使用--homedir选项使用了不同的主目录,否则将只使用一个。 从GnuPG 2.1开始,与代理的所有通信都是通过GnuPG主目录中的套接字执行的。

我们不使用homedir选项。 https://dev.gnupg.org/T3218将stackoverflow的解决方法描述为“(非常尴尬)解决方法”。

也许简单地启动gpg-agent是最可靠的方法(在我们的环境中以可控的方式)。 好像他们在最新版本中一样,gpg-agent的启动不再是可选的。 (这使我的选择2.毫无意义)

我们不使用homedir选项。

是的,我没有找到它的来历,但它与问题相匹配(请参阅op),因为所有代理都产生了不同的代理。

这是一个很好的提示,我了解到gpg-agent的启动不再是可选的。

这很清楚地表明我们需要启动和停止它。 并且不要试图避免启动。

我们不使用homedir选项。

是的,我还没有找到它的来源,但是它可以解决问题(请参见op)

我们没有显式使用--home-dir选项,但是ps -ef表示gpg以某种方式设置它。

https://wiki.archlinux.org/index.php/GnuPG

GnuPG使用$ GNUPGHOME指向其配置文件存储的目录。 默认情况下,未设置$ GNUPGHOME,而是使用$ HOME。 因此,安装后您将立即找到〜/ .gnupg目录。
要更改默认位置,请以这种方式运行gpg $ gpg --homedir path / to / file或设置GNUPGHOME环境变量。
```
@ petermax2您可以检查测试套件中的HOME是否可用吗?

同样有趣的https://www.gnupg.org/documentation/manuals/gnupg/Ephemeral-home-directories.html

创建一个临时目录,创建(或复制)满足您需要的配置,使gpg使用环境变量GNUPGHOME或选项--homedir使用此目录。 通过修改上下文的引擎信息,GPGME也支持基于上下文的支持。 现在执行所需的任何操作,并根据需要导入和导出关键材料。 完成后,您可以删除目录。 所有已启动的GnuPG后端服务都会检测到并关闭

在我的容器中对此进行了测试,并按照承诺自动清除了该过程。

@ petermax2您可以检查测试套件中的HOME是否可用吗?

是的, HOME可用:

HOME = /tmp/elektra-test.3vLR4L

好的,因此测试套件中的某些内容会将HOME覆盖到tmp目录中(很好)。 如果在清理过程中仍然可用,则应将其删除以停止代理。 那将是一个理想的解决方案。

如果我们简单地设置GNUPGHOME仅生成一个gpg-agent实例。 在测试开始之前,不会覆盖GNUPGHOME

设置了GNUPGHOME后,多个测试运行后仅运行一个gpg-agent

我认为这是最简单的解决方案。

请记住,如果您共享主目录,则可能无法并行运行测试。
而且之后您仍然需要删除GNUPGHOME(您不想让已登录的用户权限缠绵的pgp-agent接听电话吗?)。

如果目标系统在GNUPGHOME上中继,会发生什么,因此您需要保存现有的env,并在测试后手动将其还原。

如果我们可以退后一步,看看这些测试如何影响用户机器,而不仅仅是测试服务器环境,我将不胜感激。

您可能无法并行运行测试。

我运行了脚本:

#!/bin/bash
mkdir /tmp/x
export GNUPGHOME=/tmp/x
for run in {1..1000000}
do
    ctest -R crypto_openssl &
done

没有任何问题。 GPG应该处理锁定等。

您是否不想为登录的用户权限挥之不去的pgp-agent接听电话?

这就是gpg-agent设计方式:它一直运行直到用户会话结束。 它不会将PID写入某个位置,也没有命令可以将其退出。 它只对SIGTERM

我尝试使用--server选项在单元测试中将forkgpg-agent ,因此之后我们将PID设置为kill 。 但是然后gpg-agent不会在$GNUPGHOME处打开所需的套接字,并且单元测试会重新打开该代理的另一个实例(该实例以--daemon模式运行)。 同样,在--server模式下,也没有办法使gpg-agent打开任何套接字(我用gpg-agent的源代码进行

gpg-agent很难控制且几乎没有文档记录。 我什至在阅读gpg-agent的源代码。 我们的用例未涵盖。 唯一的选择是SIGTERM

并行性

我更多地在考虑您要分离互不影响的gpg代理。 即,您只希望代理a具有测试a的密钥,并且代理b具有测试b的密钥。 如果不需要,则可以使用硬编码的tmp主页。

杀死gpg代理

首次调查问题时,我遇到了一个网站(上面链接),该网站指出关闭临时gpg-agent的预期方法是删除其gpg主目录。

因此,如果将GNUPGHOME设置为/tmp/elektra_tests/gpg并且在测试清除期间删除此tmp目录,则应该没问题。

因此,如果将GNUPGHOME设置为/ tmp / elektra_tests / gpg,并且在测试清除期间删除此tmp目录,则应该没问题。

有用! 我将将此修复程序集成到cryptofcrypt测试用例中。 谢谢你的小费!

我有一个可以正常工作的原型。 公关明天来。

应该用#2056修复。 如果问题仍然存在,请重新打开。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

markus2330 picture markus2330  ·  3评论

e1528532 picture e1528532  ·  4评论

sanssecours picture sanssecours  ·  3评论

markus2330 picture markus2330  ·  3评论

mpranj picture mpranj  ·  3评论