Czy VPN może wyczerpać entropię? Co naprawdę pokazuje entropy_avail
Zacięcie przy starcie i wolny ustanowiony tunel to dwie różne usterki. Przeczytaj etap, prawdziwe znaczenie licznika i kolejkę, zanim obwinisz losowość.
Wyczerpanie losowości jądra to atrakcyjne wyjaśnienie wolnego VPN-a i prawie zawsze niewłaściwe dla objawu, który zgłaszają ludzie. Host czekający na losowe wyjście zatrzymuje się w określonym momencie, zwykle wcześnie podczas rozruchu lub podczas obsługi kluczy. Tunel, który łączy się szybko, a potem przesyła wolno opisuje raczej przepustowość. Rozdziel te dwa spostrzeżenia, zanim zainstalujesz demona, aby naprawić liczbę, której jeszcze nie doczytałeś.
Dlaczego mit przetrwa
Oba problemy są prawdziwe i z daleka wyglądają podobnie. Zawieszenia startu na świeżo uruchomionej maszynie wirtualnej naprawdę się zdarzają, a wolny ustanowiony tunel jest równie realny. Błąd polega na założeniu, że drugi wynika z pierwszego, bo kryptografia pojawia się gdzieś w obu historiach. Nic w słowie szyfrowanie nie sugeruje, że każdy przesłany bajt zużywa świeży bajt szumu otoczenia.
Te generatory tak nie działają. Biblioteka kryptograficzna trzyma generator z ziarnem i czerpie z niego wyjście, dosiewając według własnej polityki, więc kosztownym momentem jest zasiewanie, a nie stały transfer.
Co generator robi na pakiet
W OpenSSL 3 domyślna hierarchia generatorów jest budowana z instancji DRBG, które zasiewają i dosiewają zgodnie z konfiguracją i stanem. W OpenVPN 2.6 ścieżka danych AEAD wyprowadza nonce z numeru sekwencyjnego pakietu w połączeniu z niejawną wartością na sesję, podczas gdy starsza ścieżka CBC pobiera pseudolosowy IV na pakiet. Żaden z tych wzorców nie wspiera reguły, że przeniesienie gigabajta zużywa gigabajt świeżego szumu jądra. Oba wspierają myśl, że generowanie kluczy i uściski dłoni to miejsce, w którym zasiewanie ma znaczenie.
Przypadek CBC warto nazwać, bo wygląda jak mit i nim nie jest: jego IV na pakiet pochodzi z generatora biblioteki według własnego harmonogramu dosiewania biblioteki, nigdy z wywołania jądra na pakiet. Gdy ktoś cytuje koszt entropii na bajt, zapytaj, którą wersję biblioteki i którą ścieżkę kodu zmierzono.
Gdzie czekanie naprawdę widać
Umieść znaczniki czasu wokół etapów, a nie wokół sesji: start, uwierzytelnianie, zmiana klucza i transfer. Czekanie przed tym, jak tunel stanie się użyteczny, to inna skarga niż niska stała szybkość, i tylko jedna z nich wskazuje na losowość. W Linuksie zwykłe żądanie getrandom() może się zablokować, dopóki źródło losowości jądra nie zostanie zainicjalizowane, dlatego wersja startowa tego problemu jest realna na maszynach wirtualnych i płytach wbudowanych, które na początku mają mało czym karmić pulę.
| Etap | Co uruchomić | Odczyt oznaczający czekanie | Odczyt oznaczający przepustowość |
|---|---|---|---|
| Start, przed jakimkolwiek tunelem | systemd-analyze critical-chain | jednostka, która siedzi sekundami, zanim tunel wystartuje | nie dotyczy, jeszcze nic nie jest przesyłane |
| Uścisk dłoni | journalctl -u openvpn-server@server -b | długa luka, zanim sekwencja inicjalizacji się zakończy | nie dotyczy, tunel nie jest podniesiony |
| Ustanowiony transfer | ss -tin obok sar -n DEV 1 | zablokowany proces z pustymi kolejkami gniazd | pełne kolejki, retransmisje i jeden zajęty wątek |
Dwie tanie komendy należą na początek tego zbioru i rozstrzygają łatwe pytania, zanim tabela w ogóle będzie potrzebna. Licznik, który czytają, to księgowość entropii, a nie miernik przepustowości, i jeden zrzut nie pokaże, że proces jest zablokowany, jak długo czekał ani którego interfejsu używają jego wywołania biblioteczne. Próbka pobrana po odzyskaniu zwykle całkowicie pomija zacięcie, więc trzymaj wersję jądra obok odczytu.
cat /proc/sys/kernel/random/entropy_avail
uname -rDopasuj poprawkę do odczytu
Jeśli jądro naprawdę czeka na inicjalizację, patrz na obsługiwaną przez platformę ścieżkę zasiewania, a nie na tunel. Maszynie wirtualnej można dać losowe urządzenie dostarczone przez hosta, na przykład virtio-rng, a przygotowanie obrazu ma znaczenie, bo ziarno skopiowane bez zmian do wielu gości nie jest niezależną inicjalizacją. Jeśli biblioteka zgłasza błędy zasiewania po starcie, zbadaj jej skonfigurowane źródło i zachowanie dostawcy, zamiast zmieniać ustawienia jądra.
ss -tin dst 203.0.113.7
sar -n DEV 1 5Dokumentacja generatora OpenSSL opisuje, jak ta hierarchia pozyskuje dane wejściowe i kiedy następuje dosiewanie, co jest znacznie węższym twierdzeniem niż mit i obowiązuje tylko dla tej implementacji. Demon entropii nie jest uniwersalną naprawą szybkości, a jego instalowanie, aby licznik rósł, zmienia założenie bezpieczeństwa bez wykazania opóźnienia. W przypadku przepustowości podążaj ścieżką danych: jeden wysycony wątek, retransmisje, utrata zewnętrzna i odrzucenia kolejek wymagają każdy innej poprawki, a rozmiary buforów adresują buforowanie gniazd z własnym dowodem z kolejek.