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

19

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

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

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

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

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

Ник
источник

Ответы:

10

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

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

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

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

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

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

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

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

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

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

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

Дэвид Шварц
источник
Ваше второе предложение кажется интересным в теории, но я надеялся на решение, не связанное с программированием. Интересно, повлияет ли копирование большого файла на хост или с хоста с USB-накопителя на пул энтропии виртуальной машины (т. Е. Заставить его работать быстрее)? Если это так, я мог бы попытаться создать свою область во время резервного копирования образа машины на хосте ...
Ник
1
Вы можете провести некоторое тестирование, чтобы увидеть, что пополняет пул энтропии. Как только вы найдете то, что работает, вы можете просто сделать это. Сетевой трафик должен это делать. Водительская активность должна это делать. Вы можете проверить, что работает с этой командой: cat /proc/sys/kernel/random/entropy_availвсе, что увеличивает, работает.
Дэвид Шварц
Имейте в виду, что бегущая кошка «съедает» энтропию (рандомизацию адресного пространства). Вы можете использовать python -c 'while True: import time; print str(time.sleep(1))[0:0] + open("/proc/sys/kernel/random/entropy_avail", "rb").read(),'. Да, это трудно читать, но я не вижу возможности вводить новые строки в комментариях ...
Дончо Ганчев
10

Я использую 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 прошла все тесты на случайность

Фрэнк Л
источник
Вам также необходимо запустить набор тестов NIST, чтобы быть уверенным.
Майкл Хэмптон
7

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

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 пройти через маршрутизатор, чтобы она генерировала энтропию * :)

многочлен
источник
Я запутался насчет средней части. У меня нет "/ dev / xvda" в системе. Является ли целью использовать ssh для маршрутизации хоста / dev / random в виртуальный компьютер / dev / urandom? Я могу отправить все, что я хочу в "/ dev / urandom", и это выходит из "/ dev / random"?
Ник
Я могу получить случайные данные с хоста, используя "ssh 192.168.1.1 'cat / dev / random'", но я не знаю, как заставить их влиять на гостей "/ dev / random". "ssh 192.168.1.1 'cat / dev / random'> / dev / urandom", похоже, ничего не делает.
Ник
Я только что проверил, запустив «cat / dev / random» в одном терминале и дождавшись, пока он перестанет выводить данные. Затем в другом я сделал 'cat somerandomfile> / dev / urandom', и медленно 'cat / dev / random' снова начал выводить вещи. Похоже, вам нужно МНОГО случайного ввода в / dev / urandom, чтобы сделать достойный / dev / random ввод. Вы говорите, что когда делаете cat ... '> / dev / urandom, вы вообще не видите вывод на / dev / random?
полином
В конце концов я вижу некоторые результаты, но они очень медленные. Я не уверен, что это больше, чем то, что производится естественным путем. Я обнаружил, что в виртуальных машинах генерируется очень медленное и небольшое количество случайных данных, это занимает вечность. Я создал свое царство после того, как позволил ему сидеть и «собирать случайные данные» в течение примерно 2 часов.
Ник
+1 за полезный ответ.
Ник
5

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

Запуск 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

Вивек
источник
1

Ответ 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>.
Дэвид Джонстон
источник
0

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

cat /dev/sda > /dev/urandom

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

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

mgwilliams
источник
Пожалуйста, обратитесь к другим сообщениям, используя имя автора. Сказать «выше» или «ниже» не имеет смысла, потому что вы не все видите сообщения в одинаковой последовательности.
Джон Гарденье
4
Это может сработать, но / dev / sda содержит много неслучайных данных (по крайней мере, множество нулей), что делает идею не очень хорошей с точки зрения безопасности. В дополнение к нулям, он начинается с MBR, который на самом деле очень предсказуем, я могу предположить, по крайней мере, 3 байта ... или он не загрузится;)
Doncho Gunchev