Як змусити / dev / випадково працювати на віртуальній машині Ubuntu?


19

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

Мені потрібно налаштувати Kerberos всередині VM, але krb5_newrealmпросто вічно вішає "Завантаження випадкових даних", оскільки система не створює жодної.

Хтось знає, як обійти це? Чи можна передати хост / dev / random (що дуже балакать) у vm, щоб vm міг використовувати випадкові дані?

Я читав, що є кілька програмних альтернатив, але вони не гарні для криптології, оскільки вони не є досить випадковими.

EDIT: Схоже, що кіт / дев / випадковий на vm справді дає результат, дуже-дуже повільно. Я налаштував своє царство, чекаючи близько двох годин, поки це було "Завантаження випадкових даних". Врешті-решт, цього було достатньо для продовження. Мені все ж цікавий спосіб прискорити це.

Відповіді:


10

Він повинен «просто працювати». Незважаючи на те, що vm не має спеціального фізичного обладнання, він все ще має доступ до кількох дуже хороших джерел випадковості. Наприклад, він може використовувати TSC процесора, щоб час його зчитування з віртуальних дисків, що в кінцевому підсумку закінчиться тимчасовими фізичними дисками до мільярдної секунди. Ці терміни залежать від турбулентного зсуву повітряного потоку на жорсткому диску, що непередбачувано.

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

Якщо з якихось причин це не працює, найпростішим рішенням є написати програму для заміни ентропії та додати її до пулу системи. Мережевий інтерфейс - ваше найнадійніше джерело. Наприклад, ви можете написати код на:

1) Запит на TSC.

2) Надішліть запит DNS на сервер, який, як відомо, не знаходиться на одній фізичній машині.

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

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

5) Виконуйте захищений хеш на накопичених функціях TSC.

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

7) Контролюйте рівень пулу ентропії та чекайте, поки він низький. Коли вона є, поверніться до кроку 1.

Linux має прості дзвінки IOCTL, щоб додати ентропію до пулу, перевірити рівень пулу тощо. Напевно rngd, ви можете взяти ентропію з труби і подати її до системного пулу. Ви можете заповнити трубу з будь-якого потрібного джерела, будь то запити TSC або 'wget' від вашого власного джерела ентропії.


Ваша друга пропозиція здається цікавою теоретично, але я сподівався на рішення, яке не передбачало програмування. Цікаво, якщо копіювання великого файлу в хост або з вузла з USB-накопичувача вплине на пул ентропії vm (тобто змусить його працювати швидше)? Якщо так, я можу спробувати створити своє царство під час запуску резервної копії машинного зображення на хості ...
Nick

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. У моїх системах згенерована ентропія з тегета пройшла всі тести на випадковість на ent


Вам також потрібно запустити набір тестів 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 у vm's / 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 random. Ви кажете, що роблячи кішку ... '> / dev / urandom ви взагалі не бачите жодного виводу на / dev / random?
многочлен

Я бачу якийсь результат, але це дуже повільно. Я не впевнений, чи це більше, ніж те, що виробляється природним шляхом. Я виявив, що у віртуальних машинах генерується дуже повільна і невелика кількість випадкових даних, це просто займає назавжди. Я створив своє царство після того, як я дав йому сидіти і "збирати випадкові дані" протягом приблизно 2 годин.
Нік

+1 за корисну відповідь.
Нік

5

Це працювало для мене

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

$ 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 переконайтеся, що ваш VM не вловлює RdRand або RdSeed. Ви довіряєте своєму ВМ для багатьох речей, це одна з них.

Досить недавній RNGd на пост-процесорі Snady Bridge буде (або може бути сказано) використовувати RdRand або RdSeed, а незапущений RdRand або RdSeed отримує ентропію у VM. / dev / random тоді працює з реальним (а не віртуальним) джерелом ентропії.

Це не випадково. Це саме там, в документах архітектури Intel.

Для пристрою, заснованого на апаратному джерелі ентропії (IE використовує драйвер ядра, щоб поділитися ним), вам потрібен VM, щоб правильно віртуалізувати фізичне джерело. У мене немає поняття, якщо вони це роблять, і якщо так, то для яких пристроїв.

Якщо ваш 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, ймовірно, має більше даних, ніж потрібно.

Примітка. Я не впевнений, наскільки насправді є випадкові дані, що генеруються таким чином.


Будь ласка, зверніться до інших публікацій, використовуючи ім’я афіші. Говорити "вище" або "знизу" безглуздо, тому що ви не всі бачимо публікації в одній послідовності.
John Gardeniers

4
Це може спрацювати, але / dev / sda містить багато випадкових даних (принаймні тонни нулів), що робить ідею не дуже хорошою з точки зору безпеки. Окрім нулів, він починається з MBR, що насправді дуже передбачувано, я можу здогадатися принаймні на 3 байти ... або це
звичайне
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.