Démarrage d'Oracle Weblogic figé sur linux ? Avez-vous regardé l'entropy ?

Versions d’Oracle Weblogic concernées : 8.1 à 12.1.2
OS Concerné : Linux x86 et Linux x86_64

Symptômes :

Démarrage très lent d’un serveur (admin où managed) Weblogic sans explication flagrante. Ce problème se retrouve aussi lors de la création du domaine.

Si vous effectuez un thread dump de la JVM en question vous pouvez observer un fameux thread à l’état lock :

- locked (a java.lang.Object)
 at sun.security.provider.NativePRNG$RandomIO.access$300(NativePRNG.java:108)
 at sun.security.provider.NativePRNG.engineGenerateSeed(NativePRNG.java:102)
 at java.security.SecureRandom.generateSeed(SecureRandom.java:495)
 at com.bea.security.utils.random.AbstractRandomData.ensureInittedAndSeeded(AbstractRandomData.java:91)
 - locked (a com.bea.security.utils.random.SecureRandomData)
 at com.bea.security.utils.random.AbstractRandomData.getRandomBytes(AbstractRandomData.java:105)
 - locked (a com.bea.security.utils.random.SecureRandomData)
 at com.bea.security.utils.random.AbstractRandomData.getRandomBytes(AbstractRandomData.java:100)
 at com.bea.console.utils.CSRFUtils.getSecret(CSRFUtils.java:56)
 at jsp_servlet._jsp._changemgmt.__changemanager._jspService(__changemanager.java:156)

Weblogic et surtout java tente de générer des clés en utilisant la classe SecureRandom qui fait appel à /dev/ramdom.

Pourquoi ce temps d’attente

Linux à deux device pour fournir des données aléatoires : /dev/random et /dev/urandom. A partir du noyau 2.6 le problème apparait quand l’entropy disponible au niveau système est bas (aux alentours de 100 bits et moins).
La différence entre ces deux device est que à un moment /dev/ranwom n’a pas suffisamment de bits disponibles et attends jusqu’à ce qu’il y en ait suffisamment (entropy générée par l’utilisateur et insérée dans le système).

Mais comment un système peut manquer d’entropy ?

Il faut garder à l’esprit qu’un OS effectue couramment des opérations de cryptage (ssh, https…) et par conséquent consomme régulièrement des données dans /dev/random.
L’OS ajoute des données dans /dev/randow avec les I/O en provenance d’accès disques, I/O réseau, périphériques (clavier, souris…).
Donc au final le système consomme plus rapidement qu’il n’ajoute de données dans /dev/random. Ce phénomène est particulièrement observé dans les environnements virtualisés.

Mais comment vérifier que le système manque d’entropy

Vérifier la taille du système

$ cat /proc/sys/kernel/random/poolsize
 4096

Vérifier la valeur courante

 $ cat /proc/sys/kernel/random/entropy_avail
 125

Monitorer l’évolution de l’entropy de mon système

$ for i in $(seq 500); do cat /proc/sys/kernel/random/entropy_avail ; sleep 5; done

Ok mais comment corriger cela

Il suffit tout simplement de forcer la sécurité de la JVM à utiliser /dev/./urandom plutôt que /dev/random. Pour cela il suffit d’ajouter le paramètre ci-dessous à la ligne de commande de démarrage de la JVM Weblogic. Attention le « . » dans le path est important.

-Djava.security.egd=file:/dev/./urandom