.\" -*- coding: UTF-8 -*- .\" Copyright (c) 1997 John S. Kallal (kallal@voicenet.com) .\" .\" %%%LICENSE_START(GPLv2+_DOC_ONEPARA) .\" This is free documentation; you can redistribute it and/or .\" modify it under the terms of the GNU General Public License as .\" published by the Free Software Foundation; either version 2 of .\" the License, or (at your option) any later version. .\" %%%LICENSE_END .\" .\" Some changes by tytso and aeb. .\" .\" 2004-12-16, John V. Belmonte/mtk, Updated init and quit scripts .\" 2004-04-08, AEB, Improved description of read from /dev/urandom .\" 2008-06-20, George Spelvin , .\" Matt Mackall .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH RANDOM 4 "15 сентября 2017 г." Linux "Руководство программиста Linux" .SH ИМЯ random, urandom \- ядерные устройства\-источники случайных чисел .SH СИНТАКСИС #include .PP \fBint ioctl(\fP\fIfd\fP\fB, RND\fP\fIrequest\fP\fB, \fP\fIparam\fP\fB);\fP .SH ОПИСАНИЕ Специальные символьные файлы \fI/dev/random\fP и \fI/dev/urandom\fP (появились в Linux 1.3.30) предоставляют интерфейс к генератору случайных чисел, встроенному в ядро. Файл \fI/dev/random\fP имеет старший номер устройства 1 и младший номер устройства 8. Файл \fI/dev/urandom\fP имеет старший номер устройства 1 и младший номер устройства 9. .PP Генератор случайных чисел собирает окружающий шум от работы драйверов устройств и из других источников в пул энтропии. Генератор также постоянно оценивает количество битов шума в пуле энтропии. Именно с помощью этого пула создаются случайные числа. .PP В Linux 3.17 и новее предоставляется более простой и безопасный интерфейс \fBgetrandom\fP(2), который не требует специальных файлов; смотрите справочную страницу \fBgetrandom\fP(2). .PP При чтении из устройства \fI/dev/urandom\fP возвращаются произвольные байты, полученные из генератора псевдослучайных чисел, инициализированного из пула энтропии. Чтение из этого устройства не приводит к блокировке (то есть, ЦП не отдаёт управление), но может вызвать заметную задержку при запросе большого количества данных. .PP .\" This is a real problem; see .\" commit 9b4d008787f864f17d008c9c15bbe8a0f7e2fc24 При чтении во время начальной загрузки ОС \fI/dev/urandom\fP может возвращать данные до инициализации пула энтропии. Если это неприемлемо для приложения, используйте \fBgetrandom\fP(2) или \fI/dev/random\fP. .PP Устройство \fI/dev/random\fP является устаревшим интерфейсом, который относится ко времени времени, когда криптографическим примитивам, используемым в реализации \fI/dev/urandom\fP, не очень не доверяли. Интерфейс возвращает произвольные байты только с подсчитанным количеством бит свежего шума в пуле энтропии, блокируя работу при необходимости. Устройство \fI/dev/random\fP подходит для приложений, которым нужна произвольность высокого качества и без проблем относятся к задержкам на неопределённое время. .PP Если пул энтропии пуст, попытка чтения \fI/dev/random\fP приведёт к блокировке, пока не будет собран дополнительный окружающий шум. Если вызов \fBopen\fP(2) для \fI/dev/random\fP запускается с флагом \fBO_NONBLOCK\fP, то последующий \fBread\fP(2) не будет заблокируется, если количество запрашиваемых байт недостаточно. Вместо этого будут возвращены имеющиеся байты. Если ни одного байта нет, то \fBread\fP(2) вернёт \-1 и значение \fIerrno\fP станет равно \fBEAGAIN\fP. .PP При открытии \fI/dev/urandom\fP флаг \fBO_NONBLOCK\fP не учитывается. При вызове \fBread\fP(2) для устройства \fI/dev/urandom\fP чтение до 256 байт вернёт запрошенное количество байт и не будет прервано обработчиком сигнала. Чтение с буфером больше ограничения может вернуть количество байт меньше запрошенного или завершиться ошибкой \fBEINTR\fP при прерывании обработчиком сигнала. .PP .\" commit 79a8468747c5f95ed3d5ce8376a3e82e0c5857fc .\" SEC_XFER_SIZE in drivers/char/random.c Начиная с Linux 3.16, вызов \fBread\fP(2) может прочитать из \fI/dev/urandom\fP почти 32\ МБ. Из \fI/dev/random\fP будет прочитано не более 512 байт (340 байт для ядер Linux до версии 2.6.12). .PP При записи в \fI/dev/random\fP или \fI/dev/urandom\fP выполняется обновление пула энтропии записываемыми данными, но при этом не увеличивается счётчик энтропии. Это означает, что изменения отразятся в обоих файлах, но это не ускорит процесс чтения из \fI/dev/random\fP. .SS Использование Интерфейс \fI/dev/random\fP считается устаревшим, во всех случаях предпочтительно использовать \fI/dev/urandom\fP; исключением являются приложения, которым нужны произвольные байты во время загрузки системы; в таких приложениях нужно использовать \fBgetrandom\fP(2), так как этот вызов выполняет блокировку для ожидания наполнения пула энтропии. .PP .\" If a seed file is saved across reboots as recommended below, the output is cryptographically secure against attackers without local root access as soon as it is reloaded in the boot sequence, and perfectly adequate for network encryption session keys. (All major Linux distributions have saved the seed file across reboots since 2000 at least.) Since reads from \fI/dev/random\fP may block, users will usually want to open it in nonblocking mode (or perform a read with timeout), and provide some sort of user notification if the desired entropy is not immediately available. .SS Настройка Если в системе нет \fI/dev/random\fP и \fI/dev/urandom\fP, то их можно создать следующими командами: .PP .in +4n .EX mknod \-m 666 /dev/random c 1 8 mknod \-m 666 /dev/urandom c 1 9 chown root:root /dev/random /dev/urandom .EE .in .PP Когда Linux\-система запускается без участия человека, пул энтропии может оказаться в довольно предсказуемом состоянии. Это снижает значимый объём шума в пуле энтропии ниже оцениваемого. Для преодоления этого эффекта можно сохранять информацию пула энтропии во время выключения и восстанавливать во время запуска системы. Для этого добавьте строки в сценарий, который выполняется при запуске Linux\-системы: .PP .in +4n .EX echo "Инициализация генератора случайных чисел…" random_seed=/var/run/random\-seed # перенос случайного начального числа от запуска к запуску # загрузка и сохранение всего пула энтропии 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 .EE .in .PP Также добавьте следующие строки в сценарий, который выполняется при завершении работы Linux\-системы: .PP .in +4n .EX # перенос случайного начального числа от выключения до запуска # сохранение всего пула энтропии echo "Сохранение случайного начального числа…" 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 .EE .in .PP .\" В примерах выше мы предполагаем, что используется ядро Linux 2.6.0 или новее, в котором \fI/proc/sys/kernel/random/poolsize\fP содержит размер пула энтропии в битах (смотрите ниже). .SS "Интерфейс /proc" Файлы в каталоге \fI/proc/sys/kernel/random\fP (начиная с 2.3.16) предоставляют дополнительную информацию об устройстве \fI/dev/random\fP: .TP \fIentropy_avail\fP Файл доступен только для чтения и показывает количество бит доступной энтропии. Данное число находится в диапазоне от 0 до 4096. .TP \fIpoolsize\fP Файл содержит размер пула энтропии. Формат файла зависит от версии ядра: .RS .TP Linux 2.4: В файле содержится размер пула энтропии в \fIбайтах\fP. Обычно это число 512, но так как файл доступен на запись, значение можно изменить, подстроив его под доступный алгоритм. Возможные значения \(em 32, 64, 128, 256, 512, 1024 или 2048. .TP Linux 2.6 и новее: Файл доступен только на чтение и содержит размер пула энтропии в \fIбитах\fP. Значение равно 4096. .RE .TP \fIread_wakeup_threshold\fP В файле содержится количество бит энтропии, требуемое для пробуждения процессов, которые спят в ожидании энтропии из \fI/dev/random\fP. Значение по умолчанию равно 64. .TP \fIwrite_wakeup_threshold\fP В файле содержится количество бит энтропии, менее которого мы пробуждаем процессы, которые выполнили вызовы \fBselect\fP(2) или \fBpoll\fP(2) для ожидания записи в \fI/dev/random\fP. Эти значения можно изменить, записав новые числа в эти файлы. .TP \fIuuid\fP и \fIboot_id\fP .\" Эти файлы, доступные только для чтения, содержат произвольные строки вида 6fd5a44b\-35f4\-4ad4\-a9b9\-6b9be13e1fe9. Значение первого генерируется заново при каждом чтении, а значение второго генерируется только один раз. .SS "Интерфейс ioctl(2)" Для файловых дескрипторов, соединённых с файлами \fI/dev/random\fP и \fI/dev/urandom\fP, определены запросы \fBioctl\fP(2), перечисленные ниже. Все выполняемые запросы обращаются к входному пулу энтропии, который относится к и к \fI/dev/random\fP, и к \fI/dev/urandom\fP. Для выполнения всех запросов (кроме \fBRNDGETENTCNT\fP) требуется мандат \fBCAP_SYS_ADMIN\fP. .TP \fBRNDGETENTCNT\fP Возвращает счётчик энтропии входного пула, возвращается содержимое из файла \fIentropy_avail\fP в proc. Результат сохраняется в int, указанный в параметре. .TP \fBRNDADDTOENTCNT\fP Увеличивает или уменьшает счётчик энтропии входного пула на значение аргумента. .TP \fBRNDGETPOOL\fP Удалён из Linux 2.6.9. .TP \fBRNDADDENTROPY\fP Вносит дополнительную энтропию во входной пул, увеличивая счётчик энтропии. Запись в \fI/dev/random\fP или \fI/dev/urandom\fP добавляет только данные, но не увеличивает счётчик энтропии (в этом отличие). Используется следующая структура: .IP .in +4n .EX struct rand_pool_info { int entropy_count; int buf_size; __u32 buf[0]; }; .EE .in .IP Здесь \fIentropy_count\fP — добавляемое (или вычитаемое) значение к счётчику энтропии, а \fIbuf\fP — буфер с размером \fIbuf_size\fP, из которого в пул энтропии добавляются данные. .TP \fBRNDZAPENTCNT\fP, \fBRNDCLEARPOOL\fP Обнуляет счётчики всех пулов и добавляет в них некоторые системные данные (такие как время). .SH ФАЙЛЫ \fI/dev/random\fP .br \fI/dev/urandom\fP .SH ЗАМЕЧАНИЯ Обзор и сравнение возможных интерфейсов, через которые можно получать случайные данные, смотрите в \fBrandom\fP(7). .SH ДЕФЕКТЫ .\" .SH AUTHOR .\" The kernel's random number generator was written by .\" Theodore Ts'o (tytso@athena.mit.edu). Во время начальной загрузки ОС чтение из \fI/dev/urandom\fP может возвращать данные до инициализации пула энтропии. .SH "СМ. ТАКЖЕ" \fBmknod\fP(1), \fBgetrandom\fP(2), \fBrandom\fP(7) .PP RFC\ 1750, "Randomness Recommendations for Security" .SH ЗАМЕЧАНИЯ Эта страница является частью проекта Linux \fIman\-pages\fP версии 5.10. Описание проекта, информацию об ошибках и последнюю версию этой страницы можно найти по адресу \%https://www.kernel.org/doc/man\-pages/. .PP .SH ПЕРЕВОД Русский перевод этой страницы руководства был сделан aereiae , Azamat Hackimov , Dmitriy S. Seregin , Katrin Kutepova , Lockal , Yuri Kozlov , Баринов Владимир и Иван Павлов . .PP Этот перевод является бесплатной документацией; прочитайте .UR https://www.gnu.org/licenses/gpl-3.0.html Стандартную общественную лицензию GNU версии 3 .UE или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ. .PP Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на .MT man-pages-ru-talks@lists.sourceforge.net .ME .