在boot2docker中运行的docker容器中没有足够的熵来支持/ dev / random

时间:2014-09-24 15:45:16

标签: docker boot2docker

虚拟化Linux系统中的熵耗尽似乎是一个常见问题(例如/dev/random Extremely Slow?Getting linux to buffer /dev/random)。尽管使用了硬件随机数生成器(HRNG),但经常建议使用像HAVEGED这样的熵收集守护进程。但是,熵收集守护进程(EGD)无法在Docker容器内运行,它必须由主机提供。

使用EGD适用于基于Linux发行版(如Ubuntu,RHEL等)的docker主机。在boot2docker(基于Tiny Core Linux(TCL))中运行这样的守护进程似乎是另一回事。虽然TCL有一个扩展机制,是熵收集守护进程doesn't seem to be available的扩展。

所以EGD似乎是在(生产)托管环境中运行docker容器的合适解决方案,但是如何解决它在boot2docker中进行开发/测试?

由于在boot2docker中运行EGD似乎太难了,我只想使用/ dev / urandom而不是/ dev / random。使用/ dev / urandom不太安全,但对于大多数没有生成长期加密密钥的应用程序仍然可以。至少它应该适用于boot2docker中的开发/测试。

5 个答案:

答案 0 :(得分:45)

我刚刚意识到,将主机上的/ dev / urandom作为/ dev / random挂载到容器中很简单:

$ docker run -v /dev/urandom:/dev/random ...

结果如预期:

$ docker run --rm -it -v /dev/urandom:/dev/random ubuntu dd if=/dev/random of=/dev/null bs=1 count=1024
1024+0 records in
1024+0 records out
1024 bytes (1.0 kB) copied, 0.00223239 s, 459 kB/s

至少我知道如何构建我自己的boot2docker图像; - )

答案 1 :(得分:2)

由于我不想修改我的Docker容器进行开发/测试,我试图修改boot2docker镜像。幸运的是,boot2docker映像是使用Docker构建的,可以很容易extended。所以我已经设置了自己的Docker构建boot2docker-urandom。它使用找到here的udev规则扩展标准boot2docker映像。

构建您自己的boot2docker.iso图像非常简单

$ docker run --rm mbonato/boot2docker-urandom > boot2docker.iso

要替换boot2docker附带的标准boot2docker.iso,您需要:

$ boot2docker stop
$ boot2docker delete
$ mv boot2docker.iso ~/.boot2docker/
$ boot2docker init
$ boot2docker up

修改

但是,来自Docker容器/ dev / random仍然阻止。最有可能的是,因为Docker容器不直接使用主机的/ dev / random,而是使用相应的内核设备 - 它仍然阻塞。

有什么建议吗?

答案 2 :(得分:2)

对于轻量级docker主机,

Alpine Linux可能是更好的选择。高山LXC& docker张图片仅为5mb(而boot2docker为27mb)

我在Alpine上使用haveged LXC来宾&在Debian上为docker位访客。它提供了足够的熵来生成gpg / ssh密钥和&容器中的openssl个证书。 Alpine now has an official docker repo

或者为Tiny Core构建一个haveged包 - 有一个package build system可用。

答案 3 :(得分:2)

另一种选择是安装 rng-tools 包并将其映射为使用/ dev / urandom

  yum install rng-tools
  rngd -r /dev/urandom 

有了这个,我不需要在docker容器中映射任何卷。

答案 4 :(得分:1)

如果在从运行Java应用程序(例如,创建的FROM tomcat:alpine)的自建映像创建的Docker容器中遇到此问题,并且无权访问主机(例如,在托管的k8s集群上) ,您可以在dockerfile中添加以下命令,以使用SecureRandom的非阻塞种子:

RUN sed -i.bak \
  -e "s/securerandom.source=file:\/dev\/random/securerandom.source=file:\/dev\/urandom/g" \
  -e "s/securerandom.strongAlgorithms=NativePRNGBlocking/securerandom.strongAlgorithms=NativePRNG/g" \
  $JAVA_HOME/lib/security/java.security

文件file:/dev/random中的两个正则表达式将file:/dev/urandom替换为NativePRNGBlocking,将NativePRNG替换为$JAVA_HOME/lib/security/java.security,这会导致tomcat在vm上启动得相当快。我尚未检查这是否也可以在非基于Alpine的openjdk图像上使用,但是如果sed命令失败,只需检查容器中文件java.security的位置并相应地调整路径即可。 / p>

注意: 在jdk11中,路径已更改为$JAVA_HOME/conf/security/java.security