认识rngd(熵服务)

Scroll Down

认识rngd(熵服务)

在阿里云的tomcat下部署了一个Java服务,启动正常但是访问速度巨慢,刚开始还以为是webapps下有其他项目的原因,删除后就剩一个项目访问也是巨慢,看日志项目中SQL处理都是毫秒级。随Google了一下,最终调节了rngd(熵服务)大小,访问速度有了巨大提高。

从维基百科和[智库](https://wiki.mbalib.com/wiki/%E9%A6%96%E9%A1%B5,得知信息熵和随机数:

信息熵

​ 什么是熵?在物理学中,熵(entropy)是一个描述系统混乱程度的物理量,熵越大说明系统越无序、越混乱,不确定性越大。简单来说就是表示系统中混乱(无序)的程度。

​ 那么什么是信息熵?信息熵是描述信息的复杂程度,信息克服了多大的不确定性。信息熵是一个数学上颇为抽象的概念,在这里不妨把信息熵理解成某种特定信息的出现概率(离散随机事件的出现概率)。一个系统越是有序,信息熵就越低;反之,一个系统越是混乱,信息熵就越高。信息熵也可以说是系统有序化程度的一个度量

随机数

​ 在Linux内核中采用熵来描述数据的随机性。为了能产生足够高效随机数,Linux系统维护了一个专门用于收集噪声的熵池(entropy pool),熵池的信息来自外界的熵信息 如:设备驱动的噪音,鼠标点击的声音,设备风扇运作的噪音。将这些噪声收集起来被用于产生真正的随机数。如果熵池中没有足够的噪音资源,就需要等待熵池的收集。只要设备的物理混乱程度越大,熵增就越快,熵池的信息越饱和,随机性的效率就越高。

在测试机(CentOS7.6)中,/dev/random 是 Linux/Unix 操作系统中的一个设备文件,用来作为随机数发生器/伪随机数发生器。它允许程序访问来自设备驱动程序或其它来源的背景噪声,Linux是第一个以背景噪声产生真正的随机数的实现。这种设计使得/dev/random是真正的随机数发生器,提供了最大可能的随机数据熵。因为它是真正以熵池的背景噪音为种子产生随机数,所以在调用时可能会有堵塞,需要等待熵池有足够多的熵信息。

通过命令查看熵池大小:

一般如果服务器访问的速度很慢,这个服务器熵池的值也会很小;

cat /proc/sys/kernel/random/entropy_avail

发现熵池大小都是在30左右浮动,这样势必会导致tomcat从/dev/random读取随机数时产生了阻塞。通过这样的特点,一些攻击也可以通过这些来实现,不断的使用需要读取随机数的地方消耗系统的熵池,造成系统的阻塞。虽然说在Linux中使用/dev/urandom伪随机数生成设备也能在熵池较小的情况下完成随机数的生成,但是并没有使用/dev/random真随机数安全。

优化熵池

安装rngd(熵服务)

在CentOS6.5下

yum install rng-tools
使服务自启动
systemctl enable rngd.service
启动服务
systemctl start rngd.service
编辑配置
cp /usr/lib/systemd/system/rngd.service /etc/systemd/system
vim /etc/systemd/system/rngd.service
#将ExecStart=/sbin/rngd -f 为ExecStart=/sbin/rngd -f -r /dev/urandom
重载服务
systemctl daemon-reload
systemctl restart rngd.service
重新查看熵池
cat /proc/sys/kernel/random/entropy_avail

总结

​ 修改熵服务参数后,现在熵池大小在3000上下,访问速度和启动速度都有很大程度提高。