Jak uzyskać / dev / random do pracy na maszynie wirtualnej Ubuntu?

19

Najwyraźniej / dev / random opiera się na przerwaniach sprzętowych lub podobnych nieprzewidywalnych aspektach fizycznego sprzętu. Ponieważ maszyny wirtualne nie mają fizycznego sprzętu, działanie cat /dev/randomna maszynie wirtualnej nic nie daje. Używam Ubuntu Server 11.04 jako hosta i gościa z libvirt / KVM.

Muszę skonfigurować Kerberos w maszynie wirtualnej, ale krb5_newrealmpo prostu zawiesza się na zawsze „Ładowanie losowych danych”, ponieważ system nie wytwarza żadnych.

Czy ktoś wie, jak to obejść? Czy możliwe jest przekazanie hosta / dev / random (który jest bardzo rozmowny) do vm, aby vm mógł użyć jego losowych danych?

Czytałem, że istnieje kilka alternatyw programowych, ale nie są one dobre dla kryptologii, ponieważ nie są wystarczająco losowe.

EDYCJA: Wygląda na to, że cat / dev / random na vm wytwarza dane wyjściowe, po prostu bardzo, bardzo powoli. Skonfigurowałem swoje królestwo, czekając około dwóch godzin na „Ładowanie losowych danych”. W końcu wystarczyło, aby kontynuować. Nadal jestem zainteresowany sposobem na przyspieszenie tego.

Nacięcie
źródło

Odpowiedzi:

10

Powinien „po prostu działać”. Mimo że vm nie ma dedykowanego fizycznego sprzętu, nadal ma dostęp do kilku bardzo dobrych źródeł losowości. Na przykład, może użyć TSC CPU, aby zmierzyć czas odczytu z dysków wirtualnych, co ostatecznie skończy taktowanie dysków fizycznych z dokładnością do miliardowej sekundy. Czasy te zależą od turbulentnego ścinania przepływu powietrza na dysku twardym, co jest nieprzewidywalne.

Podobna logika dotyczy ruchu sieciowego. Mimo że interfejs jest zwirtualizowany, o ile pakiet pochodzi z sieci fizycznej (i nie jest lokalny dla urządzenia, powiedzmy, że pochodzi z innej maszyny wirtualnej), taktowanie pakietu zależy od przesunięcia fazowego między oscylatorem kryształu na karcie sieciowej oraz kryształowy oscylator, który napędza TSC. Zależy to od zmian temperatury strefy mikroskopowej w dwóch kryształach kwarcu. To także jest nieprzewidywalne.

Jeśli z jakiegoś powodu nie działa, najprostszym rozwiązaniem jest napisanie programu do kopania entropii i dodanie go do puli systemowej. Interfejs sieciowy jest najbardziej niezawodnym źródłem. Na przykład możesz napisać kod do:

1) Zapytaj TSC.

2) Wyślij zapytanie DNS do serwera, o którym wiadomo, że nie znajduje się na tej samej maszynie fizycznej.

3) Zapytaj TSC po zakończeniu zapytania.

4) Powtórz to kilka razy, sumując wszystkie wartości TSC.

5) Wykonaj bezpieczny skrót dla zgromadzonych funkcji TSC.

6) Przekaż dane wyjściowe funkcji bezpiecznego skrótu do puli entropii systemu.

7) Monitoruj poziom puli entropii i poczekaj, aż będzie niski. Kiedy to nastąpi, wróć do kroku 1.

Linux ma proste wywołania IOCTL w celu dodania entropii do puli, sprawdzenia poziomu puli i tak dalej. Prawdopodobnie masz rngd, który może pobrać entropię z potoku i podać go do puli systemowej. Możesz wypełnić potok z dowolnego źródła, niezależnie od tego, czy jest to żądanie TSC, czy „wget” z własnego źródła entropii.

David Schwartz
źródło
Twoja druga sugestia wydaje się interesująca w teorii, ale liczyłem na rozwiązanie, które nie wymagałoby programowania. Zastanawiam się, czy kopiowanie dużego pliku do lub z hosta z dysku USB wpłynęłoby na pulę entropii maszyny wirtualnej (tj. Sprawiłoby, że działała szybciej)? Jeśli tak, mógłbym spróbować stworzyć moje królestwo podczas uruchamiania kopii zapasowej obrazu maszyny na hoście ...
Nick
1
Możesz wykonać kilka testów, aby zobaczyć, co uzupełnia pulę entropii. Gdy znajdziesz coś, co działa, możesz to po prostu zrobić. Ruch sieciowy powinien to zrobić. Aktywność na dysku powinna to zrobić. Możesz przetestować, aby zobaczyć, co działa z tym poleceniem: cat /proc/sys/kernel/random/entropy_availWszystko, co zwiększa, które działa.
David Schwartz
Należy pamiętać, że uruchomiony kot „zjada” entropię (losowość przestrzeni adresowej). Możesz użyć python -c 'while True: import time; print str(time.sleep(1))[0:0] + open("/proc/sys/kernel/random/entropy_avail", "rb").read(),'. Tak, to trudne do odczytania, ale nie widzę sposobu, aby wprowadzić nowe wiersze w komentarzach ...
Doncho Gunchev
10

Używam haveged na wszystkich moich serwerach bezgłowych, które wykonują operacje kryptograficzne (np. Uzgadnianie TLS, Kerberos itp.). Powinien znajdować się w repozytorium pakietów większości wersji Ubuntu: http://packages.ubuntu.com/search?ke words=haveged&searchon=names&suite=all§ion=all

haveged używa algorytmu HAVAGE do wydobywania entropii ze stanu wewnętrznego współczesnych procesorów. Oto dokładne wyjaśnienie: http://www.irisa.fr/caps/projects/hipsor/

Możesz sprawdzić losowość wygenerowanej entropii za pomocą pakietu ent. W moich systemach wygenerowana entropia z haveged przeszła wszystkie testy losowości przez ent

Frank L.
źródło
Aby się upewnić, musisz także uruchomić pakiet testowy NIST.
Michael Hampton
7

Tak, możesz go wysiać z:

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

Możesz po prostu umieścić to w / dev / urandom i powinno ono zapełnić pulę entropii. Potrafiłem to potwierdzić przez:

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

Premia, jeśli polecenie ssh przechodzi przez router, więc generuje entropię * :)

wielomian
źródło
Jestem zdezorientowany co do środkowej części. Nie mam w systemie „/ dev / xvda”. Czy celem jest użycie ssh do przekierowania hosta / dev / random do vm's / dev / urandom? Mogę wysłać wszystko, co chcę, do „/ dev / urandom” i pochodzi ono z „/ dev / random”?
Nick
Mogę pobrać losowe dane z hosta za pomocą „ssh 192.168.1.1„ cat / dev / random ””, ale nie wiem, jak wpływać na gości „/ dev / random”. „ssh 192.168.1.1 'cat / dev / random'> / dev / urandom” wydaje się nic nie robić.
Nick
Właśnie przetestowałem, uruchamiając „cat / dev / random” w jednym terminalu i czekając, aż przestanie on wysyłać dane. Następnie w innym zrobiłem „cat somerandomfile> / dev / urandom” i powoli „cat / dev / random” znów zaczął wypuszczać rzeczy. Wygląda na to, że potrzebujesz dużo losowych danych wejściowych na / dev / urandom, aby dokonać wartych / dev / losowych danych wejściowych. Czy mówisz, że robiąc kota ... '> / dev / urandom, nie widzisz żadnych wyników na / dev / random?
wielomian
W końcu widzę jakieś wyjście, ale jest bardzo wolne. Nie jestem pewien, czy jest to coś więcej niż to, co jest naturalnie produkowane. Odkryłem, że w maszynach wirtualnych generowana jest bardzo wolna i niewielka ilość losowych danych, która trwa tylko wieczność. Stworzyłem swoje królestwo po tym, jak pozwoliłem mu usiąść i „zbierać losowe dane” przez około 2 godziny.
Nick
+1 za pomocną odpowiedź.
Nick
5

To zadziałało dla mnie

Uruchomienie krb5_newrealm w maszynie wirtualnej może zająć dużo czasu (po wyświetleniu komunikatu „Ładowanie losowych danych”). Możesz użyć następującego hacka, aby trochę przyspieszyć.

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

opublikowane na http://fossies.org/linux/john/doc/Kerberos-Auditing-HOWTO.md

Vivek
źródło
1

Odpowiedź X86 polega na upewnieniu się, że maszyna wirtualna nie przechwytuje RdRand ani RdSeed. Ufasz maszynie wirtualnej w wielu sprawach, to jedna z nich.

Wystarczająco niedawne RNGd na post Snady Bridge CPU będzie (lub może być polecone) używać RdRand lub RdSeed, a niezakończony RdRand lub RdSeed zostaje entropijny w maszynie wirtualnej. / dev / random następnie działa z rzeczywistym (nie wirtualnym) źródłem entropii.

To nie jest przypadek. Jest tam właśnie w dokumentacji architektury Intel.

W przypadku sprzętowego źródła entropii opartego na urządzeniu (IE używa sterownika jądra, aby go udostępnić), potrzebujesz maszyny wirtualnej do prawidłowej wirtualizacji źródła fizycznego. Nie mam pojęcia, czy to robią, a jeśli tak, to dla jakich urządzeń.

Jeśli twój RNGd nie ma opcji drng poniżej, zaktualizuj go. Jeśli twój sprzęt nie ma szybkiego sprzętu RNG, jesteś skazany i powinieneś rozważyć użycie innego sprzętu ze względów bezpieczeństwa.

# 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
źródło
0

Miałem również problemy z zawieszeniem się krb5_newrealm. To działało dla mnie dobrze, w oparciu o powyższą odpowiedź:

cat /dev/sda > /dev/urandom

Możesz go zabić, gdy skończysz z potrzebą losowych danych. / dev / sda prawdopodobnie ma więcej danych niż potrzebujesz.

Uwaga: Nie jestem pewien, jak losowe są losowe dane generowane w ten sposób.

mgwilliams
źródło
Proszę odnieść się do innych postów, używając nazwy plakatu. Mówienie „powyżej” lub „poniżej” jest bez znaczenia, ponieważ nie wszyscy widzimy posty w tej samej kolejności.
John Gardeniers,
4
Może to działać, ale / dev / sda zawiera wiele nieprzypadkowych danych (przynajmniej tony zer), co czyni ten pomysł niezbyt dobrym z punktu widzenia bezpieczeństwa. Oprócz zer, zaczyna się od MBR, który jest w rzeczywistości bardzo przewidywalny, mogę zgadnąć co najmniej 3 bajty ... albo się nie uruchomi;)
Doncho Gunchev