多數據源鏈接Oracle報錯,linux熵池耗盡問題

最近碰到了個頗有意思的問題,springboot加載多數據源,遇到了在啓動時數據庫鏈接報錯的問題。
報錯信息:php

The error occurred while executing a queryjava

而後找到了一篇文章,linux熵池耗盡linux

http://www.usn-it.de/index.php/2009/02/20/oracle-11g-jdbc-driver-hangs-blocked-by-devrandom-entropy-pool-empty/spring

在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多。

哈哈,搞定收工。

最後,是個人星球,哈哈。

相關文章
相關標籤/搜索