Bagaimana cara mendapatkan / dev / acak untuk bekerja pada mesin virtual Ubuntu?

19

Rupanya, / dev / random didasarkan pada gangguan perangkat keras atau aspek serupa dari perangkat keras fisik yang tidak dapat diprediksi. Karena mesin virtual tidak memiliki perangkat keras fisik, menjalankan cat /dev/randomdalam mesin virtual tidak menghasilkan apa-apa. Saya menggunakan Ubuntu Server 11.04 sebagai tuan rumah dan tamu, dengan libvirt / KVM.

Saya perlu mengatur Kerberos di dalam VM, tetapi krb5_newrealmhang selamanya "Memuat data acak", karena sistem tidak menghasilkan apa pun.

Adakah yang tahu cara mengatasi ini? Apakah mungkin untuk melewatkan host / dev / random (yang sangat cerewet) ke dalam vm sehingga vm dapat menggunakan data acaknya?

Saya telah membaca bahwa ada beberapa alternatif perangkat lunak, tetapi mereka tidak baik untuk kriptologi karena mereka tidak cukup acak.

EDIT: Tampaknya cat / dev / random pada vm menghasilkan output, hanya sangat, sangat lambat. Saya mendapatkan pengaturan ranah saya dengan menunggu sekitar dua jam saat itu "Memuat data acak". Akhirnya itu cukup untuk melanjutkan. Saya masih tertarik dengan cara untuk mempercepat ini.

Nick
sumber

Jawaban:

10

Seharusnya 'hanya berfungsi'. Meskipun vm tidak memiliki perangkat keras fisik khusus, vm masih memiliki akses ke beberapa sumber keacakan yang sangat baik. Sebagai contoh, ia dapat menggunakan TSC CPU untuk menghitung waktu membaca dari disk virtual, yang pada akhirnya akan berakhir waktu disk fisik ke sepersejuta detik. Pengaturan waktu ini tergantung pada geser aliran udara turbulen di hard drive, yang tidak dapat diprediksi.

Logika serupa berlaku untuk lalu lintas jaringan. Meskipun antarmuka divirtualkan, selama paket tersebut berasal dari jaringan fisik (dan tidak lokal ke kotak, katakanlah berasal dari vm lain), waktu paket tergantung pada fase offset antara osilator kristal pada kartu jaringan dan osilator kristal yang menggerakkan TSC. Ini tergantung pada variasi suhu zona mikroskopis di dua kristal kuarsa. Ini juga tidak dapat diprediksi.

Jika karena alasan tertentu itu tidak berfungsi, solusi paling sederhana adalah menulis sebuah program untuk menambang entropi dan menambahkannya ke kumpulan sistem. Antarmuka jaringan adalah sumber Anda yang paling dapat diandalkan. Misalnya, Anda dapat menulis kode ke:

1) Minta TSC.

2) Mengeluarkan permintaan DNS ke server yang dikenal tidak berada di mesin fisik yang sama.

3) Permintaan TSC saat kueri selesai.

4) Ulangi ini beberapa kali, mengumpulkan semua nilai TSC.

5) Melakukan hash yang aman pada fungsi TSC yang terakumulasi.

6) Lewatkan output fungsi hash aman ke kumpulan entropi sistem.

7) Pantau level pool entropi, dan tunggu sampai levelnya rendah. Saat itu, kembali ke langkah 1.

Linux memiliki panggilan IOCTL sederhana untuk menambah entropi ke pool, memeriksa level pool, dan sebagainya. Anda mungkin memilikinya rngd, yang dapat mengambil entropi dari pipa dan memasukkannya ke pool sistem. Anda dapat mengisi pipa dari sumber apa pun yang Anda inginkan, apakah itu permintaan TSC atau 'wget' dari sumber entropi Anda sendiri.

David Schwartz
sumber
Saran kedua Anda tampaknya menarik dalam teori, tetapi saya berharap untuk solusi yang tidak melibatkan pemrograman. Saya bertanya-tanya apakah menyalin file besar ke atau dari host dari drive usb akan mempengaruhi kumpulan entropi vm (yaitu membuatnya bekerja lebih cepat)? Jika demikian, saya dapat mencoba untuk membuat ranah saya sambil menjalankan cadangan gambar mesin pada host ...
Nick
1
Anda dapat melakukan beberapa pengujian untuk melihat isi ulang kumpulan entropi. Setelah Anda menemukan sesuatu yang berfungsi, Anda bisa melakukannya. Lalu lintas jaringan harus melakukannya. Aktivitas drive harus melakukannya. Anda dapat menguji untuk melihat apa yang berfungsi dengan perintah ini: cat /proc/sys/kernel/random/entropy_availApa pun yang meningkat itu berfungsi.
David Schwartz
Perlu diingat bahwa menjalankan entropi kucing "makan" (pengacakan ruang alamat). Anda bisa menggunakannya python -c 'while True: import time; print str(time.sleep(1))[0:0] + open("/proc/sys/kernel/random/entropy_avail", "rb").read(),'. Yeh, itu sulit dibaca, tetapi saya tidak melihat cara untuk memasukkan baris baru dalam komentar ...
Doncho Gunchev
10

Saya menggunakan hasged pada semua server tanpa kepala saya yang melakukan operasi kriptografi (mis. Jabat tangan TLS, kerberos, dll). Seharusnya di sebagian besar repositori versi Ubuntu: http://packages.ubuntu.com/search?keywords=haveged&searchon=names&suite=all§ion=all

hasged menggunakan algoritma HAVAGE untuk mengekstraksi entropi dari keadaan internal prosesor modern. Berikut ini penjelasan mendalam: http://www.irisa.fr/caps/projects/hipsor/

Anda dapat memeriksa keacakan entropi yang dihasilkan dengan paket ent. Pada sistem saya, entropi yang dihasilkan dari hasged lulus semua tes keacakan oleh ent

Frank L
sumber
Anda juga perlu menjalankan test suite NIST untuk memastikan.
Michael Hampton
7

Ya, Anda bisa menaburnya, dari:

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

Anda bisa memasukkannya ke / dev / urandom dan seharusnya seed entropy pool. Saya dapat mengkonfirmasi ini dengan:

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

Bonus jika Anda membuat perintah ssh melalui router sehingga menghasilkan entropi * :)

jumlahnya banyak
sumber
Saya bingung tentang bagian tengah. Saya tidak memiliki "/ dev / xvda" di sistem. Apakah tujuan menggunakan ssh untuk merutekan host / dev / random ke vm's / dev / urandom? Saya dapat mengirim apapun yang saya inginkan ke "/ dev / urandom" dan keluar dari "/ dev / random"?
Nick
Saya bisa mendapatkan data acak dari host menggunakan "ssh 192.168.1.1 'cat / dev / random'", tapi saya tidak tahu bagaimana cara membuatnya memengaruhi tamu "/ dev / random". "ssh 192.168.1.1 'cat / dev / random'> / dev / urandom" sepertinya tidak melakukan apa-apa.
Nick
Saya baru saja diuji dengan menjalankan 'cat / dev / random' di satu terminal dan menunggu sampai berhenti mengeluarkan data. Kemudian di lain saya melakukan 'cat somerandomfile> / dev / urandom' dan perlahan-lahan 'cat / dev / random' mulai mengeluarkan barang lagi. Sepertinya Anda membutuhkan BANYAK input acak di / dev / urandom untuk membuat input layak / dev / acak. Apakah Anda mengatakan bahwa ketika melakukan cat ... '> / dev / urandom Anda sama sekali tidak melihat output pada / dev / random?
polinomial
Saya melihat beberapa output pada akhirnya, tetapi sangat lambat. Saya tidak yakin apakah itu lebih dari apa yang diproduksi secara alami. Saya telah menemukan bahwa jumlah data acak yang sangat lambat dan kecil dihasilkan dalam VM, hanya perlu selamanya. Saya mendapatkan wilayah saya setelah membiarkannya duduk dan "mengumpulkan data acak" selama sekitar 2 jam.
Nick
+1 untuk jawaban yang bermanfaat.
Nick
5

Ini berhasil untuk saya

Menjalankan krb5_newrealm di dalam VM dapat memakan waktu lama untuk diselesaikan (setelah menampilkan pesan "Memuat data acak"). Anda dapat menggunakan retasan berikut untuk mempercepat beberapa hal.

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

diposting di http://fossies.org/linux/john/doc/Kerberos-Auditing-HOWTO.md

Vivek
sumber
1

Jawaban X86 adalah memastikan VM Anda tidak menjebak RdRand atau RdSeed. Anda mempercayai VM Anda untuk banyak hal, ini adalah salah satunya.

Sebuah RNGd yang cukup baru pada postingan Snady Bridge CPU, akan (atau dapat dikatakan) menggunakan RdRand atau RdSeed, dan RdRand atau RdSeed yang tidak terkunci mendapatkan entropi ke dalam VM. / dev / random kemudian bekerja dengan sumber entropi nyata (bukan virtual).

Ini bukan kebetulan. Itu ada di sana di dokumen arsitektur Intel.

Untuk sumber entropi perangkat keras berbasis perangkat (IE menggunakan driver kernel untuk membagikannya), Anda memerlukan VM untuk memvirtualisasi sumber fisik dengan benar. Saya tidak tahu apakah mereka melakukan ini dan jika demikian, untuk perangkat mana.

Jika RNGd Anda tidak memiliki opsi drng di bawah ini, perbarui. Jika perangkat keras Anda tidak memiliki RNG perangkat keras yang cepat, Anda akan hancur dan Anda harus mempertimbangkan untuk menggunakan perangkat keras yang berbeda untuk tujuan keamanan.

# 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 <[email protected]>.
David Johnston
sumber
0

Saya mengalami masalah dengan menggantung krb5_newrealm juga. Ini bekerja dengan baik untuk saya, berdasarkan jawaban di atas:

cat /dev/sda > /dev/urandom

Anda mungkin ingin membunuhnya setelah Anda selesai dengan kebutuhan Anda akan data acak. / dev / sda mungkin memiliki lebih banyak data daripada yang Anda butuhkan.

Catatan: Saya tidak yakin seberapa acak data acak yang dihasilkan dengan cara ini sebenarnya.

mgwilliams
sumber
Silakan merujuk ke posting lain dengan menggunakan nama poster. Mengatakan "di atas" atau "di bawah" tidak ada artinya karena Anda tidak semua melihat tulisan dalam urutan yang sama.
John Gardeniers
4
Ini mungkin berhasil, tetapi / dev / sda mengandung banyak data non-acak (setidaknya ada satu nol), yang membuat ide tersebut tidak terlalu bagus dari sudut pandang keamanan. Selain nol, ini dimulai dengan MBR, yang sebenarnya sangat dapat diprediksi, saya bisa menebak setidaknya 3 byte ... atau tidak mau boot;)
Doncho Gunchev