random(4) Device Drivers Manual random(4) NOM random, urandom -- Peripheriques generateurs de nombres aleatoires du noyau SYNOPSIS #include int ioctl(fd, RNDrequete, param); DESCRIPTION Les fichiers speciaux en mode caractere /dev/random et /dev/urandom (existants depuis Linux 1.3.30) fournissent une interface pour le generateur de nombres aleatoires du noyau. Le fichier /dev/random a un numero de peripherique majeur egal a 1 et un numero mineur egal a 8. Le fichier /dev/urandom a un numero de peripherique majeur egal a 1 et a 9 pour le peripherique mineur. Le generateur de nombres aleatoires regroupe du bruit provenant de son environnement par l'intermediaire des pilotes de peripheriques et d'autres sources, et le stocke dans un reservoir d'entropie. Le generateur memorise egalement une estimation du nombre de bits de bruit dans son reservoir d'entropie et utilise son contenu pour creer des nombres aleatoires. Les noyaux Linux 3.17 et posterieurs fournissent une interface getrandom(2) plus sure et plus simple qui ne requiert aucun fichier special. Consulter le manuel de getrandom(2) pour plus de details. Lors de sa lecture, le peripherique /dev/urandom renvoie des octets aleatoires en utilisant un generateur de nombres pseudoaleatoires nourri a partir du reservoir d'entropie. Les lectures a partir de ce peripherique ne sont pas bloquantes (c'est-a-dire qu'un << yield >> n'est pas impose au CPU), mais peuvent entrainer un delai notable lors de requetes d'un grand montant de donnees. Lors d'une lecture au tout debut du demarrage (boot), /dev/urandom peut renvoyer des donnees avant que le reservoir d'entropie n'ait ete initialise. Si cela a de l'importance dans votre application, utilisez plutot getrandom(2) ou /dev/random. Le peripherique /dev/random est une interface patrimoniale qui remonte aux temps ou les primitives de chiffrement utilisees dans les implementations de /dev/urandom n'etaient pas d'une grande fiabilite. Il renvoyait des octets aleatoires seulement pour un nombre estime de bits de bruit recent dans le reservoir d'entropie, en bloquant si necessaire. /dev/random est adapte pour les applications qui necessitent une haute qualite d'imprevisibilite et qui peuvent supporter des delais indetermines. Si le reservoir d'entropie est vide, les lectures dans /dev/random bloqueront jusqu'a ce que du bruit environnemental supplementaire soit accumule. Depuis Linux 5.6, le drapeau O_NONBLOCK est ignore car /dev/random ne bloquera pas sauf pendant le tout debut du demarrage. Dans les versions precedentes, si open(2) est appele pour /dev/random avec le drapeau O_NONBLOCK, un appel ulterieur a read(2) ne bloquera pas si le nombre requis d'octets n'est pas disponible. A la place, les octets disponibles sont renvoyes. Si aucun octet n'est disponible, read(2) renverra -1 et errno sera defini a EAGAIN. Le drapeau O_NONBLOCK n'a aucun effet lors de l'ouverture de /dev/urandom. Lors de l'appel read(2) pour le peripherique /dev/urandom, des lectures jusqu'a 256 octets renverront autant d'octets que necessaires et ne seront pas interrompues par un gestionnaire de signal. Les lectures avec un tampon depassant cette limite peuvent renvoyer un nombre d'octets insuffisant ou echouer avec l'erreur EINTR si elles sont interrompues par un gestionnaire de signal. Depuis Linux 3.16, un appel read(2) pour /dev/urandom renverra au plus 32 Mo. Un appel read(2) pour /dev/random renverra au plus 512 octets (340 octets avant Linux 2.6.12). Ecrire dans /dev/random ou /dev/urandom mettra a jour le reservoir d'entropie avec les donnees ecrites, mais n'augmentera pas le decompte d'entropie. Cela signifie que le contenu lu des deux fichiers sera affecte, mais que cela ne rendra pas les lectures de /dev/random plus rapides. Utilisation Le peripherique /dev/random est une interface patrimoniale et /dev/urandom est prefere et suffisant dans tous les cas d'utilisation a l'exception des applications qui requierent des donnees aleatoires au tout debut du demarrage. Pour celles-ci, getrandom(2) doit etre utilise a la place, car il creera un blocage jusqu'a ce que le reservoir d'entropie soit initialise. Si un fichier d'ensemencement est sauvegarde d'un redemarrage a l'autre comme recommande ci-dessous (toutes les distributions majeures de Linux font cela depuis au moins l'an 2000), la sortie est chiffree de maniere sure vis-a-vis d'attaquants sans acces local comme superutilisateur, a la condition que ce fichier soit recharge lors du demarrage et parfaitement adapte pour les cles de chiffrement de sessions reseau. Comme la lecture depuis /dev/random peut etre bloquante, les utilisateurs l'ouvrent generalement dans un mode non bloquant (ou en effectuant la lecture avec un delai d'expiration) et fournissent un systeme de notification lorsque l'entropie demandee n'est pas immediatement disponible. Configuration Si votre systeme ne dispose pas des fichiers /dev/random et /dev/urandom, vous pouvez les creer avec les commandes suivantes : mknod -m 666 /dev/random c 1 8 mknod -m 666 /dev/urandom c 1 9 chown root:root /dev/random /dev/urandom Lorsqu'un systeme Linux demarre sans trop d'interaction avec un operateur, le reservoir d'entropie peut se trouver dans un etat relativement previsible. Cela reduit la quantite reelle de bruit dans le reservoir d'entropie en dessous de la quantite necessaire estimee. Afin de contrer cet effet, il est utile de sauvegarder les informations du reservoir d'entropie lors des arrets et redemarrages du systeme. Pour realiser cela, ajoutez les lignes suivantes dans le script de demarrage approprie execute lors de la sequence de demarrage du systeme Linux : echo "Initialisation du generateur de nombres aleatoires..." random_seed=/var/run/random-seed # Transmission d'une graine aleatoire de demarrage en demarrage # Chargement puis sauvegarde de tout le reservoir 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 ] && bits=$(cat $poolfile) || bits=4096 bytes=$(expr $bits / 8) dd if=/dev/urandom of=$random_seed count=1 bs=$bytes Egalement, ajoutez les lignes suivantes dans le script approprie execute lors de l'extinction du systeme Linux. # Transmission d'une graine aleatoire de demarrage en demarrage # Sauvegarde du reservoir d'entropie en entier echo "Sauvegarde de la graine aleatoire..." random_seed=/var/run/random-seed touch $random_seed chmod 600 $random_seed poolfile=/proc/sys/kernel/random/poolsize [ -r $poolfile ] && bits=$(cat $poolfile) || bits=4096 bytes=$(expr $bits / 8) dd if=/dev/urandom of=$random_seed count=1 bs=$bytes Dans les exemples ci-dessus, il est assume que Linux 2.6.0, ou versions suivantes, est utilise, ou /proc/sys/kernel/random/poolsize renvoie la taille du reservoir d'entropie en bits (voir ci-dessous). /proc interfaces Les fichiers du repertoire /proc/sys/kernel/random (present depuis Linux 2.3.16) fournissent des informations supplementaires a propos du peripherique /dev/random. entropy_avail Ce fichier en lecture seule donne l'entropie disponible, en bits. Ce sera un nombre dans l'intervalle 0-4096. poolsize Ce fichier donne la taille de la reserve d'entropie. Sa semantique varie selon les versions du noyau : Linux 2.4 : Ce fichier donne la taille de la reserve d'entropie en octets. Normalement, elle sera de 512 (octets), mais le fichier est editable et peut etre modifie a n'importe quelle valeur pour laquelle un algorithme est disponible. Actuellement, les choix sont 32, 64, 128, 256, 512, 1024 ou 2048. Linux 2.6 et suivants : Ce fichier est en lecture seule et donne la taille de la reserve d'entropie en bits. Il contient la valeur 4096. read_wakeup_threshold Ce fichier fournit le nombre de bits d'entropie requis pour reveiller les processus endormis en attente d'entropie de /dev/random. La valeur par defaut est 64. write_wakeup_threshold Ce fichier fournit le nombre de bits d'entropie en dessous duquel on reveillera les processus ayant effectue un appel a select(2) ou poll(2) pour un acces en ecriture a /dev/random. Ces valeurs peuvent etre modifiees en ecrivant dans les fichiers. uuid et boot_id Ces fichiers en lecture seule fournissent des chaines aleatoires comme 6fd5a44b-35f4-4ad4-a9b9-6b9be13e1fe9. Le premier est regenere a chaque lecture, le dernier est genere une seule fois. Interface ioctl(2) Les requetes ioctl(2) suivantes sont definies sur les descripteurs de fichier connectes a /dev/random ou /dev/urandom. Toutes les requetes realisees interagiront avec l'entree du reservoir d'entropie et auront un effet sur /dev/random et /dev/urandom. La capacite CAP_SYS_ADMIN est necessaire pour toutes les requetes sauf RNDGETENTCNT. RNDGETENTCNT Recuperer le decompte d'entropie du reservoir d'entree, le contenu sera le meme que celui du fichier entropy_avail sous proc. Le resultat sera stocke dans l'entier pointe par l'argument. RNDADDTOENTCNT Augmenter ou diminuer le decompte d'entropie du reservoir d'entree de la valeur pointee par l'argument. RNDGETPOOL Supprimee dans Linux 2.6.9. RNDADDENTROPY Ajouter de l'entropie supplementaire au reservoir d'entree en augmentant le decompte d'entropie. Cela differe de l'ecriture dans /dev/random ou /dev/urandom qui ajoute des donnees mais sans augmenter le decompte d'entropie. La structure suivante est utilisee : struct rand_pool_info { int entropy_count; int buf_size; __u32 buf[0]; }; Ici, entropy_count est la valeur ajoutee au (ou soustraite du) decompte d'entropie, et buf est le tampon de taille buf_size qui est ajoute au reservoir d'entropie. RNDZAPENTCNT RNDCLEARPOOL Vider les decomptes d'entropie de tous les reservoirs et ajouter des donnees systeme (comme le temps reel) aux reservoirs. FICHIERS /dev/random /dev/urandom NOTES Pour un apercu et une comparaison des interfaces utilisables pour produire de l'aleatoire, voir random(7). BOGUES Lors du tout debut du demarrage (boot), des lectures dans /dev/urandom peuvent renvoyer des donnees avant que le reservoir d'entropie n'ait ete initialise. VOIR AUSSI mknod(1), getrandom(2), random(7) RFC 1750, << Randomness Recommendations for Security >> TRADUCTION La traduction francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot , Cedric Boutillier , Frederic Hantrais et Jean-Paul Guillonneau Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.06 31 octobre 2023 random(4)