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

mbo*_*ato 51 docker boot2docker

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

使用EGD适用于基于Linux发行版(如Ubuntu,RHEL等)的docker主机.在boot2docker中运行这样的守护进程 - 基于Tiny Core Linux(TCL) - 似乎是另一个故事.尽管TCL具有扩展机制,但是熵收集守护程序的扩展似乎不可用.

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

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

mbo*_*ato 50

我刚刚意识到,从主机/ dev/urandom到容器中挂载/ dev/urandom很简单:

$ docker run -v /dev/urandom:/dev/random ...
Run Code Online (Sandbox Code Playgroud)

结果如预期:

$ 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
Run Code Online (Sandbox Code Playgroud)

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

  • "事实:/ dev/urandom是类UNIX系统上加密随机性的首选来源." http://www.2uo.de/myths-about-urandom/ (10认同)
  • 谁在乎安全? (9认同)
  • 在开发机器上使用/ dev/urandom而不是/ dev/random对安全性的影响应该非常有限. (2认同)
  • 跨平台兼容性如何?对于那些运行Windows的穷人呢? (2认同)

Ole*_*ets 13

我发现最优雅的解决方案是在单独的容器中运行Haveged:

docker pull harbur/haveged
docker run --privileged -d harbur/haveged
Run Code Online (Sandbox Code Playgroud)

检查是否有足够的熵可用:

$ cat /proc/sys/kernel/random/entropy_avail
2066
Run Code Online (Sandbox Code Playgroud)


Ale*_*les 5

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

  yum install rng-tools
  rngd -r /dev/urandom 
Run Code Online (Sandbox Code Playgroud)

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

  • 这给了我这条消息:`无法调整 write_wakeup_threshold:只读文件系统` (3认同)
  • 在 docker 主机上运行它,而不是在容器中运行。 (3认同)

mbo*_*ato 3

由于我不喜欢修改 Docker 容器以进行开发/测试,因此我尝试修改 boot2docker 映像。幸运的是,boot2docker 镜像是使用 Docker 构建的,并且可以轻松扩展。所以我设置了自己的 Docker build boot2docker-urandom它使用此处找到的 udev 规则扩展了标准 boot2docker 映像。

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

$ docker run --rm mbonato/boot2docker-urandom > boot2docker.iso
Run Code Online (Sandbox Code Playgroud)

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

$ boot2docker stop
$ boot2docker delete
$ mv boot2docker.iso ~/.boot2docker/
$ boot2docker init
$ boot2docker up
Run Code Online (Sandbox Code Playgroud)

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