Что такое доступная энтропия в линукс

Обновлено: 06.07.2024

Чтобы обновить некоторые из моих комментариев в ответе Кайла - Одна из причин, по которой компьютеры Mac не отображают эту информацию, заключается в том, что она не нужна (в большинстве случаев). Системы Linux будут блокировать вызовы, /dev/random если в пуле недостаточно энтропии. На компьютерах Mac он периодически добавляет данные в пул энтропии с помощью SecurityServer демона.

Тем не менее, он также отмечает, что если демон по какой-то причине дает сбой, качество вывода будет ухудшаться без каких-либо признаков сбоя :

Однако качество его продукции зависит от регулярного добавления соответствующей энтропии. Если SecurityServer системный демон по какой-либо причине дает сбой, качество вывода со временем ухудшится без каких-либо явных указаний самого случайного устройства.

Таким образом, даже несмотря на то, что количество энтропии не может быть легко доступно, это не значит, что его там нет, и могут быть случаи, когда его знания могут быть полезны.

Мне просто нужно убедиться, что есть достаточно, чтобы использовать.

Это не решение, а пояснение того, как энтропия собирается и используется в Linux.

Linux на самом деле имеет два разных пула энтропии:

/dev/random и /dev/urandom .

Первый представляет собой настоящий случайный пул, питаемый системными источниками энтропии.
Последний - больше PRNG, такой как найденный на BSD и OS X.

Однако даже случайный случай требует наличия «реальной» случайной энтропии для получения качественных псевдослучайных данных. В последних ядрах полное отсутствие энтропии в / dev / random по-прежнему не будет блокировать urandom, но urandom будет повторно использовать последнее действительное начальное число, пока не станет доступным больше энтропии. Поскольку urandom является неблокирующим, большинство сервисов, которым требуется постоянный поток энтропии, используют его, а не полагаются на / dev / random.

Mac OS X просто использует Yarrow . Даже FreeBSD пошел дальше и переключился на улучшенную версию под названием «Fortuna».

Сила тысячелистника ограничена размером ключа. Например, Yarrow-160 имеет эффективный размер ключа 160 бит. Если безопасность требует 256 бит, Ярроу-160 не способен выполнить эту работу.

В общем, это еще одно напоминание, что приоритеты Apple не включают безопасность / надежность или что-то подобное.

Mac OS X, как и FreeBSD, не зависит от внешних источников энтропии. Вместо этого он использует генератор псевдослучайных чисел, основанный на алгоритме Ярроу . Поскольку он использует алгоритм, а не пул энтропии, нет необходимости убедиться, что энтропии «достаточно» - вы всегда сможете читать из / dev / random без блокировки .

Итак, чтобы ответить на ваш вопрос, если вы не «параноик» и вам не нужно основывать свою энтропию на внешних источниках (нажатия клавиш / движения мыши / и т.д.), в этом случае вы должны сделать это самостоятельно, количество доступной энтропии для / dev / случайное использование всегда бесконечно.

В Linux есть два общих устройства: /dev/random и /dev/urandom. Случайность создаётся инструментом /dev/random (он предназначен для блокирования) и ожидает соответствующего уровня энтропии для своего вывода. Если энтропия находится на достаточном уровне, /dev/urandom произведёт такой же уровень случайности; однако /dev/urandom продолжит генерировать случайные данные (поскольку является неблокирующим устройством) даже если пул энтропии иссякает. Это может привести к снижению качества случайностей и увеличивает шансы повтора предыдущих данных. Снижение уровня энтропии очень опасно для производственного сервера, особенно если этот сервер выполняет криптографические функции. Для примера предположим, что существует облачный сервер, на котором запущены следующие демоны (все они используют SSL/TLS или блочные шифры):

Если какому-либо из этих демонов понадобится случайность в тот момент, когда энтропия иссякла, он перейдёт в режим ожидания, что может вызвать чрезмерные задержки в работе приложения. И это ещё не всё: многие современные приложения в такой ситуации могут либо обратиться к собственным случайным данным, созданным при инициализации программы, либо использовать /dev/urandom, чтобы избежать блокирования, что станет причиной снижения надежности случайных данных. Это может отрицательно повлиять на безопасность соединений и увеличивает шансы криптографической атаки.

Пользовательское решение для заполнения пулов энтропии

Linux уже предоставляет довольно качественные случайные данные при помощи вышеописанного ПО, но поскольку автономные компьютеры обычно не имеют клавиатуры или мыши, генерируемая на них энтропия гораздо ниже, поскольку создаётся диском или I/O сети. Очень немногие автономные машины имеют специальное аппаратное обеспечение для ГСЧ, поэтому существует несколько пользовательских решений для создания дополнительной энтропии при помощи аппаратных прерываний, т.к. некоторые устройства (например, звуковые и видеокарты) создают больше так называемого «шума», чем жёсткий диск. К сожалению, даже это не решает проблему виртуальных серверов. Но тут на помощь приходит инструмент haveged. Основанный на алгоритме HAVEGE (а ранее – на его библиотеке), haveged позволяет генерировать случайные данные, руководствуясь изменениями во времени выполнения кода на процессоре. Так как обработать один и тот же блок кода в течение точно такого же времени почти невозможно (даже в той же среде на том же оборудовании), сроки выполнения одной или нескольких программ отлично подходят для генерации случайных данных. Инструмент haveged создаёт источник случайных данных с учетом различий в счётчика времени процессора (TSC) после неоднократного выполнения цикла. Сначала может показаться, что в конечном итоге он может создать предсказуемые данные; одна из целей данного руководства – опровергнуть это заблуждение.

Установка haveged в Debian/Ubuntu

Установить haveged в Debian или Ubuntu можно при помощи простой команды:

Примечание: Если этот пакет недоступен из репозитория, придётся скомпилировать его из исходников (об этом – в отдельном разделе руководства).

После установки пакета можно просто отредактировать конфигурационный файл, расположенный в /etc/default/haveged; установите следующие опции (если они не установлены по умолчанию):

В завершение настройте автоматический запуск программы:

Установка haveged в RHEL/CentOS/Fedora

Чтобы установить haveged в системы RHEL или CentOS, нужно добавить репозиторий EPEL, руководствуясь инструкциями официального сайта.

Примечание: Пользователям Fedora не нужно добавлять EPEL.

Установив и включив EPEL, установите haveged при помощи команды:

Пользователи Fedora могут сразу запустить эту команду. Как правило, стандартные настройки не нуждаются в редактировании, потому просто настройте автоматический запуск haveged при загрузке системы:

Установка haveged из исходного кода

Не все системы имеют доступ к предварительно упакованным двоичным файлам haveged. В таком случае нужно использовать tarball исходного кода. На самом деле, это довольно просто. Сначала нужно посетить страницу загрузки и выбрать последний релиз тарбола (на момент написания статьи это 1.7). Загрузив тарбол, распакуйте его в текущий рабочий каталог.

Теперь можно скомпилировать и установить его:

По умолчанию haveged устанавливается с префиксом /usr/local, потому нужно добавить в /etc/rc.local (или аналог в вашей системе) следующее, чтобы настроить автоматический запуск программы при загрузке системы:

Примечание: В случае необходимости отредактируйте путь.

Запустите ту же команду вручную как root, чтобы запустить демон без перезагрузки системы (или же просто перезапустите систему, если вы используете Windows-подобную систему).

Тестирование энтропии и качества случайных данных

На экране появится следующий вывод:

rngtest 2-unofficial-mt.14
Copyright (c) 2004 by Henrique de Moraes Holschuh
This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
rngtest: starting FIPS tests.
rngtest: bits received from input: 20000032
rngtest: FIPS 140-2 successes: 999
rngtest: FIPS 140-2 failures: 1
rngtest: FIPS 140-2(2001-10-10) Monobit: 0
rngtest: FIPS 140-2(2001-10-10) Poker: 0
rngtest: FIPS 140-2(2001-10-10) Runs: 1
rngtest: FIPS 140-2(2001-10-10) Long run: 0
rngtest: FIPS 140-2(2001-10-10) Continuous run: 0
rngtest: input channel speed: (min=1.139; avg=22.274; max=19073.486)Mibits/s
rngtest: FIPS tests speed: (min=19.827; avg=110.859; max=115.597)Mibits/s
rngtest: Program run time: 1028784 microseconds

Чтобы протестировать доступную энтропию, запустите команду:

Демон haveged заполнит пул энтропии, как только значение доступных битов приблизится к 1024. Таким образом, хотя это число будет колебаться, оно не опустится ниже 1000 или около того, если только вы не используете слишком много случайных данных (для генерации ключей SSH, и т.д.).

У меня есть тонна процессов, работающих в фоновом режиме, чтобы попытаться получить достаточную энтропию, но я все еще терпеть неудачу.

Мне нужен метод генерации ключа, который работает, потому что я пытаюсь сделать, по-видимому, не работает.

Типы Fedora /Rh /Centos: sudo yum install rng-tools

В типах deb: sudo apt-get install rng-tools , чтобы настроить его.

Затем запустите sudo rngd -r /dev/urandom , прежде чем генерировать ключи.

Мне удалось сгенерировать ключ

В другом окне SSH откройте

Вернитесь к первому сеансу SSH и запустите

Пусть это запустится до тех пор, пока gpg не генерирует ваши ключи!

Чтобы проверить количество доступных в настоящее время байтов энтропии, используйте

Ведро энтропии имеет размер 4096 байт, что очень быстро может быть истощено.

и передвиньте мышь. Вы увидите, что «readspeed» опустошает ведро энтропии, как только оно заполняется, а когда вы перемещаете мышь, оно немного заполняется.

Пытаясь использовать разные методы, кажется, что ввод клавиатуры и движения мыши являются наиболее эффективными для пополнения этого ведра. Сетевые передачи и копии жесткого диска не имеют большого влияния.

В случае, если вы застряли в такой ситуации, как я, - у вас нет прав на установку нового программного обеспечения (rng-tools) на безголовом сервере с практически отсутствующим оборудованием ввода (звуковая карта, клавиатура, мышь). Вы можете запустить этот простой код с другого терминала, подключенного к тому же серверу, для добавления в энтропию. Не имеет значения, запускаете ли вы это до или после запуска gpg --gen-key

Первая строка - начать новую оболочку bash с меньшим приоритетом (мне нужно быть приятным на сервере, который используется многими пользователями). Цикл до бесконечности, поэтому не забудьте разбить его, как только генерируется ключ. Все, что он делает, приводит к тому, что сетевой трафик увеличивает энтропию. Он также контролирует счетчик entropy_avail, чтобы показать, как он заполняется и опустошается с другой стороны gpg. В моем случае счетчик быстро заполнился до 64 и снова опустел до 0 (угадайте, что gpg поднимается в куске 64). Я ожидал 4096 бит генерации ключей более 3 часов на сервере. После запуска этого скрипта он завершился менее чем за 5 минут.

Я был связан и решил генерировать энтропию на моем безголовом сервере Ubuntu 14.04, чтобы сгенерировать ключ 4096 с помощью gpg --gen-key

Существует пакет для генерации энтропии под названием hasged. Пример установки:

sudo apt-get install haveged

Мне пришлось sudo apt-get install rng-tools , так как это зависимость в следующем тесте.

Пример теста, чтобы узнать, генерируется ли энтропия посредством hasged:

cat /dev/random | rngtest -c 1000

он возвращает число, которое указывает, сколько "энтропии" доступно ядру, но это все, что я знаю. В какой единице измеряется эта энтропия? Для чего это используется? Мне сказали, что "плохо", если это число "низкое". Насколько низко «низко» и какие «плохие» вещи произойдут, если это так? Каков хороший диапазон для этого? Как это определяется?

Ваша система собирает некоторые «реальные» случайные числа, отслеживая различные события: сетевую активность, аппаратный генератор случайных чисел (если имеется; например, процессоры VIA обычно имеют «настоящий» генератор случайных чисел) и так далее. If передает их в пул энтропии ядра, который используется / dev / random. Приложения, которые нуждаются в особой защите, обычно используют / dev / random в качестве источника энтропии или, другими словами, в качестве источника случайности.

Если / dev / random исчерпает имеющуюся энтропию, он не сможет выдавать больше случайности, и приложение ожидает случайности, пока не появится больше случайных вещей. Пример, который я видел за свою карьеру, это то, что демон Cyrus IMAP хотел использовать / dev / random для случайности, а его сеансы POP хотели генерировать случайные строки в соединениях APOP из / dev / random. В загруженной среде было больше попыток входа в систему, чем трафика для подачи / dev / random -> все застопорилось. В этом случае я установил rng-tools и активировал имеющийся у него rngd - который сдвигал полуслучайные числа из / dev / urandom в / dev / random, если в / dev / random закончилась «реальная» энтропия.

Если вам нужен более простой обзор основной проблемы: некоторым приложениям (таким как шифрование) нужны случайные числа. Вы можете генерировать случайные числа, используя алгоритм - но хотя они кажутся случайными в одном смысле, они полностью предсказуемы в другом. Например, если я дам вам цифры 58209749445923078164062862089986280348253421170679, они выглядят довольно случайными. Но если вы поймете, что они на самом деле цифры ПИ, то вы будете знать, что следующим будет 8.

Для некоторых приложений это нормально, но для других приложений (особенно связанных с безопасностью) люди хотят подлинной непредсказуемой случайности - которая не может быть сгенерирована алгоритмом (то есть программой), так как это по определению предсказуемо. Это проблема в том, что ваш компьютер по сути является программой, так как он может получить подлинные случайные числа? Ответ заключается в том, чтобы измерить действительно случайные события из внешнего мира - например, разрывы между вашими нажатиями клавиш и использовать их для введения подлинной случайности в иначе предсказуемый генератор случайных чисел. «Энтропийный пул» можно рассматривать как хранилище этой случайности, которая накапливается при нажатии клавиш (или что-то еще используется) и истощается при генерации случайных чисел.

Но PI иррациональна, и она будет включать в себя каждую последовательность, включая вышеуказанную последовательность, за которой следует 9 (вместо 8).

Энтропия - это технический термин для «Случайности». Компьютеры на самом деле не генерируют энтропию, а собирают ее, рассматривая такие вещи, как вариации скорости вращения жесткого диска (физические явления, которые очень трудно предсказать из-за трения и т. Д.) Когда компьютер хочет генерировать псевдослучайные данные, он будет Заполнить математическую формулу с истинной энтропией, которую она нашла, измеряя щелчки мыши, вариации вращения жесткого диска и т. д. Грубо говоря, entropy_avail это мера битов, доступных в настоящее время для чтения из /dev/random

Компьютеру требуется время для считывания энтропии из окружающей среды, если у него нет классного оборудования, такого как шумный диод или что-то в этом роде.

Если у вас есть 4096 битов энтропии, и вы /dev/random можете рассчитывать, что сможете прочитать 512 байт энтропии (4096 битов) до того, как файл блокируется, пока он ожидает большей энтропии.

Например, если вы « cat /dev/random », ваша энтропия сократится до нуля. Сначала вы получите 512 байт случайного мусора, но он остановится, и постепенно вы увидите больше случайных данных.

Читайте также: