最近碰到了个颇有意思的问题,springboot加载多数据源,遇到了在启动时数据库链接报错的问题。
报错信息:php
The error occurred while executing a queryjava
而后找到了一篇文章,linux熵池耗尽linux
在jvm启动参数里加上数据库
-Djava.security.egd=file:/dev/./urandom
就ok了。安全
但是这是为何呢?springboot
由于相同环境的多台机器,有些机器有问题,有些机器没问题,排查这个问题耗费了很长时间。
是虚拟机致使的吗?服务器
能够看到,上面那篇博文里是怎么说的:oracle
在无头服务器中,用于(java)应用程序链接的11g JDBC驱动程序可能会形成麻烦。
缘由是JDBC 11g须要大约40个字节的安全随机数,从/ dev / random收集,以加密其链接字符串。dom
为何这个神秘的“熵池”耗尽了随机数?
咱们先去看看。
首先是正常的服务器,执行以下命令:
cat /proc/sys/kernel/random/entropy_avail cat /proc/sys/kernel/random/poolsize
接着是报错的那台机器:
为何entropy_avail就只有189呢?是这个缘由吗?
为何只有189就不能用了呢?
再来看看这篇文章
https://jarfield.iteye.com/blog/1739834
再回来看看oracleJDBC,原来默认状况下,Oracle JDBC 11g彷佛会使用/ dev / random。而使用/dev/random生成随机数时,依赖熵池。若是熵池空了或不够用,对/dev/random的读取就会堵塞,直到熵池够用为止。
可是上面这篇文章中说,有得必有失,urandom的随机性弱于random。
这点我也找到了一篇文章,来反驳这种说法,你们可自行围观。
那怎么让熵池增长呢?熵池小会有什么其余后果吗?
jarfield老兄上面那篇文章中说到
熵池本质上是若干字节。/proc/sys/kernel/random/entropy_avail中存储了熵池如今的大小,/proc/sys/kernel/random/poolsize是熵池的最大容量,单位都是bit。若是entropy_avail的值小于要产生的随机数bit数,那么/dev/random就会堵塞。
熵斥怎么增长?
只有少数驱动程序会填充熵池,首先是键盘和鼠标。
其实是从各类noice source中获取数据,noice source多是 键盘事件、鼠标事件、设备时钟中等。
linux内核从2.4升级到2.6时,处于安全性的考虑,废弃了一些source。source减小了,熵池补给的速度固然也变慢,进而不够用。
熵斥堵塞会有什么后果?
其实,经过消耗熵池,能够构造DOS攻击。原理很简单,熵池空了,依赖随机数的业务(SSL,加密等)就不能正常进行。
怎么补充熵池?
Linux服务器在运行时,既没有键盘事件,也没有鼠标事件,如何快速积累熵池呢?
在上面那篇文章中有说到:
例如rngd或rng-tools。
先观察rngd启动前的熵池大小:
watch cat /proc/sys/kernel/random/entropy_avail
只有100多。
安装rng-tools,参考文章 https://blog.csdn.net/tiantao2012/article/details/78792046。
yum install rng-tools -y
启动rngd服务
service rngd start
再看下熵池
飙升到3000多。
哈哈,搞定收工。
最后,是个人星球,哈哈。