Поиск по сайту:

Как настроить дополнительную энтропию для облачных серверов с помощью Haveged


Краткое введение в энтропию и случайность

Генератор псевдослучайных чисел Linux (PRNG) — это специальное устройство, которое генерирует случайные числа из аппаратных прерываний (клавиатура, мышь, дисковый/сетевой ввод-вывод) и других источников операционной системы. Эта случайность используется в основном для шифрования, такого как SSL/TLS, но также имеет множество других применений. Даже такая простая вещь, как программа для броска пары виртуальных игральных костей, зависит от энтропии для качественной случайности.

Когда пулы энтропии иссякают

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

  • Веб-сервер
  • Сервер входящей/исходящей почты
  • SSH/SFTP

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

Решение Userland для заполнения пулов энтропии

Linux уже получает случайные данные очень хорошего качества из вышеупомянутых аппаратных источников, но, поскольку безголовая машина обычно не имеет клавиатуры или мыши, генерируется гораздо меньше энтропии. Дисковый и сетевой ввод-вывод представляют собой большинство источников генерации энтропии для этих машин, и они производят очень небольшое количество энтропии. Поскольку очень немногие безголовые машины, такие как серверы или облачные серверы/виртуальные машины, имеют какое-либо специальное аппаратное решение RNG, существует несколько пользовательских решений для создания дополнительной энтропии с использованием аппаратных прерываний от устройств, которые «более шумны», чем жесткие диски, например видеокарты. , звуковые карты и т. д. К сожалению, это еще раз оказывается проблемой для серверов, поскольку они обычно не содержат ни того, ни другого. различия во времени выполнения кода на процессоре.Поскольку практически невозможно, чтобы одна часть кода выполнялась в одно и то же время, даже в одной и той же среде на одном и том же оборудовании, время выполнения одной или нескольких программ должно подходить для посеять случайный источник Реализация hasged посеет случайный источник вашей системы (обычно /dev/random), используя различия в счетчике отметок времени ваших процессоров (TSC). ) после повторного выполнения цикла. Хотя это звучит так, как будто это должно привести к созданию предсказуемых данных, вы можете быть удивлены, увидев результаты теста FIPS в нижней части этой статьи.

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

Вы можете легко установить hasged на Debian и Ubuntu, выполнив следующую команду:

# apt-get install haveged

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

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

DAEMON_ARGS="-w 1024"

Наконец, просто убедитесь, что он настроен на запуск при загрузке:

# update-rc.d haveged defaults

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

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

После того, как вы установили и включили репозиторий EPEL (в RHEL/CentOS), вы можете установить hasged, выполнив следующую команду:

# yum install haveged

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

# chkconfig haveged on

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

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

# tar zxvf /path/to/haveged-x.x.tar.gz

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

# cd /path/to/haveged-x.x
# ./configure
# make
# make install

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

# Autostart haveged
/usr/local/sbin/haveged -w 1024

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

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

После минимальной работы по установке/настройке у вас должна быть работающая установка haveged, а пул энтропии вашей системы уже должен наполняться из-за создаваемой им случайности. Безопасность не была бы безопасностью, если бы вы слепо доверяли другим и их утверждениям об эффективности, так почему бы не проверить ваши случайные данные с помощью стандартного теста? Для этого теста хорошо используйте метод FIPS-140, используемый rngtest, доступный в большинстве или во всех основных дистрибутивах Linux под различными именами пакетов, такими как rng-tools:

# cat /dev/random | rngtest -c 1000

Вы должны увидеть вывод, подобный следующему:

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 можно ожидать 998-1000 успехов.

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

# cat /proc/sys/kernel/random/entropy_avail