显然,/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]>.