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

How to use GnuPG inside Docker containers, as it is missing entropy?

我需要docker调整 apt 存储库。其中的包需要签名,目前由 aptly publish snapshot -distribution="stable" -gpg-key="<key id>" my-snapshot

在此之前需要使用 gpg --gen-key.

创建密钥

但这样私钥将被装箱在 docker 图像中,这似乎不是一个好的做法。此外, id 甚至不起作用; 运行 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 密钥,即使可以,也可能不是一个好主意。

有没有办法通过外部密钥对 repo 的内容进行签名?

docker build 之外,在与 Dockerfile 相同的目录树中生成密钥。然后您可以 ADD 图像的密钥,aptly 就可以使用它。请记住,此图像现在包含一个 GPG 私钥,因此需要像您对该密钥一样保密。

如果您想在 运行 容器中使用密钥(而不是在构建映像时使用),请使用 -v 标志将密钥文件装载到映像中。 (这允许您在不发布私钥的情况下发布图像。

熵缺失

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

检查/proc/sys/kernel/random/entropy_avail的内容,在Docker宿主机和容器上应该是差不多的(如果数字略有不同,只是变化很频繁,否则重新检查一个几次)。

可能原因:

  • 运行虚拟机中的docker主机,比如因为boot2docker或者自建虚拟机。只需确保在虚拟机中获得更多熵,havegd 是开发人员机器的一个非常简单的解决方案,但可能不适合生产。
  • 另一个 container/application 正在耗尽所有熵。实现哪一个和interrupt/terminate它,或者产生更多的熵。
  • 你通常没有足够的熵。做一些工作(mouse/keyboard 移动,(硬盘)磁盘 I/O).

外部生成密钥对

反正在真机上生成密钥,只移动一个(私有)子密钥到服务器可能更合理。这样,您就可以时不时地交换子密钥(以防它被泄露)。阅读 What is a good general purpose GnuPG key setup? 了解设置 OpenPGP 密钥时要考虑的不同事项的介绍。

在构建 Docker 图像时,使用 COPY 将文件导入机器,然后 gpg --import 将其放入 Docker 文件中。之后,它的可用方式与使用 gpg --gen-key.

在容器内生成它的方式完全相同

我在连接到生成 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 位密钥的生成。

泛洪 ping 外部接口(从另一台主机)也会将熵添加到池中。

例如。 ping -f $EXTERNALIP

需要成为 root 用户,最好不要在您关心的网络上执行此操作。