Haveged Linux что это такое
Обновлено: 21.11.2024
При поиске решений проблемы истощения пула энтропии на виртуальных машинах я наткнулся на интересный проект под названием haveged , основанный на алгоритме HAVEGE (Hardware Volatile Entropy Gathering and Expansion). Это довольно фантастическое утверждение.
HAVEGE – это генератор случайных чисел, который использует модификации внутренних аппаратных состояний ЦП (кеши, предсказатели ветвлений, TLB) как источник неопределенности. На этапе инициализации аппаратный счетчик тактов процессора используется для сбора части этой энтропии: в среднем за вызов операционной системы могут быть собраны десятки тысяч непредсказуемых битов.
Если это действительно производит почти неограниченную высококачественную энтропию на безголовых виртуальных машинах, это должно быть включено в каждый дистрибутив сервера по умолчанию! И все же некоторые люди выразили обеспокоенность.
Более того, популярные тесты NIST и ENT иногда дают результат ПРОШЕЛ, даже если они намеренно неправильно настроены и на самом деле не выдают случайные числа!
Я заменил макрос «HARDTICKS» в HAVEGE на константу 0 (ноль), вместо того чтобы читать счетчик отметок времени процессора. Это сразу же провалило тест на случайность. Однако, когда я вместо этого использовал константу 1 (один), тест ent прошел. И даже nist почти прошел только с одним пропущенным тестом из 426 выполненных тестов. (Источник: оценка случайности HAVEGE на engbloms.se).
- Итак, какие платформы/гипервизоры для виртуализации безопасно использовать с хеджем на виртуальной машине?
- И существует ли общепринятый передовой способ проверки того, дает ли источник случайности достаточно качественные числа?
haveged включен в большинство репозиториев, хотя некоторые версии могут быть довольно старыми. В версии 1.5 появилось тестирование AIS31.
3 ответа 3
(Предостережение: я, конечно же, не утверждаю, что HAVEGE оправдывает свои заявления. Я не проверял их теорию или реализацию.)
Чтобы добиться случайности, HAVEGE и аналогичные системы используют "физические события", в частности время физических событий. К таким событиям относятся аппаратные прерывания (которые, в свою очередь, собирают данные о нажатиях клавиш, движениях мыши, входящих ethernet-пакетах, времени, необходимом жесткому диску для выполнения запроса на запись). HAVEGE также утверждает, что питается всеми типами промахов кэша, которые происходят в ЦП (кэш L1, кэш L2, TLB, предсказание переходов); поведение этих элементов зависит от того, что ЦП делал в предыдущие несколько тысяч тактовых циклов, поэтому существует вероятность некоторой «случайности». Это зависит от возможности измерять текущее время с большой точностью (не обязательно с точностью), и именно здесь в игру вступает инструкция rdtsc. Он возвращает текущее содержимое внутреннего счетчика, который увеличивается на каждый тактовый цикл, поэтому обеспечивает точность менее наносекунды.
Для системы виртуальной машины есть три варианта этой инструкции:
- Пусть инструкции поступают напрямую к оборудованию.
- Перехватить инструкцию и эмулировать ее.
- Полностью отключить инструкцию.
Если диспетчер виртуальных машин выбирает первое решение, тогда rdtsc имеет всю необходимую точность и должен работать так же, как если бы он был на физической машине, с целью сбора энтропии из аппаратных событий. Однако, поскольку это виртуальная машина, это приложение в хост-системе; он не получает процессор все время. С точки зрения гостевой операционной системы, использующей rdtsc , это выглядит так, как будто ее ЦП иногда «воровали»: две последовательные инструкции rdtsc, номинально разделенные одним тактовым циклом, могут сообщать об увеличении счетчика на несколько миллионы. Короче говоря, когда rdtsc просто применяется к оборудованию, гостевая ОС может использовать его для обнаружения наличия гипервизора.
Второе решение предназначено для того, чтобы сделать эмуляцию более «совершенной» за счет поддержки виртуального счетчика циклов для каждой ВМ, который отслеживает количество циклов, реально выделенных для этой ВМ. Положительным моментом является то, что rdtsc с точки зрения гостя больше не будет проявлять эффект «украденных циклов». Недостатком является то, что эта эмуляция выполняется путем запуска и перехвата исключения ЦП, что увеличивает стоимость кода операции rdtsc с нескольких десятков тактов (это зависит от марки ЦП; некоторые выполняют rdtsc менее чем за 10 циклов, другие используют 60 или 60 тактов). 70 циклов) до более тысячи циклов. Если гость попытается сделать много rdtsc (что будет склонно делать HAVEGE), то он замедлится до сканирования.Более того, код обработки исключений нарушит меру; вместо измерения времени аппаратного события код будет измерять время выполнения обработчика исключений, что предположительно может снизить качество извлеченной случайности.
Третье решение (отключение rdtsc ) просто не позволит HAVEGE вернуть правильную случайность. Поскольку внутри используется PRNG, выходные данные все равно могут обмануть инструменты статистического анализа, потому что существует огромная разница между «выглядеть случайным» и «быть непредсказуемым» (инструменты статистического анализа следуют пути «выглядеть случайным», но криптографическая безопасность полагается на непредсказуемость). ).
В руководстве VirtualBox утверждается, что VirtualBox по умолчанию следует первому методу ( rdtsc безоговорочно разрешен и применяется к оборудованию напрямую), но может быть настроен для применения второго решения (которое вам не нужно в данном случае). ).
Чтобы проверить, что делает ваша виртуальная машина, вы можете попробовать эту небольшую программу (скомпилировать с gcc -W -Wall -O в Linux; -O важен):
На невиртуальной машине с "настоящим" rdtsc это должно сообщать значение от 10 до 100, в зависимости от марки процессора. Если сообщаемое значение равно 0 или происходит сбой программы, то rdtsc отключен. Если значение исчисляется тысячами, то rdtsc эмулируется, что означает, что сбор энтропии может работать не так, как ожидалось.
Обратите внимание, что даже получение значения от 10 до 100 не является гарантией того, что rdtsc не эмулируется, поскольку диспетчер ВМ, поддерживая свой виртуальный счетчик, может вычесть из него ожидаемое время, необходимое для выполнения обработчика исключений. В конце концов, вам действительно нужно внимательно изучить руководство и конфигурацию вашего диспетчера виртуальных машин.
Конечно, идея HAVEGE в целом сомнительна. Для любой практической безопасности вам нужно несколько «настоящих случайных» битов, не более 200, которые вы используете в качестве начального числа в криптографически безопасном PRNG. PRNG создаст гигабайты псевдо-алей, неотличимых от истинной случайности, и этого достаточно для всех практических целей.
Настаивать на том, чтобы каждый бит возвращаться к аппаратному обеспечению, выглядит как очередная вспышка этой ошибочной идеи, которая рассматривает энтропию как своего рода бензин, который вы сжигаете, когда смотрите на него.
Алгоритм HAVEGE (Hardware Volatile Entropy Gathering and Expansion) собирает косвенные эффекты аппаратных событий на скрытое состояние процессора (кеши, предикторы ветвлений, таблицы преобразования памяти и т. д.) для создания случайной последовательности. Влияние обслуживания прерываний на состояние процессора видно из пользовательской среды как временные изменения скорости выполнения программы. Используя вычисление с большим количеством ветвлений, которое заполняет инструкции процессора и кэш данных, источник таймера с высоким разрешением, такой как счетчик отметок времени процессора, может генерировать случайную последовательность даже в «бездействующей» системе.
В Linux аппаратные события, которые являются конечным источником любой последовательности случайных чисел, объединяются устройством /dev/random для последующего распространения через интерфейс устройства. Стандартный механизм сбора случайных данных для пула может оказаться недостаточным для удовлетворения спроса, особенно в тех системах с высокими потребностями или ограниченным взаимодействием с пользователем. Haveged предоставляет демона для заполнения /dev/random всякий раз, когда запас случайных битов в /dev/random падает ниже нижней отметки устройства.
Haveged также предоставляет прямой интерфейс файловой системы для механизма сбора данных, который полезен и в других случаях, когда доступ к интерфейсу dev/random либо недоступен, либо неуместен.
В любом случае hasged использует HAVEGE для поддержки 1 М пула случайных байтов, используемых интерфейсом. Основными входными данными для havaged являются размеры инструкций процессора и кэшей данных, используемых для настройки сборщика HAVEGE. По умолчанию hasged — это кэш данных 4 КБ и кэш инструкций 16 КБ. На машинах с инструкцией cpuid hasged попытается выбрать соответствующие значения из внутренних таблиц.
Хотя архитектуры CISC кажутся нечувствительными к параметрам настройки, нет гарантии, что в некоторых обстоятельствах не потребуется ручная настройка алгоритма. Выходные данные генератора случайных чисел HAVEGE должны быть проверены на любой установке, прежде чем хэгедж будет запущен в производство.
Параметры
-d nnn, --data=nnn Установить размер кэша данных равным nnn КБ. По умолчанию 16 или как определено cpuid. -f файл, --file=файл Установить путь к выходному файлу для использования без демона. По умолчанию используется «sample», используйте «-» для стандартного вывода. -i nnn, --inst=nnn Установить размер кэша инструкций равным nnn КБ. По умолчанию 16 или как определено cpuid. -n nnn, --number=nnn Установить количество байтов, записываемых в выходной файл. Значение может быть указано с использованием одного из суффиксов k, m, g или t. Верхняя граница этого значения — «16t» (2^44 байта = 16 ТБ). Значение 0 указывает на неограниченный вывод и переводит вывод в стандартный вывод. -r n, --run=n Установить уровень запуска для интерфейса демона:
n = 0 Запуск от имени демона — должен быть root.Заполняет /dev/random, когда запас случайных битов падает ниже нижней отметки устройства. Этот аргумент необходим, если
интерфейс демона отсутствует. Если интерфейс демона присутствует, он имеет
приоритет над любым значением -r.
n = 1 Показать информацию о конфигурации и завершить работу.
n > 1 Записать килобайт вывода. Устарело (вместо этого используйте -n), предназначено только для обратной совместимости. -v n, --verbose=n Установить уровень вывода 0=минимальный, 1=элементы конфигурации/заполнения, использовать -1 для всех диагностик. -w nnn, --write=nnn Установить write_wakeup_threshold интерфейса демона равным nnn битам. Применяется только к уровню запуска 0. -?, --help Это сводка параметров программы.
haveged: Генерация случайных чисел и передача случайных устройств Linux.
Команда для отображения руководства haveged в Linux: $ man 8 haveged
ОБЗОР
ОПИСАНИЕ
haveged генерирует непредсказуемый поток случайных чисел, собранных в результате косвенного воздействия аппаратных событий на скрытое состояние процессора (кеши, предсказатели ветвлений, таблицы трансляции памяти и т. д.), используя алгоритм HAVEGE (Hardware Volatile Entropy Gathering and Expansion). Алгоритм работает в пользовательском пространстве, для доступа файловой системы к выходному потоку не требуются специальные привилегии.
Linux объединяет случайные данные для распространения через интерфейсы устройств /dev/random и /dev/urandom. Стандартных механизмов заполнения пула /dev/random может оказаться недостаточно для удовлетворения потребностей систем с высокими потребностями или ограниченным взаимодействием с пользователем. В таких случаях haveged может запускаться как привилегированный демон для заполнения пула /dev/random всякий раз, когда запас случайных битов в /dev/random падает ниже нижней отметки устройства.
haveged подстраивается под свою среду и предоставляет тот же встроенный набор тестов для выходного потока, который используется на сертифицированных аппаратных устройствах безопасности. Дополнительные сведения см. в ПРИМЕЧАНИЯХ ниже.
ВАРИАНТЫ
-b nnn, --buffer=nnn Установить размер буфера коллекции nnn KW. По умолчанию 128 кВт (или 512 КБ). -d nnn, --data=nnn Установить размер кэша данных равным nnn КБ. По умолчанию 16 или определяется динамически. -f файл, --file=файл Установить путь к выходному файлу для использования без демона. По умолчанию — «sample», используйте «-» для стандартного вывода. -F , --Foreground Запустить демон на переднем плане. Не разветвляйтесь и не отсоединяйтесь. -i nnn, --inst=nnn Установить размер кэша инструкций равным nnn КБ. По умолчанию 16 или определяется динамически. -n nnn, --number=nnn Установить количество байтов, записываемых в выходной файл. Значение может быть указано с использованием одного из суффиксов k, m, g или t. Верхняя граница этого значения — «16t» (2^44 байта = 16 ТБ). Значение 0 указывает на неограниченный вывод и переводит вывод в стандартный вывод. Этот аргумент требуется, если интерфейс демона отсутствует. Если присутствует интерфейс демона, этот параметр имеет приоритет над любым значением --run. -o , --onlinetest= Указать онлайн-тесты для запуска. Он состоит из необязательных непрерывных групп «t»ot и «c», каждая группа указывает процедуры, которые необходимо выполнить, используя «a» для обозначения варианта процедуры AIS-31 и «b» для обозначения процедуры AIS B. Спецификации не зависят от порядка (процедура B всегда выполняется первой в каждой группе) и нечувствительны к регистру. Существуют вариации, чтобы смягчить тест медленной автокорреляции (test5). Обычно все тесты процедуры A, кроме первого, повторяются 257 раз. Параметр a указывает, что test5 должен выполняться только каждый раз по модулю в течение 257 повторений процедуры. Эффект настолько заметен, что обычно выбирают формат A8.
Тесты "tot" запускаются только при инициализации - это не влияет на производительность, за исключением небольшого увеличения времени, необходимого для инициализации. Тесты "tot" гарантируют, что haveged инициализирован правильно. Использование обеих тестовых процедур в тесте "tot" настоятельно рекомендуется, поскольку эти два теста подчеркивают разные аспекты качества ГСЧ.
При непрерывном тестировании последовательность тестов многократно повторяется. Например, строка «tbca8b» (подходящая для устройства AIS NTG.1) будет запускать процедуру B для теста «tot», а затем непрерывно переключаться между процедурой A8 и процедурой B для всех дальнейших выходных данных. Непрерывное тестирование не является бесплатным, поскольку влияет как на пропускную способность, так и на потребление ресурсов. Непрерывное тестирование также открывает возможность провала теста. Строгая процедура повторных попыток восстанавливает ложный сбой во всех случаях, кроме самых экстремальных. Если повторная попытка не удалась, операция завершится, если только к тестовому токену не будет добавлена буква «w», чтобы сделать тест только рекомендательным. В приведенном выше примере строка «tbca8wbw» сделает все непрерывные тесты рекомендательными. Для получения более подробной информации о повторных попытках AIS см. ПРИМЕЧАНИЯ ниже.
Полный контроль над тестовой конфигурацией обеспечивает гибкость. Значения по умолчанию («ta8bcb», если запущен как демон, и «ta8b» в противном случае) подходят для большинства случаев.
-p файл, --pidfile=файл Установить путь к файлу pid демона. По умолчанию "/var/run/haveged.pid", -r n, --run=n Установить уровень запуска для интерфейса демона:
n = 0 Запуск от имени демона — должен быть root. Заполняет /dev/random, когда количество случайных битов
падает ниже нижней отметки устройства.
n = 1 Показать информацию о конфигурации и завершить работу.
n > 1 Записать килобайт вывода. Устарело (вместо этого используйте --number), предназначено только для обратной совместимости.
Если указано --number, значения, отличные от 0,1, игнорируются. По умолчанию 0. -v n, --verbose=n Установить диагностический битовый массив как сумму следующих параметров:
1=Показать сводку сборки/настройки при завершении, сводку для повторных попыток онлайн-тестирования.
2=Показать подробности повторной попытки онлайн-теста
4=Показать время для коллекций
8=Показать макет цикла сбора
16=Показать смещения кода цикла коллекции
32=Показать все сведения о завершении онлайн-теста
По умолчанию 0. Используйте -1 для всех диагностических данных. -w nnn, --write=nnn Установить write_wakeup_threshold интерфейса демона равным nnn битам. Применяется только к уровню запуска 0. -?, --help Это сводка параметров программы.
ПРИМЕЧАНИЯ
haveged настраивает алгоритм HAVEGE для максимальной эффективности, используя иерархию значений по умолчанию, параметры командной строки, информацию о виртуальной файловой системе и информацию о процессоре, если она доступна. В большинстве случаев для достижения отличных результатов не требуется ввод данных пользователем.
Тестирование во время выполнения гарантирует правильную работу hasged. Набор тестов во время выполнения создан по образцу спецификации AIS-31 немецкого органа по общим критериям (BIS). Эта спецификация обычно применяется к аппаратным устройствам, требующим формальной сертификации, обязательного запуска и непрерывного эксплуатационного тестирования. Поскольку hasged работает на многих различных аппаратных платформах, сертификация не может быть целью, но набор тестов AIS-31 предоставляет средства для оценки выходных данных hasged с помощью тех же рабочих тестов, которые применяются к сертифицированным аппаратным устройствам.
Процедура тестирования AIS A выполняет 6 тестов для проверки статистически незаметного поведения. Процедура тестирования AIS B выполняет больше теоретических тестов, таких как проверка вероятностей многоступенчатого перехода и эмпирическая оценка энтропии. Процедура A требует гораздо больше ресурсов и вычислительных ресурсов, но все же рекомендуется для предварительных тестов. Процедура B хорошо подходит для использования haveged в качестве демона, поскольку тестовая оценка энтропии подтверждает оценку энтропии, которую использует haveged при добавлении энтропии к устройству /dev/random.
Идеальных тестов не бывает. Существует вероятность 10e-4 того, что идеальный генератор не пройдёт ни одну из процедур испытаний. AIS-31 предписывает строгую политику повторных попыток для фильтрации ложных срабатываний, а hasged всегда регистрирует сбои процедуры тестирования. Повторные попытки ожидаются, но наблюдаются редко, за исключением случаев, когда при непрерывном тестировании создаются большие наборы данных. См. примечания к libhavege(3) для более подробной информации.
ФАЙЛЫ
При работе в качестве демона требуется доступ к следующим файлам
ДИАГНОСТИКА
Haveged возвращает 0 в случае успеха и ненулевое значение в случае неудачи. Код возврата сбоя — 1 «общий сбой», если выполнение не прерывается сигналом, в этом случае код возврата будет 128 +. При ненулевом завершении в stderr выдаются следующие диагностические сообщения:
Не удается перейти в фоновый режим. Ошибка вызова демона (3).
Невозможно открыть файл для записи. Не удалось открыть образец файла для записи.
Невозможно записать данные в файл: Не удалось записать данные в файл примера.
Не удалось получить размер пула. Не удалось прочитать /proc/sys/kernel/random/poolsize
Не удалось инициализировать HAVEGE rng Недопустимый размер кэша данных или инструкций.
Не удалось открыть файл PID для записи Невозможно записать PID демона
Не удалось открыть случайное устройство. Не удалось открыть /dev/random для чтения и записи.
Не удалось запросить уровень энтропии из ядра: ошибка Не удалось выполнить вызов ioctl(2).
Не удалось открыть файл PID
для записи Ошибка записи /var/run/haveged.pid
Ошибка:set_watermark() Не удается записать в /proc/sys/kernel/random/write_wakeup_threshold
Ошибка RNDADDENTROPY! Не удалось выполнить вызов ioctl(2) для добавления энтропии
Ошибка генератора случайных чисел Генератор случайных чисел не прошел самопроверку или обнаружил неустранимую ошибку.
Ошибка выбора Не удалось выполнить вызов select(2).
Остановка из-за сигнала Сигнал пойман.
Невозможно настроить онлайн-тесты. Память недоступна для ресурсов онлайн-тестов.
ПРИМЕРЫ
Записать 1,5 МБ случайных данных в файл /tmp/random haveged -n 1,5M -f /tmp/random Создать /tmp/keyfile для шифрования диска с помощью LUKS haveged -n 2048 -f /tmp/keyfile Перезаписать раздел /dev/sda1 со случайными данными. Будьте осторожны, все данные на разделе будут потеряны! hasged -n 0 | dd of=/dev/sda1 Генерировать случайные пароли ASCII длиной 16 символов (haveged -n 1000 -f - 2>/dev/null | tr -cd '[:graph:]' | fold -w 16 && echo ) | head Записывает в канал бесконечный поток случайных байтов. Утилита pv измеряет скорость, с которой данные записываются в канал.hasged -n 0 | pv > /dev/null Оценить скорость hasged для генерации 1 ГБ случайных данных haveged -n 1g -f - | dd of=/dev/null Создайте файл случайных ключей, содержащий 65 случайных ключей для программы шифрования aespipe. haveged -n 3705 -f - 2>/dev/null | uuencode -m - | голова -n 66 | tail -n 65 Проверка случайности сгенерированных данных с помощью более жесткого набора тестов haveged -n 0 | dieharder -g 200 -a Генерировать 16 КБ данных, тестируя с помощью процедур A и B с подробными результатами тестирования. Результат c не виден, так как одно заполнение буфера не содержит достаточно данных для завершения теста. haveged -n 16k -o tba8ca8 -v 33 Сгенерировать 16k данных, как указано выше, с большим буфером. Теперь тест c завершен — теперь сгенерировано достаточно данных для завершения теста. haveged -n 16k -o tba8ca8 -v 33 -b 512 Сгенерируйте 16 м данных, как указано выше, наблюдайте за выполнением многих тестов c с размером буфера по умолчанию. haveged -n 16m -o tba8ca8 -v 33 Генерировать большие объемы данных - в данном случае 16 ТБ. Включить тест инициализации, но сделать непрерывные тесты рекомендательными только для того, чтобы избежать возможной ситуации, когда программа завершится из-за сбоя процедуры B два раза подряд. Вероятность отказа процедуры B два раза подряд можно оценить как /3000, что дает 0,5% для 16 ТБ. haveged -n 16T -o tba8cbw -f - | pv > /dev/null Создание больших объемов данных (16 ТБ). Отключите непрерывные тесты для максимальной пропускной способности, но запустите онлайн-тесты при запуске, чтобы убедиться, что генератор правильно инициализирован: haveged -n 16T -o tba8c -f - | pv > /dev/null
ССЫЛКИ
Аппаратный сбор и расширение изменчивой энтропии: генерация непредсказуемых случайных чисел на уровне пользователя, А. Сезнец, Н. Сендриер, исследовательский отчет INRIA, RR-4592, октябрь 2002 г.
Предложение: Классы функциональности для генераторов случайных чисел, авторы В. Киллманн и В. Шиндлер, версия 2.0, Bundesamt fur Sicherheit in der Informationstechnik (BSI), сентябрь 2011 г.
Статистический набор тестов для проверки генераторов случайных чисел и генераторов псевдослучайных чисел для криптографических приложений, специальная публикация SP800-22, Национальный институт стандартов и технологий, редакция, апрель 2010 г.
Haveged, источник энтропии
Начиная с ядра Linux версии 5.6, алгоритм, вдохновленный HAVEGED, был включен в ядро Linux (см. статью LKML и коммит ядра Linux). Как только CRNG (генератор случайных чисел с криптографической стойкостью Linux) будет готов, /dev/random больше не будет блокироваться при чтении.
Я рад, что эти изменения вошли в основное ядро. Приятно видеть, что основная идея HAVEGED выдержала испытание временем - она была опубликована здесь еще в 2003 году. Я также рад, что алгоритм HAVEGE продолжает изучаться и изучаться — см. Генератор случайных чисел джиттера ЦП.
Это означает, что услуга HAVEGED стала менее актуальной. Тем не менее, это все еще полезно в следующих ситуациях, когда вы
- нужен случайный выбор в начале процесса загрузки, прежде чем CRNG в ядре Linux будет полностью инициализирован.
- Хотите развернуть дополнительный источник энтропии. HAVEGED теперь вставляет энтропию в ядро каждые 60 секунд, независимо от уровня энтропии, сообщаемого ядром Linux. Это не влияет на скорость чтения /dev/random, но диверсифицирует источники энтропии, делая CRNG ядра Linux более надежным.
- вы ищете ГСЧ пользовательского пространства для генерации случайных чисел. См. примеры man -S8 haveged или попробуйте запустить haveged -n 0 | pv > /dev/null
- и последнее, но не менее важное: большинство установок Linux по-прежнему работают на старых версиях ядра.
В любом случае я продолжу поддерживать проект HAVEGED. Пользовательское приложение, а также библиотека hasged никоим образом не затронуты изменениями в ядре Linux.
Linux предоставляет интерфейсы устройств (/dev/random и /dev/urandom) для пула случайных чисел, собранных из подпрограмм обслуживания системных прерываний. В некоторых системах, особенно в системах с высокими потребностями или ограниченным взаимодействием с пользователем, стандартный механизм сбора не может удовлетворить спрос. В этих случаях достаточное количество случайных чисел можно поддерживать, добавляя дополнительную энтропию в пул /dev/random через интерфейс файловой системы. Демон haveged был создан для выполнения этой функции с использованием случайных данных, сгенерированных алгоритмом HAVEGE.
Алгоритм HAVEGE основан на косвенном влиянии несвязанных аппаратных событий на синхронизацию команд вычисления, которая чувствительна к функциям процессора, таким как предсказатели ветвлений и механизмы доступа к инструкциям/данным. Выборки из таймера высокого разрешения вводятся в алгоритм для создания потока случайных данных в буфере сбора. Алгоритм не требует особых привилегий, кроме доступа к таймеру с высоким разрешением, который предоставляется аппаратной инструкцией или системным вызовом.
Механизм HAVEGE реализован на C с использованием встроенного ассемблера только там, где требуется прямой доступ к оборудованию.В современных компиляторах встроенные функции компилятора используются для замены многих, если не всех встроенных сборок. Усовершенствованная реализация HAVEGE добавляет две важные функции: автоматическую настройку алгоритма в соответствии со средой и возможность проверки данных, сгенерированных в буфере сбора, во время выполнения.
Цикл сбора hasged настраивается во время выполнения, чтобы соответствовать размеру кэшей данных и инструкций L1 хоста. Размер определяется на основе наилучшего соответствия следующим параметрам (от низкого к высокому):
- как скомпилированное значение по умолчанию
- как определено cpuid, если доступно
- как определено файловой системой /sys, если она доступна
- как указано в параметрах инициализации.
Проверка содержимого буфера коллекции во время выполнения основана на методологии из предложенного стандарта AIS-31 от BSI, Федерального управления по информационной безопасности Германии (Bundesamt für Sicherheit in der Informationstechnik). В предлагаемой конфигурации haveged соответствует большинству требований к устройству класса NTG.1, описанных во второй версии спецификации AIS-31.
Реализация hasged также предоставляет экспериментальную функцию для мультиплексирования коллекций hasge на нескольких ядрах процессора. Межпроцессная координация в этой конфигурации приносит в жертву значительную долю пропускной способности в обмен на распределение нагрузки на несколько процессоров.
Все вышеперечисленные функции содержатся в подпакете haveged-devel для hasged. Пакет hasged можно собрать с помощью libtool для предоставления подпакета devel или без libtool, если библиотека devel не нужна. В любом случае созданный исполняемый файл содержит интерфейс файловой системы для функций haveged-devel и дополнительную возможность для передачи вывода hasge на случайное устройство. Система сборки также предоставляет цели «проверить» для проверки выходных данных генератора случайных чисел исполняемого файла через интерфейс файловой системы.
Тестирование с помощью целей проверки сборки было частью hasged дистрибутива с тех пор, как проект перешел на automake. Первоначальные тесты были ограничены быстрой оценкой, реализованной как адаптация инструмента ent с открытым исходным кодом от Fourmilab, и более тщательной оценкой на основе набора тестов NIST SP800. Тестирование во время выполнения было добавлено в версию hasged версии 1.5 в рамках попытки в общих чертах следовать структуре тестирования ГСЧ AIS-31 немецкой организации Common Criteria, BSI.
Особенности реализации hasged:
- Сбой любой процедуры является фатальной ошибкой. В случае hasged экземпляр будет закрыт.
- Тесты работают непосредственно с буфером коллекции после его заполнения. Затраты на производительность приемлемы, за исключением теста автокорреляции test5. Возможность пропустить test5 при некоторых повторениях решает эту проблему.
- Тесты могут выполняться при запуске ("tot"-тест) или непрерывно, как указано в параметре hasged. В непрерывном случае нет подразумеваемой согласованности между буфером сбора и контекстом тестирования. Содержимое буфера сбора будет выпущено для использования при условии, что буфер не содержит неудачных отдельных тестов.
- Размер входных данных, необходимых для завершения процедуры B, зависит от содержимого. Это означает, что нет фиксированного выравнивания тестового ввода в буфере сбора.
- Повторные попытки процедуры регистрируются. Расширенная информация доступна с параметром -v3. Ожидаются повторные попытки (см. частоту сбоев выше), но обычно они наблюдаются только при выходных диапазонах, превышающих несколько ГБ.
Этот пакет создан для систем Enterprise Linux 5 (RHEL 5 / CentOS 5 / SL 5), но были приложены все усилия, чтобы сохранить и расширить аппаратную поддержку исходной реализации HAVEGE. Пакет использует систему сборки automake. По умолчанию сборка использует сборку libtool для предоставления haveged-devel. Каталог contrib/build содержит скрипт build.sh для переключения требования libtool и восстановления после некоторых сбоев autotools. Измените каталог на каталог сборки и введите ./build.sh для параметров.
Процесс настройки использует обнаружение оборудования с помощью config.sub или аргумента командной строки configure "-host". Переменная configure "host" используется для выбора встроенных встроенных функций сборки или компилятора, соответствующих цели сборки.
Общий тип хоста предоставляется для систем без доступа на уровне пользователя к системному таймеру с высоким разрешением. В этом случае для параметра --enable-clock_gettime установлено значение «да».
Для "./configure" доступны следующие параметры сборки:
- --enable-clock_gettime (по умолчанию "нет" для распознанных хостов)
- --enable-daemon (по умолчанию "да" в Linux)
- --enable-diagnostic (по умолчанию "нет")
- --enable-nistest (по умолчанию "нет", но рекомендуется)
- --enable-olt (по умолчанию "да")
- --enable-threads (экспериментальная версия)
- --enable-tune (по умолчанию "да")
Подробную информацию об опциях можно получить, введя "./configure --help". Для параметров xxx, которые принимают аргументы "да/нет", --disable-xxx может использоваться как обратный параметр --enable-xxx.
Если --enable-clock_gettime() имеет значение 'yes', системный вызов clock_gettime(CLOCK_MONOTONIC) будет использоваться в качестве источника таймера. Этот параметр по умолчанию имеет значение «да» для общих сборок хоста и «нет» в противном случае. Эта опция может оказаться полезной, если доступ к оборудованию времени является привилегированным. Из-за изменчивости реализаций clock_gettime() адекватность разрешения clock_gettime() не может быть известна до времени выполнения. Если используется этот параметр, настоятельно рекомендуется использовать тестирование во время выполнения.
Если --enable-daemon имеет значение 'yes', требуется доступ ioctl к произвольному устройству и доступ для чтения и записи к виртуальной файловой системе /proc. Демон может быть запущен на переднем плане или перейти в фоновый режим в зависимости от аргумента командной строки. Интерфейс демона предназначен для ядра 2.6 и более поздних версий и может не работать с ядрами 2.4 из-за различий в случайном интерфейсе между этими двумя версиями ядра. Учтено изменение файловой системы proc с размера пула, выраженного в байтах, на размер пула, выраженного в битах, могут потребоваться другие изменения. Этот параметр «нет», когда включены режимы диагностики. Если опция не указана, исполняемый файл устанавливается в каталог пользователя bin вместо каталога sbin.
Если --enable-diagnostic имеет значение "yes", диагностические интерфейсы захвата и внедрения включены. Диагностику захвата или внедрения можно включить по отдельности, установив параметр «захват» или «внедрение». Настройка для любого значения, отличного от «нет» для этой опции, заставляет --enable-daemon=no. Подробнее см. в разделе ДИАГНОСТИКА ниже.
Опция --enable-nistest включает более тщательное тестирование цели проверки. Подробнее см. ПРОВЕРКА.
Опция --enable-threads представляет собой экспериментальный прототип для запуска нескольких потоков сбора данных в одном экземпляре hasged. Цель состоит в том, чтобы создать многоядерный хэдж, который будет более равномерно распределять накладные расходы на сбор по доступным ресурсам ЦП.
Опция --enable-tune позволяет запретить возможность онлайн-настройки. Это предназначено для систем с особыми потребностями и/или ограниченным бюджетом ресурсов. Установка параметра «да» включает как методы cpuid, так и методы виртуальной файловой системы, значение «нет» подавляет оба метода. Можно выбрать отдельные методы настройки, установив для параметра значение «cpuid» или «vfs». Обратите внимание, что метод cpuid всегда зависит от типа хоста и не будет использоваться, если аппаратная архитектура не поддерживает инструкцию.
Сборка hasged не изменяет CFLAGS и DFLAGS, например:
CFLAGS="-fpic -DGENERIC_DCACHE=32" LDFLAGS="-z сейчас" ./configure --disable-tune
настроил бы сборку для настраиваемого вручную защищенного демона с размером кэша данных по умолчанию 32 КБ.
Цель проверки сборки предоставляет две процедуры тестирования сборки.
«Быстрая» проверка, основанная на общедоступной ЛОР-программе и адаптированная к ней. Программа "entest" использует источники ENT, чтобы подвергнуть образец следующему:
a) Результат хи-квадрата должен находиться в допустимых пределах (> 1% и 1 = Запись файла примера в КБ --write , -w [] Установить write_wakeup_threshold [бит]
Если hasged работает отдельно, диагностический вывод записывается в системный журнал, в противном случае вывод записывается в stderr.
Если включен интерфейс демона, ненулевые параметры "-r" используются для проверки генератора случайных чисел с хэшированием; будет настроен генератор случайных чисел, будет выполнен начальный этап сбора данных, детали конфигурации будут записаны в стандартный вывод, а образец вывода "-r" KB будет записан в файл вывода образца для всех "-r" > 1. Опция "-n" обеспечивает более дружественную версию r > 1.
Если указан интерфейс демона и параметр --run==1 или параметр --run недоступен и параметр --number не указан, отображается сводка сборки, настройки и выполнения, и происходит выход без создания данных:
: версия: ; арка: ; продать: , построить: (); собирать: : процессор: (); данные: (); инст: (); идентификатор: ; sz: : tot тесты(): ; непрерывные тесты(): последняя оценка энтропии: заполняет: , сгенерировано:
Флаги параметров сборки представляют параметры ./configure следующим образом: C=clock_gettime, D=диагностика, I=настройка с процессором, M=многоядерность, T=онлайн-тесты, V=настройка с vfs
Источники, указанные в круглых скобках, представляют собой списки указанных выше токенов, разделенные пробелами. Значения "сборщик * используемый/сборщик * доступный" указывают соответствие цикла накопленного сбора кэшу инструкций L1.
Элементы, помеченные выше как "exec:", имеют смысл только при создании данных. Отображение результатов теста настраивается в соответствии с указанными параметрами теста. Последние несколько строк сводки сборки/настройки (элементы, помеченные выше как «exec:») также отображаются сами по себе как «резюме выполнения» в других обстоятельствах.
В других случаях о завершении инициализации сообщает баннер, записываемый в лог:
": запуск" "Запись байтового вывода в "
Первая строка выше используется при работе в качестве демона, а вторая — в противном случае. Если выполняется один или несколько онлайн-тестов, сбои тестов регистрируются как:
: процедура AIS-31: заполнение байтами
где либо 'tot', либо 'continuous', либо 'A', либо 'B', либо 'retry', либо 'fail', это количество байтов, обработанных в процедуре до сбоя, это количество раз, когда буфер был заполнен< /p>
Сводка exec регистрируется при завершении ошибки или сигнала. Другой вывод журнала контролируется параметром --verbose:
Битовая маска --verbose для получения дополнительной диагностической информации:
0x01 Показать сводку выполнения при завершении, сводку повторных попыток 0x02 Показать подробности повторных попыток онлайн-тестирования 0x04 Показать время для коллекций 0x08 Показать характеристики цикла сбора 0x10 Показать смещения кода 0x20 Показать все подробности завершения онлайн-теста
Опция "--write" установит заданное значение для proc/sys/kernel/random/write_wakeup_threshold. Это полезно, потому что этот порог очень мал в некоторых системах. Рекомендуется не менее 1024.
Интерфейс файловой системы поддерживает создание файлов с настройками данных размером до 16 ТБ или может быть частью конвейерного набора команд. См. примеры на man(8) странице.
ДИАГНОСТИЧЕСКАЯ сборка
Диагностическая сборка представляет собой специальную версию конфигурации без демона со специальной опцией --run. Уровни --run 0 и 1 соответствуют дублированию эквивалентных функций приложения. В зависимости от выбранного значения --enable-diagnostic могут быть включены одна или несколько дополнительных команд.
capture (--run 2) Запустить ГСЧ, но собрать входные данные таймера в отдельный буфер. Обычный выход ГСЧ отбрасывается и заменяется входами таймера. Требует дополнительной буферизации, производительность низкая, так как для создания того же объема вывода требуется в 8 раз больше заполнений.
внедрить тики (--run 4) Заменить источник таймера входным файлом. Требуется дополнительная буферизация, источник должен учитывать прогрев генератора.
вводить данные (--run 8) Полностью обходить обычный ГСЧ и считывать ввод непосредственно в выходной буфер. Прогрев генератора пропускается. Этот параметр полезен для проверки набора онлайн-тестов.
Знание внутреннего устройства hasged необходимо для эффективного использования специальных функций и интерпретации результатов. Диагностическая сборка идентифицирует себя как «havege_diagnostic» в отображении -help и других выходных данных.
Если интерфейс демона не включен, программа установки помещает исполняемый файл в каталог automake bin_PROGRAMS и предоставляет справочную страницу (8). Страница man(3) предоставляется для сборки libtool. Если интерфейс демона включен, исполняемый файл устанавливается в каталог automake sbin_PROGRAMS.
Каталог contrib содержит фрагменты, не интегрированные в дистрибутив. В настоящее время этот каталог содержит связанные со сборкой утилиты в каталоге сборки и неорганизованный набор некоторых инструментов, используемых для анализа hasged в каталоге diags.
Сценарий contrib/build/build.sh упорядочивает утилиты сборки. Сценарий предоставляет методы для переключения использования libtool в сборке в особо проблемных средах, загрузочную программу для восстановления после состояний ошибки automake и возможность сборки и запуска примера программы devel после сборки подпакета devel.
Несколько файлов спецификаций образцов пакетов представлены в виде contrib/build/*.spec. Исходный код havege_sample.c демонстрирует использование API havege.h.
haveged — служба энтропии, работающая в пользовательском пространстве, которая не зависит от механизма сбора случайных данных в системном пуле энтропии. Это важно в случаях с увеличением энтропийных выявлений или ограниченным взаимодействием с пользователем (например, в серверах).
использует HAVEGE (аппаратный сбор и расширение изменчивой энтропии) для использования пула из миллионов случайных байтов, используемого для загрузки /dev/random, когда источники не получают достаточно данных и число случайных битов в /dev/random бит о вычислении ниже предельного уровня .
Теги: Реализовано на: C, Пользовательский интерфейс: Демон, Роль: Программа, Область: scope::utility, security::cryptography
Другие пакеты, привлекательные
- зависимость
- рекомендации
- предложения
- улучшает
- dep: libc6 (>= 2.15) [не arm64, ppc64el] библиотека GNU C: подключаемые библиотеки
также виртуальный пакет, поисковый libc6-udeb dep: libc6 (>= 2.17) [arm64, ppc64el]< /li> - dep: libhavege1 (>= 1.9.0) источник энтропии с использованием алгоритма HAVEGE — общая библиотека
- dep: lsb-base (>= 3.2-14) основа для заражения — Linux Standard Base
- sug: apparmor транслятор профиля AppArmor
Загрузка загружена
Архитектура | Размер пакета | В установленном виде | Файлы |
---|---|---|---|
amd64 | 32,6 Кб | 79,0 Кб | [ список файлов] |
arm64 | 32,4 Кб | 75,0 Кб | [список файлов ] |
armel | 33,5 Кб | 74,0 Кб | [список файлов]< /td> |
armhf | 32,6 Кб | 70,0 Кб | [список файлов] |
i386 | 32,7 Кб | 74,0 Кб | [список файлов] | < /tr>
mips | 32,5 Кб | 75,0 Кб | [список файлов] |
mips64el | 32,4 Кб | 80,0 Кб | [список файлов] | mipsel | 32,6 Кб | 75,0 Кб | [список файлов] |
ppc64el | 32,9 Кб | 123,0 Кб | [список файлов] |
s390x | 32,2 Кб | 79,0 Кб | [список файлов] |
Эта страница также доступна на следующих этапах (Как установить язык по умолчанию):
Авторские права © 1997 - 2022 SPI Inc.; См. условия лицензии. Debian это торговый знак компании SPI Inc. Об этом сайте.
Читайте также: