Faites du bruit pour /dev/random

Il y a quelque mois, j’ai attendu patiemment de très longues minutes pour créer un domaine Weblogic sur un serveur virtualisé au fond du datacenter. Hier, j’ai recroisé son petit frère et le même phénomène…

Je me suis énervé au point de lui faire peur et le second serveur est allé beaucoup plus vite : 2 minutes contre plus de 20 minutes pour le premier.

Franchement, j’ai eu du mal à y croire au début ; le temps de configuration ne dépend que de mon niveau d’énervement :

  • quelque soit la JVM : Hotspot VM ou JRockit,
  • quelque soit le serveur
  • Après investigation, il s’avère que ce n’est pas non plus spécifique à Weblogic

Non, ne fuyez pas ! Il s’agit toujours d’un blog technique ! rien de paranormal comme vous pourrez le tester très simplement…

L’expérience

Comme le titre le suggère, il s’agit en fait d’une adhérence à la manière dont /dev/random génère des nombres sur Linux. Utilisez un serveur ou laptop avec un noyau Linux pour vous en convaincre ; j’ai mis en évidence le phénomène au moins sur Ubuntu 11.10 et Suse SLES 11… la nuit dans une chambre d’un hotel au calme :

En prenant soin de ne pas bouger la souris et de ne pas faire de bruit :

$ dd if=/dev/random of=x bs=1k count=5
0+5 records in
0+5 records out
48 bytes (48 B) copied, 25.2963 s, 0.0 kB/s

La même chose en secouant votre PC, ou simplement, en bougeant la souris de manière convulsive :

dd if=/dev/random of=x bs=1k count=5
0+5 records in
0+5 records out
40 bytes (40 B) copied, 2.43642 s, 0.0 kB/s

Soit un ratio 10, voire plus et une taille de fichier résultat qui dépend et, en tout cas, bien inférieure aux 5k attendu lorsque vous utilisez /dev/zero

Quelle adhérence avec Weblogic ?

Je vous passe les strace et les erreurs. Quoiqu’il en soit après investigation, il apparait que, pour créer le domaine, Weblogic génère des clés en utilisant des classes Java (SecureRandom?) qui font appel à /dev/random avec les 2 JVM d’Oracle ;

Pour accélérer la génération, au prix d’une prédictabilité plus forte des clés, vous pouvez vous appuyer sur /dev/urandom (avec un u), en utilisant le paramètre -Djava.security.egd=file:/dev/./urandom de la JVM. On peut aussi faire du bruit en déplaçant la souris du serveur, par exemple en vous connectant à la console…

La différence est flagrante…

Explications

Si vous voulez comprendre les raisons « derrière » ce phènomène sans lire le noyau, commencer par la page /dev/random de Wikipedia.

4 réflexions sur “Faites du bruit pour /dev/random”

  1. $ cat /proc/sys/kernel/random/entropy_avail
    147

    $ sudo /usr/sbin/rngd -r /dev/urandom -o /dev/random -t 1

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

    $ sudo kill -9 `ps -ef |grep [r]ngd | awk ‘{ print $2}’`

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

  2. J’ai eu le meme probleme (avec Oracle BI), sauf que je n’avais pas l’acces physique au serveur. Je n’ai pas trouve de maniere simple de generer de l’entropie sur le serveur a distance. Generer un traffic reseau n’a pas l’air de faire grand chose. Si quelqu’un a une idee pour augmenter l’entropie d’un serveur a distance, je suis preneur …

Les commentaires sont fermés.