random(4) Device Drivers Manual random(4) NAZWA random, urandom - urzadzenia zrodlowe liczb losowych jadra SKLADNIA #include int ioctl(fd, RNDzadanie, parametr); OPIS Specjalne urzadzenia znakowe /dev/random i /dev/urandom (obecne w Linuksie od wersji 1.3.30) stanowia interfejs do wbudowanego w jadro generatora liczb losowych. Plik /dev/random ma numer glowny urzadzenia 1 i numer poboczny 8. Plik /dev/urandom ma numer glowny urzadzenia 1 i numer poboczny 9. Generator liczb losowych zbiera szum srodowiskowy ze sterownikow urzadzen i innych zrodel do puli losowej (puli entropii). Generator przechowuje rowniez szacunkowa liczbe bitow szumu w puli losowej. Z puli tej tworzone sa liczby losowe. Linux 3.17 i pozniejsze zapewnia prostszy i bezpieczniejszy interfejs getrandom(2), ktory nie wymaga plikow specjalnych; wiecej informacji w podreczniku getrandom(2). Przy odczycie, urzadzenie /dev/urandom zwraca losowe bajty, wygenerowane za pomoca pseudolosowego generatora liczb, ktory pozyskuje ziarno z puli entropii. Odczyt z tego urzadzenia nie blokuje sie (nie dochodzi do zjawiska CPU yield), ale przy pozyskiwaniu znaczacych ilosci danych moze wystapic znaczace opoznienie. Podczas odczytu we wczesnej fazie rozruchu, /dev/urandom moze zwrocic dane jeszcze przed zainicjowaniem puli losowej. Zastosowanie getrandom(2) lub /dev/random nie bedzie podatne na to niekorzystne zjawisko. Urzadzenie /dev/random jest przestarzalym interfejsem, pochodzacym jeszcze z czasow, gdy implementacja kryptograficznych funkcji pierwotnych (ang. cryptographic primitives) uzyta w implementacji /dev/urandom nie byla uwazana za zaufana. Zwraca losowe bajty w miare naplywu swiezego szumu do puli losowej i blokuje sie, gdy jest to konieczne. Urzadzenie /dev/random jest odpowiednie do aplikacji wymagajacych losowosci wysokiej jakosci, ktore moga sobie pozwolic na opoznienia o nieznanej dlugosci. Jesli pula losowa jest pusta, odczyt z /dev/random bedzie wstrzymany do czasu zebrania dodatkowego szumu srodowiskowego. Od Linuksa 5.6, flaga O_NONBLOCK jest ignorowana, jako ze /dev/random nie jest juz blokowane, z wyjatkiem wczesnej fazy rozruchu. We wczesniejszych wersjach, jesli open(2) jest wywolane do /dev/random z flaga O_NONBLOCK, kolejne read(2) nie bedzie blokowane, jesli zadana liczba bajtow nie jest dostepna. W zamian zwracane sa dostepne bajty. Jesli nie ma dostepnych bajtow, read(2) zwroci -1, a errno ustawi sie na EAGAIN. Flaga O_NONBLOCK nie ma znaczenia przy otwieraniu /dev/urandom. Podczas wywolania read(2) do urzadzenia /dev/urandom, odczyt do 256 bajtow zwroci zadana wielkosc bajtow; nie mozna ich przerwac sygnalem. Odczyt przy uzyciu bufora ponad ten limit moze zwrocic mniejsza liczbe bajtow niz zadana lub nie powiesc sie z bledem EINTR, jesli nastapi przerwanie sygnalem. Od Linuksa 3.16, read(2) z /dev/urandom zwroci co najwyzej 32 MB. read(2) z /dev/random zwroci nie wiecej niz 512 bajtow (340 bajtow przed Linuksem 2.6.12). Pisanie do /dev/random lub /dev/urandom zaktualizuje pule entropii za pomoca pisanych danych, lecz nie zwiekszy poziomu entropii. Oznacza to, ze bedzie to mialo wplyw na odczyt z obu plikow, lecz nie uczyni odczytu z /dev/random szybszym. Uzycie Urzadzenie /dev/random jest uwazane za przestarzaly interfejs, a /dev/urandom jest preferowany i wystarczajacy we wszystkich przypadkach, z wyjatkiem aplikacji wymagajacych losowosci we wczesnej fazie rozruchu, ktore musza korzystac z getrandom(2), blokujacego sie do czasu zainicjowania puli losowej. Jesli plik puli losowej jest przechowywany pomiedzy ponownymi uruchomieniami, zgodnie z ponizszymi zaleceniami, wyjscie jest kryptograficznie bezpieczne w stosunku do atakujacych bez dostepu do lokalnego roota, zaraz po przeladowaniu go w sekwencji rozruchowej i odnosi sie w calosci do sieciowych kluczy szyfrujacych sesji (wszystkie glowne dystrybucje Linuksa zachowuja plik puli losowej pomiedzy rozruchami od co najmniej 2000 roku). Poniewaz odczyt z /dev/random moze nie byc plynny, uzytkownicy beda go z reguly chcieli otworzyc w trybie nieblokujacym (lub przeprowadzac odczyt z czasem oczekiwania) i udostepniac jakis typ powiadomienia dla uzytkownika, jesli oczekiwana losowosc nie jest od razu dostepna. Konfiguracja Jesli w systemie nie ma plikow /dev/random i /dev/urandom, mozna je utworzyc przy uzyciu nastepujacych polecen: mknod -m 666 /dev/random c 1 8 mknod -m 666 /dev/urandom c 1 9 chown root:root /dev/random /dev/urandom Gdy Linux uruchamiany jest przy niewielkim udziale operatora, pula losowa moze byc w dosc przewidywalnym stanie. Faktyczna ilosc szumu w puli losowej jest wowczas ponizej ilosci szacowanej. Aby przeciwdzialac temu efektowi, pomocne jest zapamietywanie informacji o puli losowej pomiedzy kolejnymi uruchomieniami systemu. Aby dzialo sie to automatycznie, nalezy dodac wiersze do stosownych skryptow startowych Linuksa: echo "Inicjowanie generatora liczb losowych..." random_seed=/var/run/random-seed # Przechowanie wartosci losowej od jednego startu systemu # do kolejnego startu. Ladowanie oraz pozniejsze zachowywanie # calej puli losowej. if [ -f $random_seed ]; then cat $random_seed >/dev/urandom else touch $random_seed fi chmod 600 $random_seed poolfile=/proc/sys/kernel/random/poolsize [ -r $poolfile ] && bits=$(cat $poolfile) || bits=4096 bytes=$(expr $bits / 8) dd if=/dev/urandom of=$random_seed count=1 bs=$bytes Trzeba rowniez dodac nastepujace wiersze do stosownego skryptu uruchamianego podczas zamykania systemu Linuksa: # Przechowanie losowych danych pomiedzy wylaczeniem a wlaczeniem # komputera. Zachowywanie puli losowej generatora. echo "Zachowywanie puli losowej..." random_seed=/var/run/random-seed touch $random_seed chmod 600 $random_seed poolfile=/proc/sys/kernel/random/poolsize [ -r $poolfile ] && bits=$(cat $poolfile) || bits=4096 bytes=$(expr $bits / 8) dd if=/dev/urandom of=$random_seed count=1 bs=$bytes W powyzszych przykladach zakladamy, ze Linux jest w wersji 2.6.0 lub nowszej, gdzie /proc/sys/kernel/random/poolsize zwraca rozmiar puli entropii w bitach (zob. nizej). Interfejsy /proc Pliki w katalogu /proc/sys/kernel/random (obecnym od Linuksa 2.3.16) udostepniaja dodatkowe informacje o urzadzeniu /dev/random: entropy_avail Plik z prawami tylko do odczytu, dostarcza dostepna entropie, w bitach. Bedzie to wielkosc w zakresie od 0 do 4096. poolsize Plik zawiera rozmiar puli losowej. Format tego pliku zalezy od wersji jadra: Linux 2.4: Plik podaje rozmiar puli losowej w bajtach. Zazwyczaj - 512 (bajtow). Plik jest zapisywalny i moze byc zmieniony na dowolna wartosc, dla ktorej dostepny jest algorytm. Obecnie mozliwe wartosci to: 32, 64, 128, 256, 512, 1024 lub 2048. Linux 2.6 i pozniejsze: Plik jest dostepny tylko do odczytu i podaje rozmiar puli losowej w bitach. Zawiera wartosc 4096. read_wakeup_threshold Plik zawiera liczbe bitow entropii wymaganej do obudzenia procesu, ktory zasnal w oczekiwaniu na entropie z urzadzenia /dev/random. Domyslna wartosc do 64. write_wakeup_threshold Plik zawiera liczbe bitow entropii ponizej ktorej zostanie uspiony proces, ktory wykona select(2) lub poll(2), aby otworzyc do zapisu urzadzenie /dev/random. Wartosci te moga byc zmienione przez zapis do tych plikow. uuid i boot_id Pliki te zawieraja losowe lancuchy znakow, takie jak 6fd5a44b-35f4-4ad4-a9b9-6b9be13e1fe9. Pierwszy z tych plikow jest generowany na nowo przy kazdym odczycie, a drugi jest generowany tylko raz. Interfejs ioctl(2) Nastepujace zadania ioctl(2) sa zdefiniowane na deskryptorach plikow polaczonych z /dev/random lub /dev/urandom. Wszystkie przeprowadzone zadania wplywaja na wejsciowa pule entropii zarowno /dev/random jak i /dev/urandom. Mozliwosc CAP_SYS_ADMIN jest wymagana przez wszystkie zadania za wyjatkiem RNDGETENTCNT. RNDGETENTCNT Zbiera wartosc entropii z puli wejsciowej, zawartosc bedzie taka sama jak pliku entropy_avail w katalogu proc. Wyniki zostana przechowane w liczbie calkowitej wskazanej przez argument. RNDADDTOENTCNT Zwieksza lub zmniejsza wartosc entropii z puli wejsciowej o wartosc wskazana przez argument. RNDGETPOOL Usuniete w Linuksie 2.6.9 RNDADDENTROPY Dodaje dodatkowa entropie do puli wejsciowej, zwiekszajac wartosc entropii. Rozni sie to od zapisu do /dev/random lub /dev/urandom, ktore dodaje pewne dane, lecz nie zwieksza wartosci entropii. Uzywana jest ponizsza struktura: struct rand_pool_info { int wartosc_entropii; int wiel_buf; __u32 buf[0]; }; Wartosc_entropii to wartosc dodawana (lub odejmowana) od wartosci losowej, buf to bufor o wielkosci wiel_buf dodawany do puli losowej. RNDZAPENTCNT RNDCLEARPOOL Zeruje wielkosc entropii we wszystkich pulach i dodaje do nich pewne dane systemowe (np. rzeczywisty czas trwania - tzw. wall clock). PLIKI /dev/random /dev/urandom UWAGI Przeglad i porownanie roznych interfejsow do pozyskiwania losowosci znajduje sie w podreczniku random(7). USTERKI Podczas wczesnej fazy rozruchu, /dev/urandom moze zwrocic dane jeszcze przed zainicjowaniem puli losowej. ZOBACZ TAKZE mknod(1), getrandom(2), random(7) RFC 1750, ,,Randomness Recommendations for Security" TLUMACZENIE Autorami polskiego tlumaczenia niniejszej strony podrecznika sa: Pawel Olszewski , Robert Luberda i Michal Kulach Niniejsze tlumaczenie jest wolna dokumentacja. Blizsze informacje o warunkach licencji mozna uzyskac zapoznajac sie z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje sie ZADNEJ ODPOWIEDZIALNOSCI. Bledy w tlumaczeniu strony podrecznika prosimy zglaszac na adres listy dyskusyjnej . Linux man-pages 6.06 31 pazdziernika 2023 r. random(4)