Как заставить /dev/random работать на виртуальной машине Ubuntu?

Очевидно, /dev/random основан на аппаратных прерываниях или похожих непредсказуемых аспектах физического оборудования. Поскольку виртуальные машины не имеют физического оборудования, cat /dev/random внутри виртуальной машины ничего не выдает. Я использую Ubuntu Server 11.04 в качестве хоста и гостя с libvirt/KVM.

Мне нужно настроить Kerberos внутри виртуальной машины, но krb5_newrealm просто висит навсегда "Загрузка случайных данных", так как система не производит никаких.

Кто-нибудь знает, как обойти это? Можно ли передать хосту / dev / random (который очень болтлив) в виртуальную машину, чтобы виртуальная машина могла использовать его случайные данные?

Я читал, что есть некоторые программные альтернативы, но они не годятся для криптологии, поскольку они недостаточно случайны.

РЕДАКТИРОВАТЬ: Похоже, что cat / dev / random на виртуальной машине действительно производит вывод, очень и очень медленно. Я установил свое царство, подождав около двух часов, пока оно "Загрузка случайных данных". В конце концов, этого достаточно, чтобы продолжить. Я все еще заинтересован в способе ускорить это все же.

6 ответов

Решение

Это должно "просто работать". Хотя виртуальная машина не имеет выделенного физического оборудования, она все же имеет доступ к нескольким очень хорошим источникам случайности. Например, он может использовать TSC ЦП для измерения времени чтения с виртуальных дисков, что в конечном итоге приведет к увеличению времени синхронизации физических дисков с точностью до миллиардной доли секунды. Эти сроки зависят от турбулентного сдвига потока воздуха в жестком диске, который непредсказуем.

Аналогичная логика применяется к сетевому трафику. Несмотря на то, что интерфейс виртуализирован, пока пакет создается в физической сети (и не является локальным для блока, скажем, в другом vm), синхронизация пакета зависит от сдвига фазы между кварцевым генератором на сетевой карте и кварцевый генератор, который управляет TSC. Это зависит от изменения температуры микроскопической зоны в двух кристаллах кварца. Это тоже непредсказуемо.

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

1) Запросить TSC.

2) Отправьте DNS-запрос на сервер, который, как известно, не находится на том же физическом компьютере.

3) Запросить TSC, когда запрос завершится.

4) Повторите это несколько раз, накапливая все значения TSC.

5) Выполните безопасный хэш на накопленных функциях TSC.

6) Передайте выходные данные защищенной хэш-функции в пул энтропии системы.

7) Контролируйте уровень энтропийного пула и ждите, пока он не станет низким. Когда это так, вернитесь к шагу 1.

В Linux есть простые вызовы IOCTL для добавления энтропии в пул, проверки уровня пула и так далее. У вас наверное есть rngd, который может взять энтропию из трубы и подать ее в системный пул. Вы можете заполнить канал из любого источника, который вы хотите, будь то запросы TSC или wget из вашего собственного источника энтропии.

Я использую hasged на всех моих безголовых серверах, которые выполняют криптографические операции (например, TLS-рукопожатия, kerberos и т. Д.). Это должно быть в большинстве репозиториев пакетов версий Ubuntu: http://packages.ubuntu.com/search?keywords=haveged&searchon=names&suite=all§ion=all

hasged использует алгоритм HAVAGE для извлечения энтропии из внутреннего состояния современных процессоров. Вот подробное объяснение: http://www.irisa.fr/caps/projects/hipsor/

Вы можете проверить случайность сгенерированной энтропии с помощью пакета ent. На моих системах сгенерированная энтропия из hasged прошла все тесты на случайность

Да, вы можете отобрать это из:

http://manpages.ubuntu.com/manpages/jaunty/man4/random.4.html

Вы можете просто поместить это в /dev/urandom, и он должен заполнить пул энтропии. Я смог подтвердить это:

root@mx01-ewr:/proc/sys/kernel/random# cat entropy_avail 
128
root@mx01-ewr:/proc/sys/kernel/random# cat /dev/xvda >/dev/urandom  &
[1] 16187 # just using this as a source of data, you could do ssh hostIP 'cat /dev/random' >... etc
root@mx01-ewr:/proc/sys/kernel/random# cat entropy_avail 
1221
root@mx01-ewr:/proc/sys/kernel/random# cat entropy_avail 
1398

Бонус, если вы заставите команду ssh пройти через маршрутизатор, чтобы она генерировала энтропию *:)

Это сработало для меня

Запуск krb5_newrealm внутри виртуальной машины может занять много времени (после отображения сообщения "Загрузка случайных данных"). Вы можете использовать следующий хак, чтобы немного ускорить процесс.

$ sudo aptitude install rng-tools -y
$ sudo rngd -r /dev/urandom -o /dev/random  # don't do this in production!

размещено на http://fossies.org/linux/john/doc/Kerberos-Auditing-HOWTO.md

Ответ X86 - убедитесь, что ваша виртуальная машина не перехватывает RdRand или RdSeed. Вы доверяете своей виртуальной машине во многих вещах, это одна из них.

Достаточно недавний RNGd на постпроцессорном процессоре Snady Bridge будет (или может быть приказан) использовать RdRand или RdSeed, а не захваченный RdRand или RdSeed получает энтропию в ВМ. Затем /dev/random работает с реальным (не виртуальным) источником энтропии.

Это не случайно. Это прямо в документации по архитектуре Intel.

Для аппаратного источника энтропии на основе устройства (IE использует драйвер ядра для его совместного использования) вам нужна виртуальная машина для правильной виртуализации физического источника. Понятия не имею, делают ли они это и если да, то для каких устройств.

Если ваш RNGd не имеет опции drng ниже, обновите ее. Если ваше оборудование не имеет быстрой аппаратной RNG, вы обречены, и вам следует подумать об использовании другого оборудования в целях безопасности.

# rngd --help
Usage: rngd [OPTION...]
Check and feed random data from hardware device to kernel entropy pool.

  -b, --background           Become a daemon (default)
  **-d, --no-drng=1|0          Do not use drng as a source of random number input**
                             (default: 0)
  -f, --foreground           Do not fork and become a daemon
  -n, --no-tpm=1|0           Do not use tpm as a source of random number input
                             (default: 0)
  -o, --random-device=file   Kernel device used for random number output
                             (default: /dev/random)
  -p, --pid-file=file        File used for recording daemon PID, and multiple
                             exclusion (default: /var/run/rngd.pid)
  -q, --quiet                Suppress error messages
  -r, --rng-device=file      Kernel device used for random number input
                             (default: /dev/hwrng)
  -s, --random-step=nnn      Number of bytes written to random-device at a time
                             (default: 64)
  -v, --verbose              Report available entropy sources
  -W, --fill-watermark=n     Do not stop feeding entropy to random-device until
                             at least n bits of entropy are available in the
                             pool (default: 2048), 0 <= n <= 4096
 -?, --help                 Give this help list
  --usage                Give a short usage message
  -V, --version              Print program version

Mandatory or optional arguments to long options are also mandatory or optional
for any corresponding short options.

Report bugs to Jeff Garzik <jgarzik@pobox.com>.

У меня были проблемы с зависанием krb5_newrealm. Это хорошо сработало для меня, основываясь на приведенном выше ответе:

cat /dev/sda > /dev/urandom

Возможно, вы захотите убить его, как только закончите с необходимостью в случайных данных. /dev/sda, вероятно, содержит больше данных, чем вам нужно.

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

Другие вопросы по тегам