如何在Docker容器中使用GnuPG,因为它缺乏熵?

13

我需要将一个apt仓库进行Docker化。其中的软件包需要进行签名,目前是通过以下命令完成的: aptly publish snapshot -distribution="stable" -gpg-key="<key id>" my-snapshot

在此之前需要使用gpg --gen-key命令创建密钥。

但这种方式会导致私钥被创建在Docker镜像内部,这似乎并不是一种好的实践。此外,它甚至无法运行;执行gpg --gen-key --batch <gpg.in 命令会卡住:

Not enough random bytes available.  Please do some other work to give
the OS a chance to collect more entropy! (Need 284 more bytes)

我不知道在Docker容器内生成gpg密钥是否可能,即使可能,这也可能不是一个好主意。

有没有一种方法可以使用外部密钥签署存储库的内容?

4个回答

8

熵不足

Docker没有提供虚拟的/dev/[u]random设备。如果容器中没有足够的熵,那么主机上也没有足够的熵。

检查/proc/sys/kernel/random/entropy_avail的内容,在Docker主机和容器上应该基本相同(如果数字稍有不同,它只是非常频繁地变化,否则请重新检查几次)。

可能的原因:

  • 在虚拟机中运行docker主机,例如由于boot2docker或自建虚拟机。只需确保在虚拟机内获得更多的熵,havegd是开发者机器的一个很好的解决方案,但可能不适用于生产环境。
  • 另一个容器/应用程序正在使用所有的熵。找出哪个容器/应用程序并中断/终止它,或生成更多的熵。
  • 通常你没有足够的熵。做一些工作(鼠标/键盘移动,硬盘I/O)。

外部生成密钥对

无论如何,更合理的方法可能是在真实机器上生成密钥,并仅将(私有)子密钥移动到服务器上。这样,您可以每隔一段时间交换子密钥(以防被攻击)。阅读What is a good general purpose GnuPG key setup?,了解设置OpenPGP密钥时需要考虑的不同事项。

在构建Docker镜像时,使用COPY将文件复制到机器中,然后在Dockerfile中使用gpg --import导入它。之后,它可用的方式与使用gpg --gen-key在容器内生成它完全相同。


我导入了在主机上生成的密钥,用它签署了仓库,然后删除了 .gnupg 目录。 - Michael Ivko
在删除时,请注意不同的层以及私钥可能并没有_实际_被删除,只是隐藏了。 - Jens Erat

3
我通过在连接生成 gpg 密钥的 Docker 容器时 ping 一些网站,成功大幅加快了熵生成的速度。
$ docker exec -it blimp_mailpilekermit_1 bash
mailpile@mailpile-kermit:~$ ping google.com &
mailpile@mailpile-kermit:~$ ping cloudfleet.io &
mailpile@mailpile-kermit:~$ cat /proc/sys/kernel/random/entropy_avail
757

这让 gpg 进程相对快速地生成了一个2048位的密钥。

1
docker build之外,在与您的Dockerfile相同的目录树中生成密钥。然后,您可以将密钥ADD到映像中,并且它将可用于aptly。请记住,此映像现在包含私有GPG密钥,因此需要像该密钥一样保持私有。
如果您想在运行的容器内使用密钥(而不是在构建图像时),请使用-v标志将密钥文件挂载到映像中。(这允许您发布图像而不发布您的私钥。)

0

从另一台主机对外部接口进行洪水ping操作也会向池中添加熵。

例如:ping -f $EXTERNALIP

需要以root身份运行,最好不要在您关心的网络上执行此操作。


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