NOM
random, urandom - Périphériques générateurs aléatoires du noyau.
Les fichiers spéciaux en mode caractère /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.
Lors d’une lecture, /dev/urandom renverra autant d’octets qu’on en
demande. 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 très bien s’il vous faut utiliser /dev/random ou
/dev/urandom, alors utilisez ce dernier. En règle générale,
/dev/urandom est à utiliser pour tout sauf les clés GPG/SSL/SSH à
longue durée de vie.
Si un réservoir d’entropie est sauvé d’un redémarrage à l’autre comme
recommandé ci-dessus (toutes les distributions majeures de Linux font
cela depuis au plus tard l’an 2000), la sortie est cryptographiquement
sûre vis à vis d’attaquants sans accès local comme superutilisateur, à
la condition que ce fichier soit rechargé au démarrage et suffisant
pour les clés de chiffrement de sessions réseau. Comme la lecture
depuis /dev/random peut être bloquante, les utilisateurs l’ouvrent
généralement dans un mode non bloquant (ou en effectuant la lecture
avec un délai d’expiration) et fournissent un système de notification
lorsque l’entropie demandé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 données de haute qualité destinées à initialiser
un générateur de nombres pseudo-aléatoires (« cryptographic
pseudo-random number generator » ou CPRNG). Il est conçu pour la
sécurité et non la vitesse, et n’est pas adapté à la génération de
grandes quantités de données aléatoires. Les utilisateurs doivent être
très économes sur leur utilisation de /dev/urandom (et /dev/random) :
des lectures inutiles de grandes quantités de données auront un impact
négatif sur les autres utilisateurs de ces sources.
La quantité de données d’initialisation nécessaire pour générer une clé
de chiffrement est égale à la taille utile de la clé. Par exemple, une
clé privée RSA ou Diffie-Hellman de 3072 bits a une taille utile de
128 bits (2^128 calculs sont nécessaires pour la casser) et a donc
besoin de 128 bits (16 octets) aléatoires issus 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 puise 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évisible. 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
d’entropie 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 nombres aléatoires"
random_seed=/var/run/random-seed
# Initialise le générateur de nombres aléatoires avec une racine
# mémorisée lors du dernier arrêt (ou redémarrage) du système
# Charge puis sauvegarde 512 octets (taille du 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.
# Initialise le générateur de nombres aléatoires avec une racine
# mémorisée lors du dernier arrêt (ou redémarrage) du système
# Sauvegarde le réservoir d’entropie
echo "Sauvegarde la racine du générateur aléatoire...
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 d’entropie pleine.
Le fichier poolsize donne la taille de la réserve d’entropie. Sa
signification dépend des version du noyau :
Linux 2.4 : Ce fichier donne la taille de la réserve d’entropie
en octets. Normalement, elle sera de 512 (octets),
mais le fichier peut être écrit et peut être modifié
à n’importe quelle valeur pour laquelle un
algorithme est disponible. Actuellement, les choix
sont 32, 64, 128, 256, 512, 1024, 2048.
Linux 2.6 : Ce fichier est en lecture seule et donne la taille
de la réserve d’entropie 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 en provenance 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 »
COLOPHON
Cette page fait partie de la publication 3.23 du projet man-pages
Linux. Une description du projet et des instructions pour signaler des
anomalies peuvent être trouvées à l’adresse
http://www.kernel.org/doc/man-pages/.
TRADUCTION
Cette page de manuel a été traduite et mise à jour par Christophe
Blaess <http://www.blaess.fr/christophe/> entre 1996 et 2003, puis par
Alain Portal <aportal AT univ-montp2 DOT fr> jusqu’en 2006, et mise à
disposition sur http://manpagesfr.free.fr/.
Les mises à jour et corrections de la version présente dans Debian sont
directement gérées par Simon Paillard
<simon.paillard@resel.enst-bretagne.fr> et l’équipe francophone de
traduction de Debian.
Veuillez signaler toute erreur de traduction en écrivant à
<debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
paquet manpages-fr.
Vous pouvez toujours avoir accès à la version anglaise de ce document
en utilisant la commande « man -L C <section> <page_de_man> ».