RANDOM(4)

NOM
random, urandom - Périphériques générateurs aléatoires du noyau

DESCRIPTION
Les fichiers spéciaux caractères /dev/random et /dev/urandom (existants depuis Linux 1.3.30) fournissent une interface avec le générateur de nombres aléatoires du noyau. Le fichier /dev/random a un numéro de périphérique majeur égal à 1, et un numéro mineur égal à 8. Les numéros du périphérique /dev/urandom sont 1 pour le majeur, et 9 pour le mineur.

Le générateur de nombres aléatoires regroupe du bruit provenant de son environnement par l'intermédiaire des pilotes de périphériques et d'autres sources, et le stocke dans un réservoir d'entropie. Le générateur mémorise également une estimation du nombre de bits de bruit dans son réservoir d'entropie, et utilise son contenu pour créer des nombres aléatoires.

Lors d'une lecture, le périphérique /dev/random sera limité au nombre de bits de bruit contenus dans le réservoir d'entropie. /dev/random est particulièrement adapté pour les cas où l'on a ponctuellement besoin de nombres hautement aléatoires (création de clés par exemple). Lorsque le réservoir d'entropie est vide, les lectures depuis le périphérique /dev/random seront bloquantes jusqu'à l'obtention de suffisamment de bruit en provenance de l'environnement.

Une lecture sur le périphérique /dev/urandom ne bloquera pas si on attend plus d'entropie. Toutefois, s'il n'y a plus assez de bits disponibles dans le réservoir d'entropie, les valeurs renvoyées pourraient être théoriquement vulnérables à une cryptanalyse basée sur l'algorithme employé par le pilote. Il n'existe pas de documentation sur ce type d'attaque dans la littérature publique actuelle, mais cela n'élimine pas le risque théorique. Si ce risque est important pour votre application, utilisez plutôt /dev/random à la place.

  Utilisation
Si vous ne savez pas si vous devez utiliser /dev/random ou /dev/urandom, vous devriez alors utiliser le second. De manière générale, /dev/urandom devrait être utilisé dans tous les cas excepté pour les clés de longue durée (GPG/SSL/SSH). Si le fichier germe est sauvegardé entre les redémarrages comme recommandé plus haut (toutes les distributions Linux majeures le font depuis au moins l'année 2000), la sortie est sûre du point de vue cryptographique contre les pirates sans accès superutilisateur dès que le fichier est rechargé pendant la phase de démarrage et il est parfaitement adapté aux clés de sessions de cryptage réseau. Comme les lectures dans /dev/random peuvent bloquer, les utilisateurs devraient l'ouvrir en mode non bloquant (ou effectuer une lecture sans attente) et fournir une sorte de notification à l'utilisateur si l'entropie souhaitée n'est pas immédiatement disponible. Le générateur de nombres aléatoires du noyau est conçu pour produire une faible quantité de germe de haute qualité pour alimenter un générateur de nombres pseudo-aléatoires cryptographique. Il est conçu pour la sécurité, pas pour la rapidité, et il ne convient guère à la génération de grande quantité de données aléatoires. Les utilisateurs devraient être économes concernant la quantité de germes à lire dans /dev/urandom (et /dev/random) ; la lecture inutile de grandes quantités de données sur ce périphérique aura un effet négatif pour les autres utilisateurs de ce périphérique. La quantité de germes nécessaire pour générer une clé cryptographique est égale à la taille réelle de la clé. Par exemple, une clé privée RSA 3072 bits ou Diffie-Hellman a une taille réelle de 128 bits (il faut environ 2^128 opérations pour la casser). Le générateur de clé n'a donc besoin que de 128 bits (16 octets) de germe en provenance de /dev/random. Bien qu'une marge d'incertitude au-dessus de ce minimum soit acceptable, pour contourner les faiblesses de l'algorithme du générateur de nombres pseudo-aléatoires cryptographique, aucune primitive de cryptographie ne peut espérer aujourd'hui garantir plus de 256 bits de sécurité. Aussi, si un programme puisse plus de 256 bits (32 octets) dans le réservoir d'entropie du noyau, par invocation ou après un intervalle de réapprovisionnement raisonnable (au moins une minute), cela laisse supposer que la cryptographie est maladroitement implémentée.

CONFIGURATION
Si votre système ne dispose pas des fichiers /dev/random et /dev/urandom, vous pouvez les créer avec les commandes suivantes :
    mknod -m 644 /dev/random c 1 8
    mknod -m 644 /dev/urandom c 1 9
    chown root:root /dev/random /dev/urandom
Lorsqu'un système Linux démarre sans interaction avec un opérateur humain, le réservoir d'entropie peut se trouver dans un état relativement prédictible. La véritable quantité de bruit dans le réservoir d'entropie est donc en-dessous de son estimation. Afin de contrer ce problème, il est utile de sauvegarder l'état du réservoir entropique lors des arrêts et redémarrages du système. Il est possible ainsi d'ajouter les lignes suivantes dans les scripts de démarrage appropriés :
    echo "Initialisation du générateur de nombre aléatoires"
    random_seed=/var/run/random-seed
    # Reporte une graine aléatoire de démarrage en démarrage
    # Charger et enregistrer le réservoir d'entropie
    if [ -f $random_seed ]; then
        cat $random_seed >/dev/urandom
    else
        touch $random_seed
    fi
    chmod 600 $random_seed
    poolfile=/proc/sys/kernel/random/poolsize
    [ -r $poolfile ] && bytes=`cat $poolfile` || bytes=512
    dd if=/dev/urandom of=$random_seed count=1 bs=$bytes
Également, il faut ajouter les lignes suivantes dans un script exécuté lors de l'arrêt du système.
    # Reporter une graine aléatoire de l'arrêt au démarrage
    # Enregistrer le réservoir d'entropie
    echo "Saving random seed..."
    random_seed=/var/run/random-seed
    touch $random_seed
    chmod 600 $random_seed
    poolfile=/proc/sys/kernel/random/poolsize
    [ -r $poolfile ] && bytes=`cat $poolfile` || bytes=512
    dd if=/dev/urandom of=$random_seed count=1 bs=$bytes

  Interface /proc
Les fichiers du répertoire /proc/sys/kernel/random (présent depuis 2.3.16) fournissent une interface supplémentaire au périphérique /dev/random.

Le fichier en lecture seule entropy_avail donne l'entropie disponible. Normalement, elle sera de 4096 (bits), une réserve entropique pleine.

Le fichier poolsize donne la taille de la réserve entropique. Normalement, elle sera de 512 (octets). Ceci peut être modifié à n'importe quelle valeur pour laquelle un algorithme est disponible. Actuellement, les choix sont 32, 64, 128, 256, 512, 1024, 2048. La sémantique de ce fichier varie suivant les versions du noyau :

    Linux 2.4 :
        Ce fichier donne la taille de la réserve entropique en octets. Normalement, ce fichier contient la valeur 512, mais il est accessible en écriture et son contenu peut être modifié à toute valeur pour laquelle un algotithme est disponible. Les choix sont 32, 64, 128, 256, 512, 1024, 2048.

    Linux 2.6 :
        Ce fichier, en lecture seule, contient la taille de la réserve entropique en bits. Il contient la valeur 4096.

Le fichier read_wakeup_threshold contient le nombre de bits d'entropie nécessaires pour réveiller les processus endormis qui attendaient l'entropie à partir de /dev/random. La valeur par défaut est 64. Le fichier write_wakeup_threshold contient le nombre de bits d'entropie en-dessous duquel on réveillera les processus ayant effectué un appel à select(2) ou poll(2) pour un accès en écriture à /dev/random. Ces valeurs peuvent être modifiées en écrivant dans les fichiers.

Les fichiers en lecture seule uuid et boot_id contiennent des chaînes aléatoires comme 6fd5a44b-35f4-4ad4-a9b9-6b9be13e1fe9. Le premier est généré à chaque lecture, le dernier est généré une seule fois.

FICHIERS
/dev/random
/dev/urandom

VOIR AUSSI
mknod(1)
RFC 1750, "Randomness Recommendations for Security"

TRADUCTION

Ce document est une traduction réalisée par Christophe Blaess <http://www.blaess.fr/christophe/> le 18 octobre 1996, mise à jour par Alain Portal <aportal AT montp2 DOT > le 4 juillet 2005 et révisée le 2 juillet 2008.

L'équipe de traduction a fait le maximum pour réaliser une adaptation française de qualité. La version anglaise la plus à jour de ce document est toujours consultable via la commande : « LANG=C man 4 random ». N'hésitez pas à signaler à l'auteur ou au traducteur, selon le cas, toute erreur dans cette page de manuel.