在Docker中如何处理对/ dev /(u)random等的请求?

时间:2018-10-08 09:29:38

标签: linux docker random linux-kernel

出于文档目的在我们的项目中,我正在寻找以下信息:

我们正在使用Docker部署各种需要对SSL / TLS和其他内容进行加密的应用程序。这些应用程序可能使用/ dev / random,/ dev / random,getrandom(2)等。我想知道如何在Docker容器中处理这些请求,而不是一台运行所有服务的虚拟机(并访问一个共享的熵)来源)。

到目前为止,我(逐步)研究了libcontainer和runC。不幸的是,尽管我确实有种直觉,认为这些请求已传递到主机上的等效调用,但我仍未找到问题的答案。

您能否带我找到任何支持此声明的文档,或者我弄错了,而这些请求的处理方式实际上不同?

1 个答案:

答案 0 :(得分:2)

泊坞窗容器是“类固醇上的chroot”。无论如何,所有docker容器和主机系统之间的内核都是相同的。因此,所有内核调用都共享同一内核。

因此,我们可以在主机上(作为根目录在任何文件夹中)进行操作:

mknod -m 444 urandom_host c 1 9

以及在某些Linux chroot中:

wget <alpine chroot> | tar -x <some folder>
chroot <some folder>
mknod -m 444 urandom_in_chroot c 1 9

我们可以做到

docker run -ti --rm alpine sh -l
mknod -m 444 urandom_in_docker c 1 9

然后,任何程序对所有open(2)read(2)urandom_in_docker进行的所有调用urandom_in_chrooturandom_host都将进入同一内核,进入同一内核{ {1}}模块绑定到主要数字1和次要数字9的特殊字符文件,该文件根据this list随机数生成器。

对于虚拟机,内核是不同的(如果根本没有内核)。因此,对任何块/特殊字符文件的所有调用都由不同的内核转换(也可能使用不同的虚拟化架构和不同的指令集)。从主机可以将虚拟机视为单个进程(取决于实现),如果虚拟化的系统/程序调用/ dev / urandom,则该进程可以/可以不调用主机/ dev / urandom。在虚拟化中,任何事情都可能发生,而这取决于特定的实现。

因此,对Docker中对/ dev / urandom的请求的处理方式与在主机上相同。内核中如何处理urandom,也许here是一个好的开始。

如果您需要熵,请确保使用并安装Haveged。