如何在Docker容器中使用GnuPG,因为它缺less熵?
我需要dockerize一个apt库。 其中的软件包需要进行签名,目前通过aptly publish snapshot -distribution="stable" -gpg-key="<key id>" my-snapshot
在此之前,需要使用gpg --gen-key
创buildgpg --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密钥,即使它是,也不是一个好主意。
有没有办法通过外部密钥签署回购的内容?
缺less熵
Docker不提供虚拟/dev/[u]random
设备。 如果容器中没有足够的熵,则主机上的熵不足。
检查/proc/sys/kernel/random/entropy_avail
,它们在Docker主机和容器上应该几乎相同(如果数量略有不同,它只是非常频繁地更改,否则重新检查几次)。
可能的原因:
- 在虚拟机中运行
boot2docker
主机,例如由于boot2docker
或自build的虚拟机。 只要确保在虚拟机中获得更多熵,havegd
对开发人员havegd
是一个非常简单的解决scheme,但可能不适合生产。 - 另一个容器/应用程序正在使用所有的熵。 实现哪一个,中断/终止它,还是生成更多的熵。
- 你通常没有足够的熵。 做一些工作(鼠标/键盘移动,(硬盘)I / O)。
从外部生成一个密钥对
无论如何,在真机上生成一个密钥可能更合理,而且只能将(私有) 子密钥移动到服务器。 这样,你可以不时地交换子密钥(以防万一)。 阅读什么是一个很好的通用GnuPG密钥设置? 了解设置OpenPGP密钥时需要考虑的不同事项。
在构buildDocker镜像时,使用COPY
将文件导入机器,然后使用gpg --import
将其导入到Dockerfile中。 之后,如果使用gpg --gen-key
在容器内生成它,它的使用方式与之前的方法完全相同。
在Dockerfile
docker build
之外生成密钥,在Dockerfile
的同一目录树内。 然后,您可以将图像ADD
到图像中,并可以正确使用。 请记住,这个图像现在包含一个私人的GPG密钥,所以它需要像保持密钥一样保持私密。
如果您想在正在运行的容器中使用密钥(而不是在构build映像时),请使用-v
标志将密钥文件安装到映像中。 (这允许您发布您的图像,而不公布您的私钥。
我设法通过在连接到正在生成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
需要成为根,最好不要在你关心的networking上这样做。