如何使用 Haveged 为云服务器设置附加熵
熵和随机性简介
Linux 伪随机数生成器 (PRNG) 是一种特殊设备,它通过硬件中断(键盘、鼠标、磁盘/网络 I/O)和其他操作系统源生成随机数。这种随机数主要用于 SSL/TLS 等加密,但也有许多其他用途。即使是像掷一对虚拟骰子这样简单的程序,也依赖于熵来实现高质量的随机数。
当熵池干涸时
Linux 上有两个通用随机设备:/dev/random 和 /dev/urandom。最佳随机性来自 /dev/random,因为它是一个阻塞设备,并且会等到有足够的熵才继续提供输出。假设您的熵足够,您应该从 /dev/urandom 看到相同质量的随机性;但是,由于它是一个非阻塞设备,它将继续产生“随机”数据,即使熵池耗尽。这可能会导致随机数据质量较低,因为重复以前的数据的可能性更大。当生产服务器上的可用熵不足时,可能会发生很多糟糕的事情,尤其是当该服务器执行加密功能时。例如,假设您有一个云服务器运行以下守护程序(全部使用 SSL/TLS 或分组密码):
- Web 服务器
- 接收/发送邮件服务器
- SSH/SFTP
如果当所有可用熵都已耗尽时,这些守护进程中的任何一个需要随机性,它们可能会暂停以等待更多,这可能会导致您的应用程序出现过度延迟。更糟糕的是,由于大多数现代应用程序要么诉诸于使用在程序初始化时创建的自己的随机种子,要么诉诸于使用 /dev/urandom 来避免阻塞,您的应用程序将受到随机数据质量较低的影响。这可能会影响您的安全通信的完整性,并可能增加您的私人数据被密码分析的机会。
填充熵池的用户空间解决方案
Linux 已经从上述硬件源获得了非常高质量的随机数据,但由于无头机通常没有键盘或鼠标,因此产生的熵要少得多。磁盘和网络 I/O 代表了这些机器的大部分熵生成源,它们产生的熵非常稀疏。由于很少有无头机(如服务器或云服务器/虚拟机)具有任何专用的硬件 RNG 解决方案,因此存在几种用户空间解决方案,可以使用比硬盘“更嘈杂”的设备(如视频卡、声卡等)的硬件中断来生成额外的熵。不幸的是,这再次证明是服务器的问题,因为它们通常不包含任何一种。进入 haveged。基于 HAVEGE 原理,并且之前基于其相关库,haveged 允许根据处理器上代码执行时间的变化生成随机性。由于一段代码几乎不可能花费完全相同的时间来执行,即使在相同的硬件上的相同环境中,运行一个或多个程序的时间应该适合播种随机源。 haveged 实现在重复执行循环后使用处理器时间戳计数器 (TSC) 的差异来为系统的随机源 (通常是 /dev/random) 播种。虽然这听起来应该最终会创建可预测的数据,但您可能会惊讶地看到本文底部的 FIPS 测试结果。
在 Debian/Ubuntu 上安装 haveged
您可以通过运行以下命令在 Debian 和 Ubuntu 上轻松安装 haveged:
# apt-get install haveged
如果此包在您的默认存储库中不可用,您将需要从源代码进行编译(见下文)
一旦安装了软件包,您就可以简单地编辑位于 /etc/default/haveged 的配置文件,确保设置了以下选项(通常已经是默认选项):
DAEMON_ARGS="-w 1024"
最后,只需确保它配置为在启动时启动:
# update-rc.d haveged defaults
在 RHEL/CentOS/Fedora 上安装 haveged
要在 RHEL/CentOS 上安装 haveged(Fedora 跳过此步骤),首先需要按照官方网站上的说明添加 EPEL 存储库。
一旦安装并启用了 EPEL repo(在 RHEL/CentOS 上),就可以通过运行以下命令来安装 haveged:
# yum install haveged
Fedora 用户可以运行上述 yum install 命令,无需更改存储库。默认选项通常没问题,因此只需确保将其配置为在启动时启动:
# chkconfig haveged on
从源代码安装
在没有预打包二进制文件的系统中,您需要从源码包构建它。这实际上比您想象的要容易得多。首先,您将访问下载页面并选择最新版本的 tarball(撰写本文时为 1.7a)。下载 tarball 后,将其解压到您当前的工作目录中:
# tar zxvf /path/to/haveged-x.x.tar.gz
现在编译并安装:
# cd /path/to/haveged-x.x # ./configure # make # make install
默认情况下,它将以 /usr/local 为前缀进行安装,因此您应该在 /etc/rc.local(或系统等效文件)中添加类似以下内容,以使其在启动时自动启动(如果需要,请调整路径):
# Autostart haveged /usr/local/sbin/haveged -w 1024
手动运行相同的命令(以 root 身份)以启动守护进程而无需重新启动,或者如果您是 Windows 用户,则只需重新启动。
测试随机数据熵和质量的可用性
经过一些非常简单的安装/配置工作后,您现在应该已经安装了 haveged,并且您的系统的熵池应该已经充满了它产生的随机性。如果您盲目地信任他人及其有效性声明,那么安全性就不安全了,那么为什么不使用标准测试来测试您的随机数据呢?对于此测试,我们将使用 rngtest 使用的 FIPS-140 方法,该方法在大多数或所有主要 Linux 发行版中都可用,以各种软件包名称提供,例如 rng-tools:
# cat /dev/random | rngtest -c 1000
您应该看到类似以下内容的输出:
rngtest 2-unofficial-mt.14 Copyright (c) 2004 by Henrique de Moraes Holschuh This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. rngtest: starting FIPS tests... rngtest: bits received from input: 20000032 rngtest: FIPS 140-2 successes: 999 rngtest: FIPS 140-2 failures: 1 rngtest: FIPS 140-2(2001-10-10) Monobit: 0 rngtest: FIPS 140-2(2001-10-10) Poker: 0 rngtest: FIPS 140-2(2001-10-10) Runs: 1 rngtest: FIPS 140-2(2001-10-10) Long run: 0 rngtest: FIPS 140-2(2001-10-10) Continuous run: 0 rngtest: input channel speed: (min=1.139; avg=22.274; max=19073.486)Mibits/s rngtest: FIPS tests speed: (min=19.827; avg=110.859; max=115.597)Mibits/s rngtest: Program run time: 1028784 microseconds
任何随机数生成器都可接受极少量的失败,但使用 haveged 时,你经常会看到 998-1000 次成功。
要测试可用熵的数量,可以运行以下命令:
# cat /proc/sys/kernel/random/entropy_avail
haveged 的想法是,只要可用位接近 1024,就重新填充该池。因此,虽然这个数字会波动,但除非您确实要求大量随机性(SSH 密钥生成等),否则它不应该低于 1000 左右。