如何使用Haveged为云服务器设置额外的熵
熵和随机性简介
Linux 伪随机数生成器 (PRNG) 是一种特殊设备,可从硬件中断(键盘、鼠标、磁盘/网络 I/O)和其他操作系统源中生成随机性。 这种随机性主要用于 SSL/TLS 等加密,但也有许多其他用途。 即使像掷一对虚拟骰子这样简单的程序也依赖于熵来获得高质量的随机性。
当熵池干涸时
Linux 上有两种通用的随机设备:/dev/random 和 /dev/urandom。 最好的随机性来自 /dev/random,因为它是一个阻塞设备,并且会等到足够的熵可用以继续提供输出。 假设您的熵足够,您应该从 /dev/urandom 看到相同质量的随机性; 然而,由于它是一个非阻塞设备,它会继续产生“随机”数据,即使熵池用完了。 这可能会导致随机数据质量较低,因为重复先前数据的可能性更大。 当生产服务器上的可用熵低时,可能会发生很多不好的事情,尤其是当该服务器执行加密功能时。 例如,假设您有一个运行以下守护进程的云服务器(全部使用 SSL/TLS 或分组密码):
- 网络服务器
- 收/发邮件服务器
- SSH/SFTP
当所有可用的熵都用尽时,如果这些守护进程中的任何一个需要随机性,它们可能会暂停以等待更多,这可能会导致您的应用程序过度延迟。 更糟糕的是,由于大多数现代应用程序要么使用在程序初始化时创建的自己的随机种子,要么使用 /dev/urandom 来避免阻塞,因此您的应用程序将受到质量较低的随机数据的影响。 这可能会影响您的安全通信的完整性,并可能增加对您的私人数据进行密码分析的机会。
填充熵池的用户态解决方案
Linux 已经从上述硬件源中获得了非常优质的随机数据,但是由于无头机器通常没有键盘或鼠标,因此产生的熵要少得多。 磁盘和网络 I/O 代表了这些机器的大部分熵生成源,它们产生的熵非常稀疏。 由于很少有无头机器(如服务器或云服务器/虚拟机)有任何类型的专用硬件 RNG 解决方案可用,因此存在几种用户态解决方案来使用来自比硬盘“更嘈杂”的设备(如显卡)的硬件中断来生成额外的熵,声卡等 不幸的是,这再次证明是服务器的一个问题,因为它们通常不包含任何一个。 进入已经。 基于 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 存储库(在 RHEL/CentOS 上)后,您可以通过运行以下命令来安装 haveged:
# yum install haveged
Fedora 用户无需更改存储库即可运行上述 yum install 命令。 默认选项通常很好,因此只需确保将其配置为在启动时启动:
# chkconfig haveged on
从源安装
在根本没有任何可用于 haveged 的预打包二进制文件的系统上,您需要从源代码 tarball 构建它。 这实际上比您预期的要容易得多。 首先,您将访问 下载页面 并选择最新版本的 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-kinda-guy,则只需重新启动。
测试熵的可用性和随机数据的质量
在一些非常小的安装/配置工作之后,您现在应该可以正常安装 hasged,并且您的系统的熵池应该已经从它产生的随机性中填满了。 如果您盲目地信任他人及其有效性声明,那么安全就不会是安全,那么为什么不使用标准测试来测试您的随机数据呢? 对于此测试,我们将使用 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 时重新填充此池。 所以虽然这个数字会波动,但它不应该低于 1000 左右,除非你真的需要大量的随机性(SSH 密钥生成等)。