虚拟化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中的开发/测试。
答案 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