Remplir le réservoir d’entropie avec « Give Us Chaos! »

Introduction

Vous est-il déjà arrivé de devoir générer des clés GPG sur un serveur distant et de rester bloqué à cause d’un manque d’entropie (donnée aléatoire) ?

# gpg --gen-key
[...]
+++..+++++++++++++>++++++++++>+++++...............+++++

Not enough random bytes available.  Please do some other work to give
the OS a chance to collect more entropy! (Need 284 more bytes)
[Ctrl-C]
#

Pour les applications « cryptographiques » (génération de clés, etc.), la lecture de données aléatoires se fait via le fichier système « /dev/random ». Une lecture sur ce fichier peut être bloquantes lorsque le réservoir d’entropie n’est pas suffisamment plein. Celui-ci est rempli grâce au bruit matériel (lecture/écriture sur le disque, interruption système), mais surtout grâce aux mouvements de la souris et aux tapes sur le clavier. Ces deux périphériques n’étant pas contrôlables à distance ni même branchés sur un serveur, cela explique la difficulté pour le noyau à générer des aléas.

Pour information:

  • Le fichier « /proc/sys/kernel/random/poolsize » contient la taille totale du réservoir d’entropie
  • Le fichier « /proc/sys/kernel/random/entropy_avail » contient le nombre d’entropie actuellement disponibles dans le réservoir.
  • La commande suivante vous donnera, en pourcentage, l’état du réservoir :


    $ cat /proc/sys/kernel/random/{entropy_avail,poolsize} | \
    { read a; read b; echo "$(( a * 100 / b ))%"; }

Les solutions

Il existe différentes façons de palier à ce problème de blocage :

1) création d’un lien symbolique « /dev/random » pointant sur « /dev/urandom » (un device non bloquant). Mais dans ce cas, les aléas seront vulnérables par cryptanalyse car « /dev/urandom » utilise un algorithme pour toujours être en mesure d’en fournir (cf. RANDOM(4)).

2) utilisation d’EGD (Entropy Gathering Daemon). Celui-ci utilise d’autres sources de données aléatoires pour remplir le réservoir (flux réseaux,
vmstat, etc.). Mais il implique d’avoir un démon qui tourne en permanence sur votre serveur, et donc, des ressources supplémentaires.

3) utilisation de rngd. Cet outil remplis le réservoir d’entropie en utilisant comme source un périphérique matériel (« /dev/hw_random »). Une très
bonne solution mais malheureusement inutile lorsqu’on ne dispose pas d’un tel équipement.

4) Récupérer des nombres aléatoires sur des sites tels que random.org et les ajouter au réservoir. Certes efficace, mais le fait que les gens de
random.org ainsi que ceux qui « sniff » le réseau aient connaissance du contenu de votre réservoir, font que cette solution n’est pas fiable. A
moins que celle-ci soit améliorée (cf. #5).

5) utilisation de GUChaos (cf. ci-dessous). Idéale pour une utilisation ponctuelle mais implique que le serveur soit connecté à Internet.

Utilisation de GUChaos

GUChaos (Give Us Chaos) récupère des nombres aléatoires depuis le site random.org, les transforme avec une substitution poly-numérique (pour plus de sécurité), et les ajoutes dans le réservoir d’entropie. Voici comment l’utiliser :

1) Télécharger la dernière version du fichier GUChaos.c.

2) Modifier la clé utilisée pour la substitution polynumérique :

[...]
/* this key will be used during polynumeric substitution. Content and
* length have to be changed ! */
#define KEY "87309840982874762876409820984"
[...]

3) Compiler le programme :

# cc -Wall GUChaos.c -o GUChaos

4) Lancer le programme :

# ./GUChaos
[+] GUChaos version 1.0
[+] Retrieve random bytes from http://random.org
[+] Adding 0x45558062 0x4ed6f80d ... 0xbce8af9b (status: 422/4096)
[+] Adding 0xfb8e9d76 0x214a0857 ... 0x2993012c (status: 678/4096)
[+] Adding 0xf2789051 0x4bf38816 ... 0xc49f2319 (status: 934/4096)
[...]
[+] Adding 0x725ebd88 0x89416b33 ... 0x90e2dcb4 (status: 4019/4096)
[+] Adding 0x70bd30b6 0x6d87a158 ... 0x8f669921 (status: 4096/4096)
[+] available entropy is set to the maximum (4096)

Références

[1] Polyalphabetic substitution
[http://en.wikipedia.org/wiki/Substitution_cipher]

[2] On entropy and randomness
[http://lwn.net/Articles/261804]

2 Comments

  1. […] Comme il devient de plus en plus dur de produire du chaos et encore plus sur un VPS sur lequel vous n’avez même pas d’environnement graphique, je recommande la compilation et l’utilisation du code GUChaos.c et la lecture du billet : Remplir le réservoir d’entropie avec « Give Us Chaos! ». […]