如何使/ dev / random在Ubuntu虚拟机上工作?


19

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

我需要在VM内设置Kerberos,但krb5_newrealm由于系统未生成任何文件,因此它会永久挂起“加载随机数据”。

有谁知道如何解决这个问题?是否可以将主机的/ dev / random(非常随意)传递给vm,以便vm可以使用其随机数据?

我读过一些软件替代品,但是它们对于密码学不是很好,因为它们不够随机。

编辑:看来,vm上的cat / dev / random确实会产生输出,只是非常非常缓慢。我等待大约两个小时,即“正在加载随机数据”,从而完成了领域设置。最终,它足够继续。我仍然对加快这一过程的方法感兴趣。

Answers:


10

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

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

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

1)查询TSC。

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

3)查询完成后,查询TSC。

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

5)对累积的TSC功能执行安全哈希。

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

7)监视熵池级别,然后等待其变低。如果是,请返回步骤1。

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


从理论上来说,您的第二个建议似乎很有趣,但是我希望找到一种不涉及编程的解决方案。我想知道从USB驱动器向主机复制大文件还是从主机复制大文件会影响vm的熵池(即使其工作更快)?如果是这样,我可以尝试在主机上运行计算机映像的备份时创建自己的领域……
Nick

1
您可以进行一些测试,以查看是什么补充了熵池。一旦找到有效的方法,就可以做到。网络流量应该做到这一点。驱动器活动应该做到这一点。您可以测试一下该命令的作用:cat /proc/sys/kernel/random/entropy_avail任何增加的工作。
大卫·史瓦兹

请记住,正在运行的猫“吃掉”了熵(地址空间的随机化)。您可以使用python -c 'while True: import time; print str(time.sleep(1))[0:0] + open("/proc/sys/kernel/random/entropy_avail", "rb").read(),'。是的,这很难看懂,但是我看不到在评论中输入新行的方法……
Doncho Gunchev 2013年

10

我在所有执行加密操作的无头服务器(例如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包检查生成的熵的随机性。在我的系统上,haved产生的熵通过ent的所有随机性测试


您还需要运行NIST测试套件以确保。
迈克尔·汉普顿

7

是的,您可以从以下渠道播种:

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命令通过路由器,则它会产生熵* :),这会带来额外的好处。


我对中间部分感到困惑。我的系统上没有“ / dev / xvda”。使用ssh将主机的/ dev / random路由到vm的/ dev / urandom是目标吗?我可以将我想要的任何内容发送到“ / dev / urandom”中,并且它来自“ / dev / random”吗?
尼克,

我可以使用“ ssh 192.168.1.1'cat / dev / random'”从主机获取随机数据,但是我不知道如何使其影响来宾“ / dev / random”。“ ssh 192.168.1.1'cat / dev / random'> / dev / urandom”似乎没有任何作用。
尼克,

我只是通过在一个终端上运行'cat / dev / random'并等待直到它停止输出数据来进行测试。然后在另一个目录中我执行了“ cat somerandomfile> / dev / urandom”,然后慢慢地,“ cat / dev / random”开始再次输出内容。看起来您需要在/ dev / urandom上进行大量随机输入,以进行有价值的/ dev / random输入。您是说在做猫...'> / dev / urandom时,在/ dev / random上根本看不到任何输出吗?
多项式

我最终会看到一些输出,但是非常慢。我不确定它是否超过自然产生的东西。我发现在虚拟机中生成非常缓慢且少量的随机数据,这将永远耗时。将其放置并“收集随机数据”大约2小时后,便创建了我的领域。
尼克,

+1为有用的答案。
尼克,

5

这对我有用

在VM中运行krb5_newrealm可能需要很长时间才能完成(显示“正在加载随机数据”消息之后)。您可以使用以下技巧来加快速度。

$ sudo aptitude install rng-tools -y
$ sudo rngd -r /dev/urandom -o /dev/random  # don't do this in production!

发表在http://fossies.org/linux/john/doc/Kerberos-Auditing-HOWTO.md


1

X86的答案是确保您的VM不会捕获RdRand或RdSeed。您对VM信任很多,这就是其中之一。

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

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

对于基于设备的硬件熵源(IE使用内核驱动程序来共享它),您需要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 <jgarzik@pobox.com>.

0

我也有krb5_newrealm挂起的问题。根据上述答案,这对我来说效果很好:

cat /dev/sda > /dev/urandom

处理完随机数据后,您可能想杀死它。/ dev / sda可能具有比您需要的更多数据。

注意:我不确定以这种方式生成的随机数据实际上有多随机。


请使用张贴者的名字参考其他帖子。说“上”或“下”是没有意义的,因为您我们看到的帖子并不完全相同。
约翰·加迪尼尔

4
这可能有效,但是/ dev / sda包含许多非随机数据(至少为零),这从安全性的角度来看并不理想。除了零以外,它还以MBR开头,实际上这是非常可预测的,我可以猜测至少3个字节...否则它将无法启动;)
Doncho Gunchev
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.