如何让 /dev/random 在 Ubuntu 虚拟机上运行?

如何让 /dev/random 在 Ubuntu 虚拟机上运行?

显然,/dev/random 基于硬件中断或物理硬件的类似不可预测方面。由于虚拟机没有物理硬件,因此cat /dev/random在虚拟机中运行不会产生任何结果。我使用 Ubuntu Server 11.04 作为主机和客户机,并使用 libvirt/KVM。

我需要在虚拟机内设置 Kerberos,但krb5_newrealm由于系统没有生成任何数据,因此一直挂起“加载随机数据”。

有人知道如何解决这个问题吗?是否可以将主机的 /dev/random(非常繁琐)传递到虚拟机中,以便虚拟机可以使用其随机数据?

我读到过有一些软件替代品,但它们不适合密码学,因为它们不够随机。

编辑:看来虚拟机上的 cat /dev/random 确实会产生输出,只是速度非常非常慢。我等待了大约两个小时,在它“加载随机数据”时设置了我的领域。最终它得到了足够的数据可以继续。不过,我仍然对加速这一过程的方法感兴趣。

答案1

它应该“正常工作”。即使虚拟机没有专用的物理硬件,它仍然可以访问几个非常好的随机源。例如,它可以使用 CPU 的 TSC 来计时从虚拟磁盘读取的时间,最终将物理磁盘计时到十亿分之一秒。这些计时取决于硬盘中的湍流气流剪切,这是不可预测的。

类似的逻辑也适用于网络流量。即使接口是虚拟化的,只要数据包源自物理网络(而不是盒子本地的,比如源自另一个虚拟机),数据包时序就取决于网卡上的晶体振荡器和驱动 TSC 的晶体振荡器之间的相位偏移。这取决于两个石英晶体中的微观区域温度变化。这也是不可预测的。

如果由于某种原因它不起作用,最简单的解决方案是编写一个程序来挖掘熵并将其添加到系统池中。网络接口是你最可靠的来源。例如,你可以编写代码来:

1)查询TSC。

2) 向已知不在同一台物理机器上的服务器发出 DNS 查询。

3)查询完成时查询TSC。

4)重复此操作几次,累积所有 TSC 值。

5)对累积的TSC函数执行安全哈希运算。

6)将安全哈希函数的输出传递到系统的熵池。

7) 监控熵池水平,并等待其降低。当它降低时,返回步骤 1。

Linux 有简单的 IOCTL 调用来将熵添加到池中、检查池的级别等等。您可能有rngd,它可以从管道中获取熵并将其提供给系统池。您可以从任何您想要的源填充管道,无论是 TSC 还是来自您自己的熵源的“wget”请求。

答案2

我在所有执行加密操作(例如 TLS 握手、kerberos 等)的无头服务器上都使用 haveged。它应该在大多数 Ubuntu 版本的软件包存储库中:http://packages.ubuntu.com/search?keywords=haveged&searchon=names&suite=all§ion=all

haveged 使用 HAVAGE 算法从现代处理器的内部状态中提取熵。下面是深入的解释: http://www.irisa.fr/caps/projects/hipsor/

您可以使用 ent 包检查生成的熵的随机性。在我的系统上,haveged 生成的熵通过了 ent 的所有随机性测试

答案3

是的,你可以从以下地址获取种子:

http://manpages.ubuntu.com/manpages/jaunty/man4/random.4.html

您只需将其放入 /dev/urandom 中,它就会为熵池提供种子。我可以通过以下方式确认这一点:

root@mx01-ewr:/proc/sys/kernel/random# cat entropy_avail 
128
root@mx01-ewr:/proc/sys/kernel/random# cat /dev/xvda >/dev/urandom  &
[1] 16187 # just using this as a source of data, you could do ssh hostIP 'cat /dev/random' >... etc
root@mx01-ewr:/proc/sys/kernel/random# cat entropy_avail 
1221
root@mx01-ewr:/proc/sys/kernel/random# cat entropy_avail 
1398

如果您让 ssh 命令通过路由器,它会产生熵,从而获得奖励*:)

答案4

X86 的答案是确保您的 VM 不会捕获 RdRand 或 RdSeed。您信任您的 VM 可以做很多事情,这是其中之一。

在 Snady Bridge CPU 上,足够新的 RNGd 将(或可以被告知)使用 RdRand 或 RdSeed,而未被捕获的 RdRand 或 RdSeed 将熵带入 VM。/dev/random 然后与真实的(而非虚拟的)熵源一起工作。

这不是偶然的。它就在英特尔架构文档中。

对于基于设备的硬件熵源(即使用内核驱动程序来共享它),您需要 VM 来正确虚拟化物理源。我不知道他们是否这样做,如果是,针对哪些设备。

如果您的 RNGd 没有下面的 drng 选项,请更新它。如果您的硬件没有快速的硬件 RNG,那么您就完蛋了,您应该考虑使用不同的硬件以确保安全。

# rngd --help
Usage: rngd [OPTION...]
Check and feed random data from hardware device to kernel entropy pool.

  -b, --background           Become a daemon (default)
  **-d, --no-drng=1|0          Do not use drng as a source of random number input**
                             (default: 0)
  -f, --foreground           Do not fork and become a daemon
  -n, --no-tpm=1|0           Do not use tpm as a source of random number input
                             (default: 0)
  -o, --random-device=file   Kernel device used for random number output
                             (default: /dev/random)
  -p, --pid-file=file        File used for recording daemon PID, and multiple
                             exclusion (default: /var/run/rngd.pid)
  -q, --quiet                Suppress error messages
  -r, --rng-device=file      Kernel device used for random number input
                             (default: /dev/hwrng)
  -s, --random-step=nnn      Number of bytes written to random-device at a time
                             (default: 64)
  -v, --verbose              Report available entropy sources
  -W, --fill-watermark=n     Do not stop feeding entropy to random-device until
                             at least n bits of entropy are available in the
                             pool (default: 2048), 0 <= n <= 4096
 -?, --help                 Give this help list
  --usage                Give a short usage message
  -V, --version              Print program version

Mandatory or optional arguments to long options are also mandatory or optional
for any corresponding short options.

Report bugs to Jeff Garzik <[email protected]>.

相关内容