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

时间:2015-06-01 12:47:08

标签: docker gnupg entropy openpgp

我需要对apt存储库进行docker化。其中的包需要签名,目前已完成 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密钥,即使它是,也可能不是一个好主意。

有没有办法通过外部密钥签署回购的内容?

4 个答案:

答案 0 :(得分:3)

缺少熵

Docker 提供虚拟/dev/[u]random设备。如果你的容器中没有足够的熵,你就没有足够的熵。

检查/proc/sys/kernel/random/entropy_avail的内容,它们在Docker主机和容器上应该几乎相同(如果数量略有不同,它只是经常更改,否则重新检查几次)。

可能的原因:

  • 在虚拟机中运行docker host,例如由于boot2docker或自构造的虚拟机。只需确保在虚拟机中获得更多熵,havegd对于开发人员计算机来说是一个非常简单的解决方案,但可能不适合生产。
  • 另一个容器/应用程序正在耗尽所有熵。实现哪一个并中断/终止它,或生成更多的熵。
  • 你通常没有足够的熵。做一些工作(鼠标/键盘移动,(硬)磁盘I / O)。

外部生成密钥对

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

在构建Docker镜像时,使用COPY将文件放入计算机,然后在Dockerfile中gpg --import。之后,如果您使用gpg --gen-key在容器内生成它,它的完全相同。

答案 1 :(得分:2)

我设法通过在连接到生成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位密钥。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

泛洪ping外部接口(来自其他主机)也会将熵添加到池中。

例如。 ping -f $ EXTERNALIP

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